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
enCR0
. - 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
- 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_kernel
para leer el kernel desde el disco.
Tags
Lenguaje ensamblador