"Sistema operativo" por Li Zhijun | Experimento 8 - Control de dispositivos terminales

Tabla de contenido

1. Propósito del experimento

2. Contenido experimental 

3. Preparación del experimento

1. Procesamiento de entrada de teclado

2. Control de caracteres de salida

4. Proceso experimental

1. Agregue el procesamiento de la función de teclado F12

2. Agregue el procesamiento de visualización de * caracteres

3. Vuelva a compilar el kernel 

4. Ejecutar Linux 0.11 

5. Informe del experimento 


1. Propósito del experimento

1. Profundice la comprensión de los principios básicos de la administración de dispositivos del sistema operativo y practique conceptos como las interrupciones del teclado y los códigos de escaneo.

2. Domine el proceso de procesamiento de Linux 0.11 para terminales de teclado y terminales de monitor a través de la práctica.

 

2. Contenido experimental 

       El contenido básico de este experimento es modificar el código de procesamiento del dispositivo terminal de Linux 0.11 para controlar la entrada del teclado y la visualización de caracteres de una manera no convencional.

       Estado inicial, todo funciona como de costumbre. Después de que el usuario presione F12 una vez, reemplace todas las letras que la aplicación envía al terminal con  . El usuario presiona F12 nuevamente y vuelve a la normalidad. Presione F12 por tercera vez para volver a reemplazar la salida. Y así sucesivamente después de eso.

 

Tome el comando ls como ejemplo

Normalmente escriba ls:

# ls
hello.c hello.o hello

Primero presione F12, luego escriba ls:

# **
*****.* *****.* *****

Presione F12 por segunda vez, luego escriba ls:

# ls
hello.c hello.o hello

Presione F12 por tercera vez, luego escriba ls:

# **
*****.* *****.* *****

 

【Consejos para experimentos】

Este experimento necesita modificar el código de procesamiento del dispositivo terminal ( archivo) de Linux 0.11 y realizar un control no convencional en la entrada del teclado y la visualización de caracteres.   kernel/chr_drv/console.c 

 

3. Preparación del experimento

1. Procesamiento de entrada de teclado

La E/S del teclado generalmente está impulsada por interrupciones, en el archivo: kernel/chr_drv/console.c 

void con_init(void)  //控制台的初始化
{
    // 键盘中断响应函数设为 keyboard_interrupt
    set_trap_gate(0x21, &keyboard_interrupt);
}

La función se llamará cada vez que una pulsación de tecla tenga una acción keyboard_interrupt , y se  kernel/chr_drv/keyboard.S implementará en el archivo (tenga en cuenta que la extensión es una S mayúscula).

Todas las funciones relacionadas con la entrada del teclado se implementan en este archivo, por lo que algunas funciones de este experimento también se pueden implementar en este archivo.

En pocas palabras, keyboard_interrupt después de ser llamado, el código de escaneo del teclado se usará como un subíndice y luego  key_table se llamará a la función de respuesta correspondiente a la tecla almacenada en la matriz.

 

2. Control de caracteres de salida

printf() La función de salida final llama  write() a la llamada del sistema, por lo que si la controla bien  write(), puede controlar los caracteres de salida.

 

4. Proceso experimental

Se recomienda leer este artículo para comprender la idea del experimento, que está escrito en detalle: Experimento del sistema operativo Control de dispositivo de 7 terminales

 

1. Agregue el procesamiento de la función de teclado F12

(1) Modifique kernel/chr_drv/tty_io.c el archivo y agregue el código al final del archivo:

int switch_show_char_flag = 0;
void press_f12_handle(void)
{
	if (switch_show_char_flag == 0)
	{
		switch_show_char_flag = 1;
	}
	else if (switch_show_char_flag == 1)
	{
		switch_show_char_flag = 0;
	}
}

 

  

(2) Modifique include/linux/tty.h el archivo y agregue el código al final del archivo:

extern int switch_show_char_flag;
void press_f12_handle(void);

 

  

(3) Modifique kernel/chr_drv/keyboard.S el archivo, comente la función en la línea 525 func y reemplácela con  press_f12_handle :

/* .long func,none,none,none		58-5B f12 ? ? ? */
.long press_f12_handle,none,none,none

 

2. Agregue  el procesamiento de visualización de *   caracteres

Modifique kernel/chr_drv/console.c el archivo y modifique la función en él con_write :

void con_write(struct tty_struct * tty)
{
    ……

    case 0:
	        if (c>31 && c<127) {
		            if (x>=video_num_columns) {
			    			x -= video_num_columns;
				    		pos -= video_size_row;
					    	lf();
				    }

                    /* 添加开始 */
  				    if (switch_show_char_flag == 1)
  				    {
  					        if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9'))
  				                c = '*';
  				    }
                    /* 添加结束 */
		
			        __asm__("movb attr,%%ah\n\t"
					    	"movw %%ax,%1\n\t"
						    ::"a" (c),"m" (*(short *)pos)
						    );
					pos += 2;
					x++;

    ……

}

 

El código anterior es para procesar los caracteres uno por uno a través del ciclo while y luego colocarlos en la memoria de video.

Por lo tanto, se puede realizar un filtro antes de que los caracteres se coloquen en la memoria de video F12_flag == 1 y todos los caracteres se conviertan en en ese momento .

3. Vuelva a compilar el kernel 

// linux-0.11 目录下
make all

4. Ejecutar Linux 0.11 

Ingrese a Linux 0.11, los resultados de la prueba son los siguientes:

 

5. Informe del experimento 

1. En el código original, presione F12, después de que responda la interrupción, la rutina de servicio de interrupción llamará a func? ¿Qué función realiza?

[Respuesta] Después de presionar F12, la función func realiza el escape de F12 en una secuencia de caracteres de escape [ [ L . (El procesamiento de F1 ~ F12 es similar a [ [ A ~ [ [ L)

 

2. En su implementación, ¿también filtra la salida de caracteres al archivo? En caso afirmativo, ¿cómo se pueden filtrar solo los caracteres que se envían al terminal? Si no, ¿cómo podemos filtrar también la salida de caracteres al archivo?

[Respuesta] Este experimento no filtra la salida de caracteres al archivo, sino que solo filtra la salida de caracteres al terminal, lo cual se con_write realiza modificando la función. Si desea filtrar la salida de caracteres al archivo, debe modificar file_write la función para lograrlo.

Para modificaciones específicas, consulte:

while (c–>0)
{
    tmp = get_fs_byte(buf++);
    if(f12_flag == 1)
    {
        if((tmp>='A'&&tmp<='Z')||(tmp>='a'&&tmp<='z')||(tmp>='0'&&tmp<='9'))
            tmp = '*';
    }
    *(p++) = tmp;
}

Supongo que te gusta

Origin blog.csdn.net/Amentos/article/details/131437744
Recomendado
Clasificación