Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador

Características del Bootloader

  • Se carga en la dirección 0x7C00 (BIOS).
  • Imprime mensajes de progreso en la pantalla.
  • Configura la GDT (Tabla Global de Descriptores).
  • Cambia al modo protegido de la CPU.
  • Carga el kernel desde el disco.
  • Entrega el control al kernel.

Código fuente avanzado en ensamblador (NASM)

BITS 16
ORG 0x7C00  ; Dirección estándar de carga del bootloader

start:
    cli
    cld

    ; Mostrar mensaje inicial
    mov si, msg_bootloader
    call print_string

    ; Cargar la GDT
    mov si, msg_gdt
    call print_string
    call load_gdt

    ; Cambiar a modo protegido
    mov si, msg_protected_mode
    call print_string
    call switch_to_protected_mode

    ; Cargar el kernel desde el disco
    mov si, msg_loading_kernel
    call print_string
    call load_kernel

    ; Entregar el control al kernel
    mov si, msg_transfer_control
    call print_string
    jmp 0x100000  ; Dirección de carga del kernel

halt:
    hlt
    jmp halt

; ---------------------------------------------------------
; Funciones auxiliares
; ---------------------------------------------------------

print_string:
    mov ah, 0x0E
.loop:
    lodsb
    or al, al
    jz .done
    int 0x10
    jmp .loop
.done:
    ret

load_gdt:
    lgdt [gdt_descriptor]
    ret

switch_to_protected_mode:
    mov eax, cr0
    or eax, 1
    mov cr0, eax
    jmp 0x08:protected_mode

BITS 32
protected_mode:
    mov si, msg_pm_done
    call print_string
    ret

load_kernel:
    mov si, msg_disk_load
    call print_string
    ; (Aquí iría la rutina para leer el kernel del disco)
    ret

; ---------------------------------------------------------
; Datos y mensajes
; ---------------------------------------------------------

msg_bootloader db "Bootloader iniciado.", 0
msg_gdt db "Configurando GDT...", 0
msg_protected_mode db "Cambiando a modo protegido...", 0
msg_loading_kernel db "Cargando kernel desde el disco...", 0
msg_transfer_control db "Entregando control al kernel...", 0
msg_pm_done db "Modo protegido activo.", 0
msg_disk_load db "Leyendo sectores del kernel...", 0

; ---------------------------------------------------------
; Tabla Global de Descriptores (GDT)
; ---------------------------------------------------------

gdt:
    dq 0x0000000000000000  ; Descriptor nulo
    dq 0x00CF9A000000FFFF  ; Código
    dq 0x00CF92000000FFFF  ; Datos

gdt_descriptor:
    dw gdt_descriptor_end - gdt - 1
    dd gdt

gdt_descriptor_end:

; ---------------------------------------------------------
; Espacio para el stack
; ---------------------------------------------------------

times 510-($-$$) db 0
dw 0xAA55  ; Firma de arranque

Explicación del código

  • Mensajes en pantalla: Cada etapa usa print_string para mostrar texto.
  • GDT: Se carga con lgdt para modo protegido.
  • Cambio a modo protegido: Se activa el bit PE en CR0.
  • Carga del kernel: Se reserva espacio para la función load_kernel.
  • Salto al kernel: Se usa jmp 0x100000 para entregar el control.

Próximos Pasos

  1. Compila con NASM:
    nasm -f bin bootloader.asm -o bootloader.bin
  2. Ejecuta en QEMU:
    qemu-system-x86_64 -drive format=raw,file=bootloader.bin
  3. Ajusta la rutina load_kernel para leer el kernel desde el disco.

 

Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...