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_stringpara mostrar texto. - GDT: Se carga con
lgdtpara modo protegido. - Cambio a modo protegido: Se activa el bit
PEenCR0. - Carga del kernel: Se reserva espacio para la función
load_kernel. - Salto al kernel: Se usa
jmp 0x100000para entregar el control.
Próximos Pasos
- Compila con NASM:
nasm -f bin bootloader.asm -o bootloader.bin
- Ejecuta en QEMU:
qemu-system-x86_64 -drive format=raw,file=bootloader.bin
- Ajusta la rutina
load_kernelpara leer el kernel desde el disco.
Tags
Lenguaje ensamblador