La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Arquitectura de PCs Programación de periféricos. Introducción Función de E/S: acceso a un dispositivo periférico por la interfaz de la CPU al dispositivo.

Presentaciones similares


Presentación del tema: "Arquitectura de PCs Programación de periféricos. Introducción Función de E/S: acceso a un dispositivo periférico por la interfaz de la CPU al dispositivo."— Transcripción de la presentación:

1 Arquitectura de PCs Programación de periféricos

2 Introducción Función de E/S: acceso a un dispositivo periférico por la interfaz de la CPU al dispositivo “Programa de E/S” o “manejador de dispositivo”: programa que realiza la función de E/S Existe un manejador de dispositivo por cada tipo de dispositivo. Por ej.: manejador de disquete y de disco manejador de teclado manejador de video

3 Principios programación E/S Programas de E/S (BIOS) Núcleo SO (DOS) Programas de usuario Interfaz independiente del dispositivo Interfaz a manejadores de dispositivo Interfaz de CPU a dispositivos Dispositivos periféricos Programas de E/S en el contexto de un SO Direcciones de registros del controlador de dispositivo Secuencia de comandos y lectura de registros del controlador Sistema de archivos, manejo de memoria, consola Pedidos abstractos

4 Principios programación E/S El manejador del dispositivo es la única parte del sistema que accede a la interfaz del dispositivo En general, el manejador de dispositivo tiene dos partes: Programa que implementa la interfaz a las capas superiores Rutina de atención a la interrupción del dispositivo Generalidades del manejador de dispositivo

5 Principios programación E/S CONTROLADOR DE TECLADO CPU IRQ1 00000H FFFFFH F0000H F6000H 00024H FO00:5000H ROM BIOS TABLA INT VEC 9H F5000H Atención IRQ1 Servicio 16h WRITE READ Programa principal: MOV AH,0 INT 16H PUSH AX Bucle hasta que (WRITE != READ) ES 60H 19H 19H – ‘p’ IRET Sube o baja? ¿SHIFT? BUFFER CIRCULAR... IRET WRITE READ...AX=19H’p’... FO00:6000H 00058H Ejemplo: manejador BIOS de teclado

6 Principios programación E/S Operaciones: Traducir pedido abstracto en secuencia de mandos al controlador de dispositivo Ejecuta mandos al controlador de dispositivo Secuencia general de función de E/S Bloqueo hasta interrupción Verificación y tratamiento de errores Devolución de datos al programa que ejecutó pedido Los errores se procesan tan cerca del hardware como es posible Si el controlador encuentra error, intenta la corrección por sí mismo Si el controlador no puede, pasa error a manejador: errores transitorios se resuelven repitiendo operación Si el manejador no puede notifica a las capas superiores

7 Interrupciones SISTEMA DE INTERRUPCIONES DE HARDWARE

8 Interrupciones: secuencia Secuencia de interrupción hardware: D15.. D0 INTR INTA Controlador de interrupciones programable (PIC) IRQ0 IRQ1 IRQ15 IRQ14 Controlador de disco IRQ14 CPU Ejecuta rutina de atención a la interrupción IRQ14

9 Interrupciones: arquitectura Arquitectura detallada: D15.. D0 INTR IRQ8 IRQ9 CPU IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 PIC ESCLAVO (chip 8259) – INT 70h.. 77h PIC MAESTRO (chip 8259) – INT 08h.. 0Fh INT RELOJ TECLADO DISCO DURO XT DISQUETE DISCO DURO AT INTA ACK 08h 76h

10 Interrupciones: detalle Secuencia detallada IRQ1 D15.. D0 INTR CPU IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 PIC INT CONTROLADOR DE TECLADO INTA ACK 09h E/S 0020H E/S 0021H Máscara Habilitación IRQ 10000000 01234567 0 0 0 0 0 0 0 Registro de rutina atendida Habilitada 0 0 0 0 0 0 0 0 0 Registro de solicitud de interrupción 110 Si IF=1 push psw push cs push pc cli 0 (4) IRET E/S 0060H Registro de datos (3) Reconocimiento de interrupción al controlador de teclado 0020H Comando EOI (4) (1) Cambia contexto (5) Restaura contexto (6) IRET

11 Interrupciones: rutinas Atención a interrupción de PIC maestro: irqxx: call save... mov al, 020H out 020H, al call restore iret Cambio de contexto Tareas específicas Confirmación a controlador de dispositivo EOI a PIC maestro Restaura contexto Termina Restaura bandera IF a valor previo a interrupción (no es necesario sti)

12 Interrupciones: rutinas Atención a interrupción de PIC esclavo: irqxx: call save... mov al, 020H out 020H, al out 0A0H, al call restore iret Cambio de contexto Tareas específicas Confirmación a controlador de dispositivo EOI a PIC maestro EOI a PIC esclavo Restaura contexto Termina

13 Teclado PROGRAMACION DEL SISTEMA DE TECLADO

14 Teclado: conceptos básicos Bajada tecla “P” en AT: CONTROLADOR DE TECLADO P Línea serie Kscan a Scan de sistema 4DH ES 063H 19H CPU IRQ1 ES 062H ES 061H ES 060H

15 Teclado: conceptos básicos Subida tecla “P” en AT: CONTROLADOR DE TECLADO P Línea serie Kscan a Scan de sistema F0H 4DH ES 063H CPU IRQ1 ES 062H ES 061H ES 060H Subida 99H 19H + 80H Subida

16 Manejador de teclado El manejador de teclado registra entradas de teclado y las pasa a programas que leen el teclado Combinaciones de teclas con significado específico: CTRL-ALT-DEL: reinicia el sistema Alt-Keypad: convierte hasta 3 dígitos de panel numérico en número hexadecimal y lo inserta en buffer circular Teclas tipo “Shift”: mantiene estado de teclas tipo “Shift” (Ctrl, Alt, Shift, Insert, Caps Lock, Num Lock, Scroll Lock) Dos partes: Programa que implementa interfaz a capas superiores Rutina de atención a la interrupción del teclado Función básica

17 CPU CONTROLADOR DE TECLADO P 19H ES 060H IRQ1 Atención a la interrupción de teclado (PIC maestro): Confirma interrupción a controlador de teclado Cambia contexto Comando EOI a PIC Restaura contexto y termina Traduce a ASCII según ALT y SHIFT, y salva par ASCII-código de tecla en buffer circular pusha push ds mov ax,cs mov ds,ax mov [lds_low],bx pop bx mov [lds_low+2],bx in al,60h mov [keycode],al mov al,20h out 20h,al popa lds bx,[lds_low] iret Manejador de teclado Operación: interrupción por bajada

18 CPU CONTROLADOR DE TECLADO P 99H ES 060H IRQ1 Atención a la interrupción de teclado (PIC maestro): Confirma interrupción a controlador de teclado Cambia contexto Comando EOI a PIC Restaura contexto y termina Actualiza estado SHIFT No Si ¿Tecla SHIFT? Operación: interrupción por subida Manejador de teclado

19 “ Keybhook.asm” instala rutina (residente) de atención a IRQ1 Rutina activa desde que vector de interrupción 82h = 1 hasta que se oprime tecla F5 Si está activa, almacena el códigos scan en posición “int_contador” de buffer lineal “code_buf” e incrementa “int_contador” Manejador de teclado Ejemplo con funciones básicas

20 Operación 00000H DOS 01000H INI_MEM 09000H 09000H 09100H FFFFFH C:\> KEYBHOOK.COM PSP Keybhook C:\> Segmento previo: F000 Offset previo: 01E0 Segmento contador: 0900 Offset contador: 010B 00024H VEC 9H %include “hook.inc” segment code resb 100h..start: IRQHOOK_ENABLE_MACRO ret push ds xor ax,ax mov ds,ax mov ax,1 mov [208],ax pop ds INI_MEM 091F6H C:\> - d 0900:010B L2 debug AB C F5 D 0900:0100 0A 00 9C 1E 9E 0900:0110 30 B0 2E AE 20 A0 3F contador Enter irqson 0000:0000H 00208H VEC 82H 0000:0001H FOO0:01EOH0900:0173H0000:0000H Manejador de teclado Ejemplo con funciones básicas

21 Interrupción keybhook.asm Confirma interrupción a controlador de teclado Cambia contexto Comando EOI a PIC Restaura contexto y termina Carga keycode en buffer e incrementa contador No Si ¿Está activa? ¿keycode = bajada F5? Si Deshabilita rutina Restaura contexto y pasa control a vector previo (BIOS) in al,60h mov [keycode],al GET_IRQHOOKENABLE_MACRO cmp 0,al je continue mov al,[keycode] mov bx,code_buf add bx,[int_contador] mov [bx],al inc word [int_contador] cmp al,F5_KEY IRQHOOK_DISABLE_MACRO mov al,20h out 20h,al popa lds bx,[lds_low] iret popa push word [irq1_prev+2] push word [irq1_prev] retf Manejador de teclado Ejemplo con funciones básicas pusha push ds mov ax,cs mov ds,ax mov [lds_low],bx pop bx mov [lds_low+2],bx No

22 Video PROGRAMACION DEL SISTEMA VIDEO

23 Video: conceptos básicos La pantalla se compone de 80 x 25 celdas Cada celda se corresponde con dos bytes en RAM de video Correspondencia RAM video – pantalla para controlador CGA: 00000H FFFFFH B8000H B809FH B80A0H B813FH B8F00H B8F9FH L1 L2 L25 4000 bytes 20H 07H 20H 07H C1 C2 C80 20H 07H 20H 07H 20H 07H C1C2C3C80 L1 L2 L25 41H ‘A’ A 42H ‘B’ B 33H ‘3’ 3 31H ‘1’ 1 32H ‘2’ 2 C1 C2 C80 B8000H B809FH B8F00H B8F9FH

24 00000H FFFFFH B8000H B80A0H B8F00H 16000 bytes C1C2C3C80 L1 L2 L25 01 02 03 04 05 06 07 08 09B8140H 73 74 75 76 77 78 79 80 81 82 83 84 BC000H B8FA0H B9040H B90E0H Controlador de video Origen L3 70 71 72B8E60H L24 0000H 01 02 03 04 05 06 07 08 09 73 74 75 70 71 72 04 05 06 07 08 09 10 11 12 76 77 78 73 74 75 0050H 07 08 09 10 11 12 13 14 15 79 80 81 76 77 78 00A0H 0000H 0050H 0780H 00A0H 07D0H 0820H 0870H 0730H Controlador considera las posiciones en RAM de video en unidades de palabra Video: conceptos básicos Un registro del controlador contiene el origen de la pantalla en la RAM de video Controlador despliega 2000 (1000) caracteres desde el origen, esto es, 4000 (2000) bytes en RAM de video

25 00000H FFFFFH B8000H B80A0H B8F00H 16000 bytes C1C2C3C80 L1 L2 L25 01 02 03 04 05 06 07 08 09B8140H 73 74 75 76 77 78 79 80 81 82 83 84 BC000H B8FA0H B9040H B90E0H Controlador de video Origen L3 70 71 72B8E60H L24 0000H 04 05 06 07 08 09 73 74 75 70 71 72 0000H 0050H 0780H 00A0H 07D0H 0820H 0870H 0730H Controlador considera las posiciones en RAM de video en unidades de palabra Cursor 0000H 01 02 03_ _ 0001H0002H 01 02 03 _ Video: conceptos básicos Un registro del controlador contiene la posición del cursor en la RAM de video

26 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 Cursor H Cursor L Origen H Origen L CONTROLADOR CGA DATA INDEX E/S 03D4H E/S 03D5H 1 byte Por ej. Origen = 0820H 08H 12 08H 13 20H Video: conceptos básicos Acceso a los registros del controlador de video: indirecto, por registros INDEX y DATA CPU

27 El manejador de video escribe datos de programas en memoria video Operaciones: Actualiza posición de escritura tras recepción de carácter (incluye caracteres especiales, por ej. retorno carro, fin de línea, suprimir, etc.) Desplaza la pantalla Actualiza la posición del cursor (posición de próxima escritura) Páginas independientes Manejador de video Función básica

28 Manejador de video Páginas Una pantalla requiere: 2kB si resolución 40x25, 4kB si resolución 80x25 00000H FFFFFH B8000H Página 0 4kB B9000H Página 1 4kB BA000H BB000H BC000H Página 2 Página 3 4kB 00000H FFFFFH B8000H Página 0 2kB B9000H BA000H BB000H BC000H Página 1 Página 2 Página 3 Página 4 Página 5 Página 6 Página 7 2kB B8800H B9800H BA800H BB800H Modos de 40x25Modos de 80x25 RAM de video de CGA de 16kB se divide en imágenes de pantalla: “páginas” “Página activa” es la página desplegada en pantalla Manejador de video mantiene hasta 4 páginas de video, con las variables: p_inicio p_limite p_origen p_cursor p_fila p_columna Offset del inicio de la memoria asignada a la página en RAM de video, en unidades de palabra Límite de la memoria asignada a la página en RAM de video, en unidades de palabra Offset del origen del barrido de la página en RAM de video, en unidades de palabra Offset del cursor de la página en RAM de video, en unidades de palabra Fila del cursor en la pantalla (0 arriba, 0..24) Columna del cursor en la pantalla (0 a la izquierda, 0..79) Se escriben a controlador tras actualizar

29 0000H RAM de video Página activa: 0 p_inicio p_limite p_origen p_cursor p_fila p_columna 0000H 0FFFH 0000H 00 p_inicio p_limite p_origen p_cursor p_fila p_columna 1000H 1FFFH 1000H 00 1000H 1FFFH 0 0 1 23 79 00CRLF02Supr1 Entrada: Espacios en blanco en verde 00 02 24 25 0 0050H 0730H 0780H 07D0H 24CRLF25 0 02 24 0001H 01 0 1 2 02 0002H0000H 00 01 0050H 24 1 0051H 01 0052H 02 2 0051H 01 1 1 0052H 02 23 23CRLF 23 24 0780H 00 0781H 01 0050H 02 0782H0780H 00 07D0H 01 02 24 07D1H 01 25 07D2H 02 Manejador de video Ejemplo: 2 páginas (0 y 1); manejo de caracteres y desplazamiento hardware Cada vez que cambia p_cursor o p_origen de la página activa se actualizan los registros correspondientes del controlador

30 Espacios en blanco en verde 0000H RAM de video Página activa: 0 p_inicio p_limite p_origen p_cursor p_fila p_columna 0000H 0FFFH 0000H 00 p_inicio p_limite p_origen p_cursor p_fila p_columna 1000H 1FFFH 1000H 00 1000H 1FFFH 0 0 1 23 79 00CRLF02Supr1 Entrada: 00 02 24 25 0 0050H 0730H 0780H 07D0H 24CRLF25 0 02 24 0001H 01 0 1 2 02 0002H0000H 00 01 0050H 24 1 0051H 01 0052H 02 2 0051H 01 1 1 0052H 02 23CRLF 23 24 0FA0H 00 0FA1H 01 0870H 02 0FA2H0FA0H 00 0FF0H 01 02 24 0FF1H 01 25 0FA2H 02 0FA0H 50 26 27 49 50 27 26 0820H 0870H 50CRLF 0FA0H 00 50 27 28 27 0000H 0780H 27 28 50 Manejador de video Desplazamiento por software

31 Existen dos filosofías de procesamiento de la entrada: Manejador de video Modos de procesamiento de entrada Orientado a carácter: cada carácter que se recibe se procesa y se actualiza la memoria de video Orientado a línea: cada carácter que se recibe se salva en una cola de caracteres en memoria. Cada vez que se completa una línea se copia la cola a la memoria de video Entrada: 0002Supr1 0 0 1 7912 _0 _0 0 _0 0 0 _0 0 0 2 _0 0 0 _0 0 0 1 _ CRLF _ Entrada: 0002Supr1 CRLF RAMQUEUE: 0 1 _ _ 0123456789 ‘0’07‘0’07‘0’07‘2’07‘1’07 0 0 0 1

32 Manejador de video Ejemplo con funciones básicas Inicialización: determino puerto de video de variable del BIOS Considera una sola página, en modo orientado a línea: activa la página, borra la pantalla, escribe secuencia de prueba y termina ¿Controlador CGA? No Si push ds xor ax,ax mov ds,ax mov ax,[463h] pop ds mov [vid_port],ax DS = 0 (segmento BIOS) ax = 0000:0463h (var. BIOS) Restauro segmento original [vid_port] = AX mov ax,[vid_port] cmp ax,03D4h jnz vid_nocolor Inicializa valores CGAInicializa valores MN mov [vid_seg],0B800h mov ax,4000h shr ax,1 mov [vid_size],ax sub ax,1 mov [vid_mask],ax Segmento RAM video CGA Tamaño RAM video CGA (bytes) Tamaño RAM video (palabras) Offset última pos RAM video Inicializa página Activa página Borra pantalla Secuencia de prueba Termina ax = 0 Palabras en RAMQUEUE Fila de cursor Columna de cursor Pos de cursor en RAM Inicio memoria Origen barrido Fin memoria Atributo defecto = 07 (blanco sobre negro) xor ax,ax mov [c_rwords],ax mov [c_row],ax mov [c_column],ax mov [c_cur],ax mov [c_start],ax mov [c_org],ax add ax,[vid_size] mov [c_limit],ax mov word [c_attr],0700h mov word [c_blank],0700h mov ax,VID_ORG mov bx,[c_org] call set_6845 mov ax,CURSOR Mov bx,[c_cur] call set_6845 INDEX = VID_ORG DATA = [c_org] Reg INDEX =DATA INDEX = CURSOR DATA = [c_cur] Reg INDEX =DATA mov ax,BLANK_MEM mov bx,[c_start] mov cx,scr_size call mem_vid_copy Indica borrado a mem_vid_copy Pos. inicio de borrado Borra scr_size caracteres Restaura origen de video a inicio de RAM de video Devuelve control a DOS (función DOS 4Ch)

33 Ejemplo Inicialización Secuencia de prueba Decrementa cuenta ¿Cuenta = 0? No loop loop_prueba Termina Manejador de video Salva cuenta y entero loop_prueba: push cx push ax Imprime siguiente entero call print_int_local push print_nl_local Imprime entero AX, formato hex Imprime fin de línea Restaura entero y cuenta pop ax pop cx Incrementa entero inc ax Si mov cx,40 mov ax,0 cx = cantidad de líneas a imprimir ax = siguiente entero a imprimir ax = ax.15 ax.14 ax.13 ax.12 ax = TablaChars[ax] call outchar ax = ax.11 ax.10 ax.9 ax.8 ax = TablaChars[ax] TablaChars DB ‘0’,’1’,’2’,’3’,’4’,’5’, ’6’,’7’,’8’,’9’,’A’,’B’, ‘C’,’D’,’E’,’F’ Procesa carácter AL call outcharProcesa carácter AL

34 Respalda carácter Función outchar No Manejador de video xor ah,ah cmp ax,0dh mov [p_outchar_1],al ¿Carácter = Fin de línea?¿c_row = scr_lines–1? Si cmp word [c_row],scr_lines-1 No Descarga cola y desplaza arriba Descarga cola Termina call scroll_screen_up Incrementa [c_row] call flushRAMQUEUE->video ¿Carácter = Retorno de carro? cmp ax,0ah Si [c_column] = 0 inc word [c_row] move word [c_column],0 Descarga cola call flush Termina ¿ [c_column] < scr_width ? No Si cmp word [c_column],scr_width [c_column] = 0 ¿c_row = scr_lines–1? Si cmp word [c_row],scr_lines-1 No Descarga cola y desplaza arriba Descarga cola call scroll_screen_up Inc [c_row] call flush inc word [c_row] Carga carácter en C_RAMQUEUE No ret mov ax,[c_rwords] shl ax,1 add ax,c_ramqueue mov bx,ax mov ax,[c_attr] mov al,[p_outchar_1] mov [bx],ax inc word [c_rwords] inc word [c_column] C_RAMQUEUE es array de words -> cada pos = 2B bx apunta a c_ramqueue[c_rwords] Carga atributo y carácter Incrementa pos en pantalla de sig.escritura Procesa carácter en AL Procesamiento de carácter

35 Descarga cola Función scroll_screen_up No Manejador de video ¿[c_org] + scr_width + scr_size < [c_limit]? Desplazamiento por software call flushRAMQUEUE->video Si Desplaza pantalla hacia arriba Desplazamiento de pantalla [c_org] = [c_org]+scr_width mov ax,[c_org] add ax,scr_width and ax,[vid_mask] mov [c_org],ax c_org+=scr_width mov ax,[c_org] add ax,scr_size add ax,scr_width cmp ax,[c_limit] scr_size = scr_width * scr_lines c_org nuevo mov ax,[c_org] add ax,scr_width mov bx,[c_start] mov cx,scr_size-scr_width call vid_vid_copy mov ax,[c_start] mov [c_org],ax src=c_org+witdh dst=c_start cx=tamaño Ejecuta copia c_org=c_start Borra última línea (L25’) mov bx,[c_org] add bx,scr_size-scr_width and bx,[vid_mask] mov ax,[c_blank] mov [blank_color],ax mov ax,BLANK_MEM mov cx,scr_width call mem_vid_copy Origen borrado Carácter copiado Indica borrado Tamaño de borrado c_org previo scr_width c_start scr_size L1 L2 L25 Escribe c_org a controlador mov ax,VID_ORG mov bx,[c_org] call set_6845 INDEX=VID_ORG DATA=[c_org] Reg.INDEX=DATA Pantalla nueva L1’ L25’ L24’ c_org previo scr_width c_start scr_size L1 L2 L25 L1’ L24’ L25’ Pantalla nueva

36 Función flush No Manejador de video ¿ [c_rwords] > 0 ? Si Copia datos de c_ramqueue a posición [c_cur] de la memoria de video Carga de c_ramqueue a la pantalla Carga c_ramqueue a memoria de video mov ax,c_ramqueue mov bx,[c_cur] mov cx,[c_rwords] call mem_vid_copy Origen = c_ramqueue Destino = [c_cur] [c_rwords] palabras Ejecuta copia ¿Hay datos en la cola? ¿ [c_column] < 0 ? [c_column] = 0 Si ¿ [c_column] > scr_width ? [c_column] = scr_width ¿ [c_row] < 0 ? Si No [c_row] = 0 Si ¿ [c_row] >= scr_lines ? No [c_row] = scr_lines – 1 Si ¿ [c_cur] == [c_org] + scr_width [c_row] + [c_column] ? Termina Si [c_cur] = [c_org] + scr_width [c_row] + [c_column] Escribe [c_cur] a controlador mov [c_cur],ax mov ax,CURSOR mov bx,[c_cur] call set_6845 mov ax,scr_width mul word [c_row] add ax,[c_org] add ax,[c_column] cmp ax,[c_cur] No Vacía c_ramqueue mov word [c_rwords],0

37 Función flush No Manejador de video ¿ [c_rwords] > 0 ? Copia datos de c_ramqueue a posición [c_cur] de la memoria de video Carga de c_ramqueue a la pantalla ¿Hay datos en la cola? ¿ [c_column] < 0 ? [c_column] = 0 Si ¿ [c_column] > scr_width ? [c_column] = scr_width ¿ [c_row] < 0 ? Si No [c_row] = 0 Si ¿ [c_row] >= scr_lines ? No [c_row] = scr_lines – 1 Si ¿ [c_cur] == [c_org] + scr_width [c_row] + [c_column] ? Termina [c_cur] = [c_org] + scr_width [c_row] + [c_column] Escribe [c_cur] a controlador mov [c_cur],ax mov ax,CURSOR mov bx,[c_cur] call set_6845 mov ax,scr_width mul word [c_row] add ax,[c_org] add ax,[c_column] cmp ax,[c_cur] No Carga c_ramqueue a memoria de video mov ax,c_ramqueue mov bx,[c_cur] mov cx,[c_rwords] call mem_vid_copy Origen = c_ramqueue Destino = [c_cur] [c_rwords] palabras Ejecuta copia Vacía c_ramqueue mov word [c_rwords],0 Si

38 Disquete PROGRAMACION DEL SISTEMA DISQUETE

39 Disquete: conceptos básicos Sistema físico: Cabezal lector (disquetera) Medio magnético continuo (disquete) Motor de rotación (disquetera) Desplazamiento discreto de cabezal hace que los datos se almacenen en círculos concéntricos: “pistas” Cada pista se divide en sectores: - Sectores tienen igual número de bytes - Unidad de almacenamiento del disquete - Sectores de ambos lados forman cilindro - Hueco indica comienzo de pista

40 Secuencia de lectura de sector (2, 0, 3) CPU Búsqueda C = 2 Buffer 000 001 1FF D0 D1 D1FF Registro de datos Controlador de disquete Registro de estado 0 1 2 Transferencia de datos por bus de sistema de disquete Lectura (2,0,3) Verifica C = 2 Si no hay otra transferencia por 2 seg se apaga motor Enciende motor Disquete: conceptos básicos

41 Buffer 000 001 1FF D000 D001 D1FF CONTROLADOR DE DISQUETE CPU 00000H 10000H 10200H FFFFFH Disquetera DMAC MEMORIA 0000H 01FFH Comandos de transferencia INTRIRQ6 IO/RDM/WR D000 D001 D1FF ES 0005H DRQ2 HRQHOLD HLDA ES 0004H Dirección Ch2 Cuenta Ch2 Página Ch2 ES 0081H01H TC Bus de datos Bus de direcciones Modo ES 000BH 46H Usa canal 2 DMA Escritura ch2 con incremento D000 D001 D1FF DACK2 011FF 01 01 10000H 01FEH 0001H 10001H 01FDH 0002H 0001H 01FFH 101FFH 0000H Disquete: conceptos básicos DMA

42 Formato de cada pista del disquete: Huecos Pulsos de sincronización Concatenación de sectores. Sector: Marca de referencia ID de sector (se inicia al dar formato al disquete): Cilindro “C” Cabezal “H” Sector “R” Código de tamaño “N” (2 indica 512 bytes) Datos de los sectores CRC Disquete: conceptos básicos Formato

43 Procesa comandos de lectura, escritura y formato a disquete Manejador de disquete Función

44 Inicia controlador DMA Si Enciende motor Búsqueda Transferencia ¿Cabezal sobre cilindro? ¿Búsqueda correcta? ¿Más reintentos? ¿Error en parámetros? ¿Motor encendido? Si no hay otra tranferencia por 2 seg se apaga motor Recalibrar ¿Reset? Reset Controlador No ¿Transferencia correcta? 0,5 seg ¿Error se puede corregir? Protección contra escritura Inicialización Manejador de disquete Secuencia Termina Termina con error No Si No Si NoSi - Error CRC transitorio - Búsqueda sin calibrar - Error de controlador Determina parámetros por lecturas de prueba (por ej., disquete de 1.44MB tiene 18 sectores por pista, mientras disquete 720kB tiene 9 sectores por pista)

45 Inicia controlador DMA Enciende motor Búsqueda Transferencia ¿Búsqueda correcta? Termina 1 seg Modifica vector IRQ6 Restablece vector IRQ6 Apaga motor Inicio Supone disquete 1.44MB ¿Inicio DMA correcto? Manejador de disquete Ejemplo con funciones básicas Si No Si Lectura de un sector de disquete de 1.44MB

46 Deshabilita interrupciones ¿Buffer pasa frontera de 64kB? Determina dirección física de buffer y cuenta Habilita interrupciones buffer resb 512... mov ax,buffer mov dx,cs call logic2phys mov [dma_low_addr],al mov [dma_high_addr],ah mov [dma_page_addr],dl mov ax,SECTOR_SIZE sub ax,1 mov [dma_low_ct],al mov [dma_high_ct],ah mov al,[dma_low_addr] mov ah,[dma_high_addr] add ax,SECTOR_SIZE jc dma_setup_error Inicia registros CH2 DMA Habilita controlador DMA mov al,2 out DMA_INIT,al ;DMA_INIT = 0Ah Inicialización DMA Termina Manejador de disquete Termina con error Si No mov al,DMA_READ out DMA_M2,al mov al DMA_READ out DMA_M1,al mov al,[dma_low_addr] out DMA_ADDR,al mov al,[dma_high_addr] out DMA_ADDR,al mov al,[dma_page_addr] out DMA_TOP,al mov al,[dma_low_ct] out DMA_COUNT,al mov al,[dma_high_ct] out DMA_COUNT,al DMA_READ = 46h DMA_M2=DMA_READ DMA_M1=DMA_READ DMA_ADDR=low_ad DMA_ADDR=hi_ad DMA_TOP=top_ad DMA_COUNT=low_ct DMA_COUNT=hi_ct Direcciones del controlador DMA: DMA_M2 = 0Ch, DMA_M1 = 0Bh, DMA_ADDR = 04h, DMA_TOP = 81h, DMA_COUNT = 05h

47 CONTROLADOR DE DISQUETE Registro de control de motor ES 03F2H 11 Número de dispositivo 00 Bit dispositivo 0 Bit dispositivo 1 Bit dispositivo 2Bit dispositivo 3 1000 Encendido 11000000 Apagado Manejador de disquete Encendido apagado de motor

48 RgD = comando o parámetro Inicio CONTROLADOR DE DISQUETE Registro de estado principal (RgEP) ES 03F4H ES 03F5H Registro de datos (RgD) Termina Termina con error Manejador de disquete Comandos y parámetros Si No Si No Función fdc_out push ax mov cx,100 Salva comando a la pila cx = reintentos ¿Reintentos < 100? ¿RgEP.7 AND !(RgEP.6)? mov dx,03f4h in al,dx mov bl,080h or bl,040h and al,bl cmp al,080h je exec_fdc_out loop retry_fdc_out pop ax mov ax,EXIT_ERROR ret Restaura pila pop ax mov dx,03F5h out dx,al ax = comando mov ax,EXIT_OK ret

49 Siguiente dato = RgD Inicio CONTROLADOR DE DISQUETE Registro de estado principal (RgEP) ES 03F4H ES 03F5H Registro de datos (RgD) ¿RgEP.7 AND RgEP.6 AND RgEP.4? ¿RgEP.7 AND !RgEP.6 AND !RgEP.4? ¿Nro. Resultados > 8 ? Termina con error Termina Retardo Reset del controlador ¿Retardo acumulado > 500 ms? Termina con error Manejador de disquete Lectura de resultado de operación Si No Si No Si Función fdc_results No

50 Manejador de disquete Atención a la interrupción IRQ6 Cambia contexto pushaSalva ax,bx,cx,dx,si,di,bp Activa bandera que indica interrupción a wait_interrupt mov byte [interrupt_flag],1 Comando EOI a PIC mov al,20h out 20h,al Imprime mensaje en pantalla mov ax,StringInterrupcion call print_string call print_nl Restaura contexto popaRestaura ax,bx,cx,dx,si,di,bp Termina iret

51 Inicio Termina Termina con error Manejador de disquete Espera de la interrupción Si No Si No Función wait_interrupt push cs mov cx,20 Salva cx a la pila cx = reintentos ¿Reintentos < 20? ¿ [interrupt_flag] == 1? je wait_interrupt_ok pop cx loop loop_wait_interrupt pop cx mov ax,EXIT_ERROR_CODE ret Restaura cx pop cx mov ax,EXIT_OK ret Espera de 25 mseg mov ax,25 push cx call delayt2 [interrupt_flag] = 0 cli mov al,[interrupt_flag] sti cmp al,1 cli mov [interrupt_flag],0 sti

52 Disquete: ejemplo Resultado de ejecución de programa con disquete de 1.44 MB, drive = 0, y (C,H,S) = (2,0,1) C:\PRUEBAS>readfd Cambiando vector 14... DMA Setup... DMA Setup result: 0000 Encendiendo el motor... Iniciando búsqueda IRQ 6 ejecutada Resultados: 0020 0002 Resultados busqueda: 0000 Iniciando transferencia... IRQ 6 ejecutada Resultados: 0000 0000 0000 0002 0000 0002 0002 Deteniendo motor... Restaurando vector 14...

53 Manejador de disquete Búsqueda Comando SEEK ¿Error? No Si Termina con error Parámetro 1: Cabezal y dispositivo No Si Espero interrupción ¿Timeout? Si No Comando SENSE Si No Lectura de resultado Si No Termina ¿Resultado correcto? Si ¿Error? Parámetro 2: cilindro Si ¿Error? Función seek No mov ax, FDC_SEEK call fdc_out FDC_SEEK = 0Fh Escribe comando cmp ax, EXIT_OK jne seek_error xor ax,ax mov al,[head] shl al,2 or al,[drive] call fdc_out ax = 0 head db CABEZAL ax = [head] * 4 + [drive] Escribe parámetro cmp ax, EXIT_OK jne seek_error xor ax,ax mov al,[cylinder] call fdc_out cmp ax, EXIT_OK jne seek_error cmp ax, EXIT_OK mov ax, FDC_SENSE call fdc_out FDC_SENSE = 08h Escribe comando cmp ax, EXIT_OK jne seek_error cmp ax, EXIT_OK jne seek_error call fdc_resultsLee resultado de operación a buffer “results” call wait_interruptEspera IRQ6 por 500 mseg No results[0] AND 0F8h = 020h (fin comando SEEK) results[1] = [cylinder]

54 Manejador de disquete Transferencia Comando READ ¿Error? No Si Termina con error Parámetro 1: Cabezal y dispositivo No Parámetros 3..8 No ¿Error? Parámetro 2: cilindro ¿Error? Función transfer No mov ax, FDC_READ call fdc_out FDC_READ = 0E6h Escribe comando cmp ax, EXIT_OK je transf_cmd2 xor ax,ax mov al,[head] shl al,2 or al,[drive] call fdc_out ax = 0 head db CABEZAL ax = [head] * 4 + [drive] Escribe parámetro xor ax,ax mov al,[cylinder] call fdc_out ret Si ret Si je transf_cmd3 P3 = [head] P4 = [sector] P5 = tamaño del sector (2 -> 512 bytes) P6 = sectores por pista (depende de disquete) P7 = espacio entre sectores (depende de disquete) P8 = 0FFh ¿Error? Si Espero interrupción call wait_interruptEspera IRQ6 por 500 mseg Lectura de resultado No Termina ¿Resultado correcto? Si ¿Error? call fdc_resultsLee resultado de operación a buffer “results” No ¿Timeout? Si No je transf_vfy_results ret Si ret

55 Disco duro PROGRAMACION DEL SISTEMA DISCO DURO

56 Disco duro: conceptos básicos Arquitectura física del disco duro:

57 Un sector se refiere por su coordenada CHS: Cilindro C (0..65535) Cabeza H (0..15) Sector S (1..255) Disco duro: conceptos básicos

58 Ej.: lectura de sector 001 de dispositivo 0 del canal primario de PC AT+ CPU Controlador de canal primario 01F0H 01F1H 01F2H 01F3H 01F4H 01F5H 01F6H 01F7H 00H 01H 00H A0H 20H Disco duro Bus ATA-2 00H INTRIRQ14 Nr. sectores Sector Cilindro L Cilindro H Nr.Disco-Cabezal Comando lectura Buffer 000 001 1FF D0 D1 D1FF D0 D1D2 D3 Disco duro: conceptos básicos

59 Manejador de disco duro Función: procesa comandos de lectura, escritura y formato a disco duro Diversidad: el acceso a disco duro en un sistema XT es distinto al acceso a disco duro en un sistema AT+: Interfaz física al disco XT: ES 320H-32FH, IRQ5 Interfaz física al disco AT+: ES 1F0h-AF8h, IRQ14 Por tanto, manejador de disco duro incluye la función de E/S a distintos tipos de dispositivos, y en un sistema dado ejecuta la que corresponde Función

60 Controlador de canal primario ES 01F0H ES 01F1H ES 01F2H ES 01F3H ES 01F4H ES 01F5H ES 01F6H IRQ14 Manejador de disco duro wn_wbase wn_wlheads wn_wlcylinders wn_wlsectors 01F0H 0400H 0010H 003FH CPU wn_wpheads wn_wpsectors 0010H 003FH wn_wpcylinders09BAH wn_ldhprefA0H Parámetros de dispositivo 0 pDispositivo Dispositivo accedido Bloque de comandos Acceso: lectura Dispositivo: 0 CHS: 0,0,1 Cuenta: 1 Buffer Pedido ES 01F7H ES 03F6H wn_wprecomp00H Verifica parámetros Apunta pDispositivo Construye comando Espera ES 01F7.7 = 0 Escribe cmd_ldh Registro de estado Registro de control Escribe 8 o 0 a ES 3F6H según wn_wpheads Espera ES 01F7.7 = 0 Escribe precomp, cuenta, sector, cilindro 08H cmd_precomp cmd_count cmd_sector cmd_cyl_hi cmd_cyl_lo cmd_command cmd_ldh 20H IF = 0 Escribe comando IF = 1 A0H 00H 01H 00H Espera IRQ14 20H A0H 01H 00H 01H 00H Operación

61 Controlador de canal primario ES 01F0H ES 01F1H ES 01F2H ES 01F3H ES 01F4H ES 01F5H ES 01F6H Disco duro Bus ATA-2 IRQ14 Buffer 000 001 1FF D0 D1 D1FF CPU ES 01F7H ES 03F6H Registro de estado INTR irq14: pusha mov byte [interrupt_flag],1 mov di,[pDispositivo] mov dx,[di+HD_BASE_POS] add dx,7 in al,dx mov [interrupt_status],al mov al,ENABLE out INT_CTL,al out INT2_CTL,al popa iret Reconoce interrupción Si [interrupt_status] NO indica error o no hubo timeout, lee datos a buffer en memoria 00H 01H 00H A0H 20H 08H Manejador de disco duro Operación

62 Cambia vector IRQ14 Comando ATA_IDENTIFY ¿ATA_IDENTIFY bien? Termina Inicializa parámetros del BIOS Restablece vector IRQ14 ¿Discos tipo AT? Manejador de disco duro Ejemplo con funciones básicas Si No Si Comando ATA_IDENTIFY a dispositivo 0 si PC AT+ Imprime buffer ATA_IDENTIFY jnz irq14_vector_prev = vector int 76h vector int 76h = cs:irq14 vector int 76h = irq14_vector_prev xor ax,ax mov dx,[wn_wbase] add dx,REG_CYL_LO in al,dx mov bl,al not al out dx,al in al,dx cmp al,bl Controlador de disco 0 BL = reg CYL_LO reg CYL_LO = !BL AL = reg CYL_LO ¿AL == BL? Función vrfy_at_wini Vector interrupción 41h 0123456789ABCDEF Cyl_loCyl_hi heads Sectors DPT0 Vector interrupción 46h DPT1 0123456789ABCDEF Cyl_loCyl_hi heads Sectors Datos del BIOS: - nro. de discos = [40h:75h] - wn_wlcylinders = word DPT0[0] - wn_wlheads = byte DPTO[2] - wn_wlsectors = byte DPTO[14] - wn_wprecomp = word DPTO[5] Parámetros constantes: - wn_wldhpref = 0A0h |(drive*16) - wn_wbase = 1F0h Función init_params Devuelve 512 bytes de datos, incluyendo: - wn_wpcylinders = word buffer[2] - wn_wpheads = word buffer[6] - wn_wpsectors = word buffer[12] - Modelo del disco = 40 bytes desde buffer[54] Función w_identify

63 Manejador de disco duro Comando ATA_IDENTIFY Función w_identify Ejecuta comando y espera interrupción Termina con error ¿ Error ? Si No Termina call com_simple jnz mov ax,EXIT_OK ret Inicia parámetros del comando ATA_IDENTIFY Parámetros relevantes: wn_wldhpref y cmd_ldh mov al,[wn_wldhpref] mov [cmd_ldh],al mov byte [cmd_command],ATA_IDENTIFY Lee datos a buffer mov dx,[wn_wbase] add dx,0 mov di,buffer mov cx,512 shr cx,1 rep insw Registro datos: 1F0h Destino: buffer Lectura por palabras mov ax,[buffer + 2*1] mov [wn_wpcylinders],ax mov ax,[buffer + 2*3] mov [wn_wpheads],ax mov ax,[buffer + 2*6] mov [wn_wpsectors],ax wn_wpcylinders=word buffer[2] wn_wpheads=word buffer[6] wn_wpsectors=word buffer[12] Inicia wn_wpcylinders, wn_wpheads, wn_wpsectores Inicia id_string con el modelo del disco El número de serie consiste en 20 palabras, de modo que el carácter menos significativo de cada palabra precede al carácter más significativo en el string. Por tanto, se copia de una palabra intercambiando byte bajo con byte alto de la palabra cmp ax,EXIT_OKax = resultado wait_interrupt mov ax,EXIT_ERROR ret call com_out cmp ax,EXIT_OK jne com_simple_error call wait_interrupt ret com_simple_error: mov ax,EXIT_ERROR ret Ejecuta comando Espera interrupción, timeout = 300 ms

64 Manejador de disco duro Comando ATA_IDENTIFY Función com_out Reg wn_wbase + 6 = cmd_ldh ¿ RegEstado.7 == 0 ? Termina con error Si No Controlador de canal primario 01F0H IRQ14 01F7H 03F6H Reg. Estado 01F7H Timeout 300 ms ¿ RegEstado.7 == 0 ? Si No Timeout 300 ms ¿ Cabezales >= 8 ? Si Reg wn_wbase + 206h = 8 No Escribe bloque de datos del comando Deshabilita interrupciones Reg wn_wbase + 7 = cmd_command Habilita interrupciones Termina mov byte [mask],80h mov byte [value],0 call w_waitfor cmp ax,EXIT_OK Evalúa {(reg wn_wbase+7) and mask == value} hasta por 300 ms jnz mov dx,[wn_wbase] add dx,6 mov al,[cmd_ldh] out dx,al 8 o 0 cmd_command call w_waitfor cmp ax,EXIT_OK jnz mov dx,[wn_wbase] add dx,206h cmp byte [wn_wpheads],8 jae Reg wn_wbase + 206h = 0 mov al,8 out dx,al xor ax,ax out dx,al mov dx,[wn_wbase] add dx,1 mov al,[cmd_precomp] out dx,al Sigue con: cmd_count -> wn_wbase+2 cmd_sector-> wn_wbase+3 cmd_cyl_lo-> wn_wbase+4 cmd_cyl_hi-> wn_wbase+5 cli sti mov dx,[wn_wbase] add dx,7 mov al,[cmd_command] out dx,al cmd_cyl_hi cmd_cyl_lo cmd_sector cmd_count cmd_precomp Datos 01F1H 01F2H 01F3H 01F4H 01F5H cmd_ldh 01F6H mov ax,EXIT_OK ret

65 Disco duro: ejemplo Ejemplo de ejecución del programa: C:\PRUEBAS>readhd Iniciando parametros de disco Número de discos (BIOS): 0001 Params disco 0 (BIOS): 00 04 10 00 3F 00 00 00 08 BA 09 10 BA 09 3F 00 Cyl: 0400 Head: 0010 Sect: 003F Precomp: 0000 Verificacion AT: 0000 Cambiando vector 76H (IRQ 14)... Verifico estado del controlador: 0000 Ejecutando ATA_IDENTIFY: IRQ 14 ejecutada. Status: 0058 0000 Cargando datos ATA_IDENTIFY... Cyl: 09BA Head: 0010 Sect: 003F Modelo: FUJITSU M1636TAU 5A 0C BA 09 00 00 10 00 00 00 00 00 3F 00 00 00 00 00 00 00 20 20 20 20 20 20 20 20 20 20 20 20 35 30 33 32 31 33 32 30 00 00 00 01 04 00 30 35 35 34 20 20 20 20 55 46 49 4A 53 54 20 55 31 4D 33 36 54 36 55 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 80 00 00 00 0B 00 00 00 02 00 02 03 00 BA 09 10 00 3F 00 60 4C 26 00 10 01 E0 53 26 00 07 00 07 04 Restaurando vector 76H (IRQ 14)...


Descargar ppt "Arquitectura de PCs Programación de periféricos. Introducción Función de E/S: acceso a un dispositivo periférico por la interfaz de la CPU al dispositivo."

Presentaciones similares


Anuncios Google