Guía para ejercicios Desde el comienzo hasta TP4.1 T.P. Nº 2. BIOS y Boot • El proceso de boot comienza ejecutando el código de la BIOS ubicado en la posición física 0xFFFF0. Allí comienza el POST (Power On Self Test) que es parte de la ROM BIOS. El POST realiza la inicialización básica del hardware (por ejemplo, la placa de video) y su verificación. Luego busca algún dispositivo de booteo: Disco Rígido, Floppy, USB, etc. El orden de búsqueda está determinado en una pequeña memoria RAM estática que se alimenta con una pila de Li. Es lo que se conoce como setup de la PC al que se ingresa mediante alguna tecla específica disponible para tal fin durante algunos instantes cuando recién se enciende la PC. Transcurrido ese breve intervalo se desactiva la opción de ingreso al Setup. • Una vez localizado el dispositivo de arranque, carga el primer sector de 512 bytes (excepto en el caso de CDROM, cuyo tamaño es 2048) en la posición de memoria 0x07C00 y salta a esa dirección. Las imagen de arranque es la encargada de cargar el kernel y luego pasarle el control. • IMPORTANTE: Las imágenes de arranque deben ocupar exactamente 512 bytes (excepto en el CDROM), y estar firmada en los últimos dos bytes con 0x55AA. • A continuación se muestra un esquema posible de la distribución de la memoria al arrancar la máquina. Power On Self Test (POST) (1) • Antes de iniciar su operación el sistema verificará el correcto funcionamiento de la CPU • Chequea si el contenido de la ROM es el correcto (realiza un checksum del contenido de la ROM completa que en fábrica se ajusta de modo que el resultado del check sea cero). • Detecta el tipo de adaptador de video instalado. Lo inicializa en modo texto 80x25.Escribe en la BIOS DATA AREA los principales datos de interés para el sistema que proporciona este controlador. • Comprueba la correcta interacción con el 8042 y setea el modo de trabajo con los diferentes ports de E/S que proporciona este chip. • Si el Timer 1 funciona correctamente se lo programa para generar un pulso al final de la cuenta, cuenta cíclica, y duración de la misma 15 mseg aproximadamente. • Comprueba el correcto funcionamiento para el canal de DMA 0. • Si los test descriptos indican que el Timer 1 y el canal 0 de DMA funcionan correctamente, entonces se dispara el refresco de memoria. Power On Self Test (POST) (2) • Comprueba el 8259 y lo inicializa con los valores default de los vector es de Interrupción. A los que usa, los apunta a las rutinas de la ROM correspondientes. • Cuenta la memoria RAM y comprueba su funcionamiento • Una vez finalizada la cuenta de memoria, chequea los restantes timers y canales de DMA. Si funcionan correctamente los inicializa de acuerdo a la forma en la que van a trabajar cada uno de ellos. • Cheque el teclado y el timer tick, habilita sus interrupciones en el 8259. • Testea el funcionamiento de las unidades de disco flexible y rígido. Una vez comprobado las inicializa, y escribe los resultados y principales parámetros en la BIOS DATA AREA. • Chequea si existen ports serie. Inicializa a los que encuentra y guarda resultados en BIOS DATA AREA. • Chequea si existen ports paralelo. Inicializa a los que encuentra y guarda resultados en BIOS DATA AREA. • Establece si existen extensiones BIOS. Esto es: La ROM BIOS de las PC provee un camino para integrar adaptadores de E/S con su propia ROM onboard. • Llama a la rutina Bootstrap loader para la carga del sistema operativo. Ejercicio 2.1.Debuggeando BIOS • Iniciar el Bochs, y debuggear el POST de la BIOS. Seguir el código tratando de ver (a grandes rasgos) que operaciones realiza el POST. Boot de un OS • Iniciar el Bochs, y cargar alguna imagen de Linux. Seguir el código e indicar el momento exacto en que el Bootloader pasa el control al Kernel. Ejercicio 2.2. Programa autobooteable • En el link http://en.wikibooks.org/wiki/X86_Assembly/ Bootloaders, se presenta una versión "bootloader" del programa Hello World y las líneas necesarias para compilarlo usando NASM. • Descárguelo, compile y pruebe su funcionamiento, debuggeando paso a paso. Ejercicio 2.2. Programa autobooteable (1) org 7C00h jmp short Start ;Jump over the data (the 'short' keyword makes the jmp instruction smaller) Msg: db "Hello World! " EndMsg: Start: mov bx, 000Fh ;Page 0, colour attribute 15 (white) for the int 10 calls below mov cx, 1 ;We will want to write 1 character xor dx, dx ;Start at top left corner mov ds, dx ;Ensure ds = 0 (to let us load the message) cld ;Ensure direction flag is cleared (for LODSB) Print: mov si, Msg ;Loads the address of the first byte of the message, 7C02h in this case ;PC BIOS Interrupt 10 Subfunction 2 - Set cursor position ;AH = 2 Char: mov ah, 2 ;BH = page, DH = row, DL = column int 10h lodsb ;Load a byte of the message into AL. ;Remember that DS is 0 and SI holds the offset of one of the bytes of ;the message. ;PC BIOS Interrupt 10 Subfunction 9 - Write character and colour ;AH = 9 Ejercicio 2.2. Programa autobooteable (2) mov ah, 9 ;BH = page, AL = character, BL = attribute, CX = character ;count int 10h inc dl ;Advance cursor cmp dl, 80 jne Skip xor dl, dl inc dh cmp dh, 25 jne Skip xor dh, dh Skip: ;Wrap around edge of screen if necessary ;Wrap around bottom of screen if necessary cmp si, EndMsg ;If we're not at end of message, jne Char ;continue loading characters jmp Print ;otherwise restart from the beginning of the message times 0200h - 2 - ($ - $$) db 0 dw 0AA55h ;Zerofill up to 510 bytes ;Boot Sector signature ;OPTIONAL: ;To zerofill up to the size of a standard 1.44MB, 3.5" floppy disk ;times 1474560 - ($ - $$) db 0 Ejercicio 2.2. Programa autobooteable (3) Ejercicio 3.4. Combinación de C y ASM • Verificar la potencia y flexibilidad que brinda la combinación de lenguaje C y ASM según los requerimientos y complejidad del programa. • Entender el uso de los compiladores de C y ASM, de los linkeadores y sus diferencias. Paso de argumentos por la pila. • Para ello escribir dos programas: a) Cuerpo principal en C que solicite dos operandos por consola, y una operación (s: suma, r:resta) y devuelva por pantalla el resultado. Las operaciones serán realizadas por funciones auxiliares en ASM (func.asm) b) Cuerpo principal en ASM. Espera presión de una tecla. Según la tecla presionada (a-z) cambia el color del texto y sale. • El “switch” que evalúa el scan code se realizará en un programa externo en C (evalscancode.c) Ejemplo de Combinación C y Assembler Cuentas.c extern int cuentas_asm (int a, int b);//permite el linkeo //posterior, le digo al compiler que la función viene después #include <stdio.h> int main (int argc, char *argv[]) //Si cuando se //ejecuta no se agregan parámetros: violación de segmento { int a,b,r=0; a=atoi(argv[1]); b=atoi(argv[2]); r=cuentas_asm(a,b); //Llamo a la función que me //suma en assembler. printf("La suma es: %d\n",r); return 0; } Ejemplo de Combinación C y Assembler Cuentas_asm.asm GLOBAL cuentas_asm ; Hace la conexión con extern %define sumando1 ebp+8 %define sumando2 ebp+12 cuentas_asm: ; Etiqueta que marca el comienzo enter 8,0 ; Adecua el stack, ebp y reserva dos ;dobles word para uso de la rutina mov eax, [sumando1] mov ebx, [sumando2] add eax, ebx leave ; Reestabece el stack y ebp, ; a partir del valor de ebp ret Ejemplo de Combinación C y Assembler Script.sh nasm -f elf cuentas_asm.asm -l cuentas_asm.lst gcc -c Cuentas.c gcc -g Cuentas.o cuentas_asm.o -o floppy rm Cuentas.o cuentas_asm.o Programa en C Programa en asembler Compilador de asm Compilador de C Linker Ejecutable Ejercicio 4.1.Entrada a Modo Protegido • Escriba un programa autobooteable que ponga al procesador en modo protegido, seguidamente ponga la pantalla en modo de video inverso, y termine su ejecución mediante HLT. • Asuma un controlador de video color. TP4.1: Resolución a medias (1) TP4.1: Resolución a medias (2) TP4.1: Resolución a medias (3) TP4.1: Resolución a medias (4) TP4.1: Resolución a medias (5) TP4.1: Resolución a medias (6) FIN