Código de Arranque (Boot Code)

El código de arranque es elemental para el funcionamiento de cualquier kernel. Es el encargado de cargar el kernel a la memoria y de iniciar la ejecución de este. En Sierra Kernel, este código se encuentra en el archivo boot.s, el cual está escrito en lenguaje Ensamblador debido a que requiere de interacción casi directa con la máquina. Aunque en este archivo hay muchas líneas de código, en realidad solo 3 de estas se encargan de hacer la función que explique arriba.

push ebx  ; Esto carga el Header Multiboot
cli       ; Desactivamos las interrupciones para no ser interrumpidos mientras cargamos el kernel a la memoria.
call main ; Llamamos al kernel usando la función principal de este [main()]
jmp $     ; Entramos a un ciclo infinito para evitar que el CPU ejecute otra cosa que no sea el kernel.

Lo demás del código en realidad es un Multiboot Header, el cual es un estándar que los kernels deben de cumplir para que sean cargados por GRUB (un bootloader). Este estándar le dice a GRUB el tipo de espacio y los requerimientos que necesita el kernel para ser cargado y ejecutado. A continuación voy a explicar el header, más arriba hay otras cosas que son definidas (para el header) las cuales no voy a explicar ya que estas pueden ser entendidas fácilmente:

  dd  MBOOT_HEADER_MAGIC        ; Un número mágico que identifica al kernel como compatible con el
                                ; estándar Multiboot.
  dd  MBOOT_HEADER_FLAGS        ; Un conjunto de valores que usamos para pedirle a GRUB que haga ciertas cosas
                                ; como darnos información de la memoria.                         
  dd  MBOOT_CHECKSUM            ; Para evitar errores, esto verifica que la suma de los 2 valores pasados nos de 0.

  dd  mboot                     ; La dirección de la estructura que estamos usando
  dd  code                      ; code, bss, end y start se usan para decirle a GRUB donde poner y cargar
  dd  bss                       ; cada parte del kernel.
  dd  end                       ; code = código, bss = data (datos), end = final del kernel, start = inicio
  dd  start                     ; del kernel

results matching ""

    No results matching ""