StellatorOS: Interrupciones


Las interrupciones permiten a la CPU pausar la tarea que estuviese haciendo en ese momento para ejecutar otra de mayor prioridad y poder volver a la tarea original una vez atendida la prioritaria. Las interrupciones pueden ser disparadas tanto por software(int 0x10) como por hardware(la llegada de un paquete por red). En este artículo utilizaremos la int0x10 para pintar por pantalla un texto.

 

Antes de comenzar es recomendable que leas este artículo anterior: Boot Sector

Cada interrupción es representada por un id único, con este índice se consulta una tabla(interrupt vector) que fué cargada por la BIOS en dirección física 0x0 donde se relaciona el id con un puntero a una dirección de memoria
donde se encuentra la rutina asociada a la interrupción(interrupt service routine - ISR)

Para imprimir carácteres por pantalla vamos a utilizar la interrupción 0x10, esta interrupción se encarga de las funciones de pantalla, según el valor del registro ah realizará una función u otra.

Si asignamos el valor 0x0e al registro ah imprimirá un carácter por pantalla y avanzará el cursor listo para el siguiente carácter, el registro al se leerá para saber que carácter se debe imprimir, procedemos con nuestro programa en ASM.

vi boot_sect_hello.asm
mov ah, 0x0e ; tty mode
mov al, 'H'
int 0x10
mov al, 'e'
int 0x10
mov al, 'l'
int 0x10
int 0x10
mov al, 'o'
int 0x10

jmp $ ; jump to current address = infinite loop

; padding and magic number
times 510 - ($-$$) db 0
dw 0xaa55 

Generamos la imagen:

nasm -f bin boot_sect_hello.asm -o boot_sect_hello.bin

Arrancamos qemu con nuestra imagen:

qemu-system-x86_64 boot_sect_hello.bin

SeaBIOS (version rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org)
iPXE (http://ipxe.org) 00:03.0 C980 PCI2.10 PnP PMM+07F91410+07EF1410 C980

Booting from Hard Disk...
Hello

Increíble, hemos conseguido imprimir carácteres por pantalla llamando las interrupciones básicas de la BIOS.

Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Autor: kr0m -- 04/06/2020 00:48:06