Escribimos un sistema operativo. Parte 1. Cargador

¡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:


  1. 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á.
  2. Proporcione al sistema operativo funciones para trabajar con hardware.
  3. 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 equipo

org 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ínea

jmp $

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.


All Articles