14 Practica hasta TP41

Anuncio
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
Descargar