Está en la página 1de 8

Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de

Computadores 2
2008

Arquitectura de
Computadores 2
Laboratorio 1
Documentación de
La Solución Implementada

Integrantes

C.I.

Dufrechou Lasca, Ernesto
Almeida Rodríguez, Alberto Emmanuel
Funez Gutierrez, Juan Ernesto

4.506.720-7
4.323.204-0
3.975.469-4

Informe Obligatorio 1. Pagina 1 de 8

net/tutorials/brunmar/tutorial_03.php brindada por los profesores del curso en la letra del mismo. que son las partes A y B del obligatorio. Esta última esta subdividida en dos partes. la introducción y la descripción de la solución.osdever.1 Bootloader (bootloader. Los comentarios indican lo que se debe hacer en el código real.asm) El bootloader tiene como funcion principal cargar desde la imagen de diskett los sectores correspondientes al kernel y pasar a modo protegido para luego ceder el control a la rutina main de dicho kernel. 2 Descripción de la Solución Implementada 2. 1. De todas maneras la solución es explicada a continuación.2 Estructura del documento El documento esta dividido en dos partes.1.Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 1 Introducción 1. 2. Pagina 2 de 8 . Esta parte muestra un pseudocódigo de nuestra solución.1 Introducción El propósito de este documento es brindar una descripción general del Diseño de la solución implementada para resolver el problema planteado en el primer laboratorio de Arquitectura de Computadores 2. Pseudocódigo: Informe Obligatorio 1.1 Parte A La solución de la parte A del obligatorio fue resuelta en base a la referencia 3 http://www.

 Pagina 3 de 8 . El espacio de memoria que representa la pantalla comienza por la dirección 0xB8000. El cursor: La posición del cursor se almacena en dos registros de 8 bit ya que las posibles posiciones son 80*25 = 2000 > 256 que sería lo que se puede especificar con uno solo. // tope del stack Saltar a ejecutar main(). // Si reg AL<>0 hubo error Deshabilitar interrupciones. // Donde la BIOS comienza a correr al comenzar Repetir Reset diskette. // modo real [BITS 16] Poner rutina en la dir 0x7C00.Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 Usar instrucciones de 16 bits. // se utiliza la misma int 0x13 con el reg AH en 02h Hasta que no haya error.2 Bibliotecas del Kernel (video. // dw 0AA55h 2. Luego tanto para saber Informe Obligatorio 1. // Se utiliza la int 0x13 con el reg AH en 0 // Si reg AL<>0 hubo error Repetir seteo parámetros. ESP= 90000h. // indico cuantos sectores se van a cargar y donde cargar sectores. Data segment. Firma de disco booteable. ports. Hasta que no haya error.1. Code segment. //lgdt Modo protegido. // el bit 0 de CR0 en 1 y un jmp Usar instrucciones de 32 bits. El primero almacena el caracter ASCII que se imprime en esa pocisión y en el segundo se especifican opciones de formato (por ej el color de fondo y el de la “letra”). //cli Cargar gdt.c) La pantalla: La pantalla es interpretada como una matriz de tamaño 25x80 (25 filas 80 columnas) donde cada posición es representada por dos bytes.c. //jmp 08h:1000h //En esta parte se crea la gdt Gdt: Null. // modo real [BITS 32] DS=SS =10h. Endgdt Rellenar con ceros el sector.

Esto se hace mediante los puertos 0x3D4 y 0x3D5 respectivamente. Informe Obligatorio 1.0). se debe especificar primero a que registro (indicando el índice 14 o 15) se va a modificar o leer y luego se lo lee o escribe. 2. y por último le suma a la posición del cursor el largo del string.c: Tanto la función ‘in’ como ‘out’ son una línea usando assembler embebido en lenguaje C de las operaciones ‘in’ y ‘out’ de assembler. Por otra parte la función print() escribe en pantalla el string parámetro (que es un array de char’s) a partir de la posición del cursor (tal como se explicó anteriormente). Pagina 4 de 8 .c El main limpia la pantalla usando la función clrscr() detallada anteriormente. imprime el mensaje “Arquitectura de Computadores 2” usando la funcion print y por ultimo entra en loop infinito.3 Main. Ports.Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 en que posición se encuentra el cursor como para posicionarlo. Funciones de video: Tenemos las funciones de limpiar la pantalla (clrscr) que lo que hace únicamente es colocar el caracter ASCII 0 con el fondo y color 0xF en toda la pantalla y luego posicionar el cursor en (0.1. El registro índice 14 es el byte mas significativo de la posición del cursor y el 15 el menos significativo.

la referencia se pone en 0. El TSS es el lugar donde la CPU salva el contexto de la tarea que esta ejecutando para darle la CPU a otra. así como cumplir con el resto de los requerimientos. En el caso del timer como no tiene LDT. los cuales hacen referencia a el índice en la GDT de los TSS-descriptors de cada una de las rutinas.Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 2. Pagina 5 de 8 . En esta sección se comentará acerca de los agregados del bootloader y la forma en que se solucionó el problema de manejar el cronómetro con dos interrupciones. En cuanto a el teclado fueron definidos segmentos de código y datos específicos para esa tarea y por lo tanto fue necesaria una tabla LDT (Local Descriptor Table) la cual es referenciada desde la ‘GDT’ con un LDT-descriptor e indirectamente desde el TSS del teclado haciendo referencia al índice en la ‘GDT’ donde se encuentra dicho LDT-descriptor. uno para la rutina de atención a la interrupción del timer y otro para la rutina del teclado. Task gate.2. SS y el registro de flags. Por otra parte se tiene la IDT (Interrupt Description Table). Esta tabla dice básicamente donde esta la rutina de atención a las interrupciónes. También fueron utilizadas las bibliotecas antes mencionadas. Para el main se definió un segmento de código que ocupa toda la memoria y uno de datos que también comienza en la posición 0 y se extiende hasta la 0xFFFF. Interrupt gate y Trap gate descriptors. Los índices 8 y 9 son los del timer y el teclado respectivamente. entre otras cosas guarda el IP (instrucción pointer) el DS. Cada TSS es accesible mediante un TSS-descriptor en la ‘GDT’ (General Descriptor Table).asm Estructura: Tenemos tres TSS’s (Task State Segment) uno para el main.2 Parte B En esta parte se utilizó el bootloader de la parte “A” con muchos agregados para soportar las interrupciónes. 2. CS. Como en el obligatorio se pidió que las rutinas de atención a las interrupciones fuesen tareas distintas a las interrumpidas era necesario definir Task gate descriptors.1 bootloader. Estos segmentos son compartidos con el timer y se encuentran especificados en la ‘GDT’. En esta tabla pueden haber tres clases de Gate descriptors. Informe Obligatorio 1.

dado que el PIC enmascara las próximas interrupciónes del dispositivo que interrumpió hasta que no se le avise que y fue atendida y que puede volver a interrumpir. De no hacerse esto el PIC no avisará de la próxima interrupción del dispositivo. //jmp 08h:1000h //Creación de las tablas y la firma de que es un disco booteable PIC 8259: Este PIC es a través del cual se indica qué interrupciónes de hardware (de las que son enmascarables) pueden interrumpir. //Parte A Inicialización de TSS del timer. //”out 0x21. Informe Obligatorio 1. //lidt Pasar a modo protegido. Inicialización de TSS del teclado. A este mismo PIC se le debe avisar cuando termina la rutina de interrupción del dispositivo por la cual se invocó. En nuestro caso se manda a este puerto el valor 0xFC que es 1111 1100. Para esto se manda un 0x20 al puerto 0x20. //Como en la parteA Deshabilitar interrupciones. Restricciones de localidad en memoria: • La rutina del main queda en la dirección 1000h porque este es el destino a partir del cual se cargan los sectores subsiguientes en el bootloader. El puerto 0x21 es un registro de 8 bit en donde se indica con un cero si la interrupción correspondiente a determinado bit esta habilitada. //cli Levantar gdt. El primer bit indica que el timer puede interrumpir y el segundo es para el teclado.Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 Pseudocódigo: Leer sectores desde diskette. Pagina 6 de 8 .0fch” Saltar a ejecutar main(). // lgdt Levantar idt. TR = indice en la gdt del TSS del main //ltr Permitir interrumpir al timer y el teclado. La CPU puede comunicarse con este PIC mediante los puertos 0x21 y 0x20.

Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 • El timer queda entre la dirección 1000h y 1500h porque esta rutina va después del main() en memoria y además es lo suficiente mente corto el código para no pasarse mas allá de la dirección 1500h. El timer en cada interrupción se fija si tiene que actualizar el cronometro porque se presiono una tecla o porque se supero los 18 tics que indican que se tenga que incrementar en uno la cantidad de segundos. En otro caso no modifica la variable global dejándola sin actualizar para que el timer no haga nada al respecto. En el caso de las flechas se hace una lectura en dos pasos ya que la tecla presionada se lee del puerto 0x60 con lectura de un byte mientras que el código de las flechas es de dos bytes. Decidimos que el timer sea el único encargado de imprimir en pantalla el cronometro. El teclado únicamente deja en una variable global la tecla presionada (su “scancode” correspondiente a la bajada de la tecla) cuando esta es una de las teclas validas.2 Rutinas de interrupción y main El main de la parte “B” es igual de simple que el anterior. Pagina 7 de 8 . 2. • La base del stack del teclado y el timer fueron considerados en sus respectivos TSS y en el caso del main haciendo un “mov esp. Con esta lectura en dos pasos (usando la bandera “flecha”) logramos respetar que toda tecla que no sea una de las teclas válidas no haga nada. Informe Obligatorio 1. • Las variables globales en la dirección 1500h son especificadas en el linker con la directiva . Y no se pasa de la dirección 25001h porque al igual que el timer es un código reducido.2. 070000h” • La rutina de atención al teclado quedo en la dirección 2000h por que su segmento de código fue asignado en esa posición (en el TSS). La única diferencia con el anterior es que este habilita las interrupciones.data. De leerse solo la segunda vez que interrumpe el teclado por una de las flechas pudiese confundirse el ‘8’ y el ‘2’ del teclado numérico con la flecha de arriba y abajo respectivamente. en ambos casos.

Boolean pausa = false void timer() inicio: Si (tecla_oprimida<>0) Depende del caso Caso ‘P’ pausa = true. Caso  Flecha_arriba Incrementar cronometro. void teclado() char aux= in(0x60). out(0x20. Fin_depende Tecla_oprimida = 0.0x20). tic:=0 Fin_si Si (hubo cambios) Borra e imprime nuevo cronometro out(0x20. iret goto inicio.Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura de Computadores 2 2008 Pseudocódigo del teclado: Char tecla_oprimida = 0. Pagina 8 de 8 . iret goto inicio. fin_timer Informe Obligatorio 1. Fin_si Si (not pausa) tic++. Si (tic = 18) Incrementar cronometro. Int tic = 0. Caso  Flecha_abajo Decrementar cronometro. Caso ‘S’ pausa = false. fin_teclado Pseudocódigo del timer: Char tecla_oprimida = 0.0x20). inicio: Si (aux es una tecla valida) Entonces tecla_oprimida = aux.