¡Hola a todos! Hoy escribiremos un gestor de arranque que generará "Hello World" y lo ejecutará en VirtualBox. Escribiremos en ensamblador FASM. Puedes descargarlo desde aquí . También necesitaremos VirtualBox y UltraISO . Antes de escribir el código, entenderemos cómo se cargan los sistemas operativos.Entonces, cuando presionamos el botón de encendido grande en nuestra computadora, se inicia el sistema, que está en cualquier computadora: BIOS (Sistema básico de entrada / salida o sistema básico de entrada / salida). La tarea del BIOS es:
- Detecta todos los dispositivos conectados y verifica su operatividad. El programa POST (Power On Self Test, power-on self-test) es responsable de esto. Si no se detecta hierro vital, entonces el altavoz del sistema (si lo hay) chillará algo incomprensible y la descarga no irá más allá.
- Proporcione al sistema operativo funciones para trabajar con hardware.
- Lea el primer sector del dispositivo de arranque en el segmento cero de RAM en el desplazamiento 0x7C00h y transfiera el control allí. 1 sector en el disco es de 512 bytes. Por lo tanto, nuestro gestor de arranque no debe exceder los 512 bytes. El BIOS determina que el sector es arrancable por la presencia de 0x55 y 0xAA en sus últimos dos bytes.
Ahora puedes comenzar a escribir código. Ejecute el archivo FASMW.EXE, que se encuentra en el archivo con FASM, e inserte allí el siguiente código:org 7C00h
start:
cli ; ( )
xor ax, ax ; ax
mov ds, ax ; dataSegment
mov es, ax ; es
mov ss, ax ; StackSegment
mov sp, 07C00h ;
sti ;
;
mov ax, 3
int 10h
mov ah, 2h
mov dh, 0
mov dl, 0
xor bh, bh
int 10h
;
mov ax, 1301h
mov bp, message
mov cx, 12
mov bl, 02h
int 10h
jmp $
message db 'Hello World!',0
times 510 - ($ - $$) db 0 ; 510-
db 0x55, 0xAA ;
Este código requiere una pequeña explicación. El equipoorg 7C00h
Decimos que el código debe cargarse en la RAM a 0x7C00. En lineas mov ax, 3
int 10h
configuramos el modo de video en 80x25 (80 caracteres por línea y 25 líneas) y de ese modo limpiamos la pantalla. mov ah, 2h
mov dh, 0
mov dl, 0
xor bh, bh
int 10h
Aquí ponemos el cursor. La función 2h interrupt 10h es responsable de esto. En el registro dh colocamos la coordenada del cursor en Y, y en el registro dl en X. mov ax, 1301h
mov bp, message
mov cx, 12
mov bl, 02h
int 10h
Imprimimos una línea. La función 13h interrupt 10h es responsable de esto. En el registro bp ponemos la cadena en sí, en el registro cx el número de caracteres en la cadena, en el registro bl el atributo, en nuestro caso el color, será verde. Los primeros 4 bits afectan el color de fondo, los segundos 4 bits afectan el color del texto. A continuación se muestra la tabla de colores.0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - , 7 - -, 8 - -, 9 - -, A - -, B - -, C - -, D- -, E - -, F – .
En líneajmp $
El programa se congela.Compilamos el código presionando Ctrl + F9 y guardamos el archivo resultante como boot.bin.Lanzamiento
Inicie UltraISO y arrastre nuestro binario a un área especial (marcada con una flecha roja).
A continuación, haga clic derecho en el enlace binario y presione el botón con la siguiente inscripción: "Instalar como archivo de arranque". A continuación, guarde nuestro archivo en formato ISO.Abra VIrtualBox y cree una nueva máquina virtual (si no sabe cómo hacer esto, haga clic aquí ). Entonces, después de haber creado la máquina virtual, haga clic en "Configurar", seleccione el elemento "Medios", haga clic en "Vacío", donde "Unidad" es el icono del disco óptico. Hacemos clic en él y seleccionamos "Seleccionar imagen de disco óptico", buscamos nuestro archivo ISO, hacemos clic en "Abrir". Guardamos todas las configuraciones e iniciamos la máquina virtual. Nuestro "Hello World!" Aparece en la pantalla.
Sobre esto, el primer problema llega a su fin. En la siguiente parte, le enseñaremos a nuestro gestor de arranque a leer sectores de disco y arrancar su primer núcleo.