Abril 2013
Mapa de Memoria
Mapa de Memoria (2)
Mapa de Memoria (3)
Mapa de E/S en una PC
Power On Self Test (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 modotexto 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 (Controlador de teclado) 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
Power On Self Test (2) 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 Comprueba el 8259 y lo inicializa con los valores default. El vector de Interrupción lo 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
Power On Self Test (3) 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
Detección de extensiones BIOS El POST busca extensiones de BIOS El rango de direcciones de memoria en las que se pueden mapear estas ROMs va desde la C0000h hasta la EFFFFh Se busca dentro de este rango cada 2K una firma fija e igual a 55AAh. Si la encuentra asume que en esa página de 2k comienza una extensión de BIOS Si el POST detecta alguna ROM adicional, le transfiere temporariamente el control. La extensión de BIOS
Detección de extensiones BIOS (2) Inicializará el hardware para el que fue diseñada Realizará, del mismo modo que el POST (de la ROM del sistema) un checksum, cuyo resultado debe ser 0 para que la ROM se considere de contenido válido Interceptará las interrupciones que necesite Devolverá al POST el control del sistema (RET) dejando al hardware asociado a la extensión BIOS, listo para su uso
Extensiones BIOS: Mapa de Memoria
Boostrap Loader del BIOS Lee el primer sector físico del disco, del que está configurado en el equipo en la secuencia de arranque Carga los 512 bytes en memoria RAM (0000h:7C00h) Salta al primer byte (debe haber allí una instrucción válida) En ese sector debe residir un programa denominado Boostrap Loader, que sepa cargar al Sistema Operativo.
Acciones del Boostrap Loader Debe leer del disco los archivos necesarios para bajar a la memoria Para ello deben conocer la forma en que está organizada la información en el disco Debe descargarlos en memoria y en algún momento transferirles la ejecución Esto lo hace con servicios del BIOS (en modo real)
Práctica: Primer código en modo protegido %define KERNEL MEMORY 8000h %define KERNEL MEMORY 8000h %define VIDEOMEM 0b8000h ORG KERNEL MEMORY ;acá nos carga ;nuestro bootsector use16 cli mov eax,cr0 ;lee el registro de control 0. mov eax,cr0 ;lee el registro de control 0. or al,1 mov cr0,eax jmp short $+2 ;setea el bit PE ;Protection Enable. ;pasa a modo protegido. ;vacía la cola de ejecución.
Práctica: Primer código en modo protegido (2) mp: in al,60h ;lee el teclado dec al ;compara con esc jnz mp ;sino es esc sigue mov eax,cr0 and al,0feh ;resetea el PE. mov cr0,eax ;retorna a modo real.
Práctica: Primer código en modo protegido (3) mov ecx, 80*25 mov eax,videomem sar eax,4 mov ds,ax limpiar pantalla: mov byte [ecx * 2-2], 0 mov byte [ecx * 2-1], 1Bh dec ecx jne limpiar pantalla jmp $
Uso de nasm y Linux nasm -f bin -o bootsector.bin bootsector.asm nasm -f bin -o KERNEL.BIN kernel.asm -l kernel.lst sudo mkdosfs -C floppy.dsk -F 12 1440 sudo mount -o loop -t msdos floppy.dsk /mnt/prueba sudo cp KERNEL.BIN /mnt/prueba sudo umount /mnt/prueba dd if=floppy.dsk bs=512 skip=1 of=floppy1.dsk cat bootsector.bin floppy1.dsk > floppy.img sudo rm -f floppy.dsk rm floppy1.dsk
Uso de bochs Dos consolas, una de texto para depuración (puede ser gráfica) y otra gráfica para la emulación c Inicia la ejecución ˆc Detiene la ejecución info r Muestra los valores de los registros info cpu Otra vista de los registros sreg Registros de segmento s Ejecución paso a paso n Ejecución paso a paso, no para Call s
Uso de bochs (2) help vb 0x1811:0x111 Setea un Break Point (Requiere conocer el valor de CS:EIP, donde color el BP) blist Veo los BreakPoint s bpd 1 Deshabilito el primer BP bpe 1 Habilito el primer BP
Uso de bochs: Magic Break Point Introducir las instrucción xchg bx,bx en el código en el punto que se desea detener la ejecución En el archivo bochsrc requiere que esté activo la línea magic break: enabled=1
Uso de bochs: Mas comandos r, reg Muestra el contenido de los registros de propósito general sreg Muestra los registros de segmento creg Muestra los registros de control info gdt Muestra el contenido de la GDT info idt Muestra el contenido de la IDT info tab Muestra el contenido de las tablas de paginación x <dir lineal o lógica > Muestra el contenido de la memoria xp <dir física > http://bochs.sourceforge.net/doc/docbook/user/index.html
El archivo bochsrc Configura el bochs Hay algunas poca líneas fundamentales: floppya: 1 44=floppy.img, status=inserted boot: floppy log: bochsout.txt magic break: enabled=1 Además de las que vienen por defecto Usar el bochsrc que vienen con la instalación Opcional: display library: x, options= gui debug
Pin A20 Por compatibilidad con las primeras PC, el terminal A20 (pin 20 del bus de direcciones) tiene la posibilidad de ser habilitado o deshabilitado. El código para habilitarlo: enable A20: call empty 8042 mov al,0xd1 ; command write out 0x64,al call empty 8042 mov al,0xdf ; A20 on out 0x60,al call empty 8042 empty 8042: in al,0x64 test al,2 jnz empty 8042 ret