Archivo: bootloader_x86.asm
section .text
global _start
_start:
; Configuración inicial del procesador
cli ; Desactiva interrupciones
xor rax, rax ; Limpia el registro RAX
mov ds, ax ; Configura el segmento de datos
mov es, ax ; Configura el segmento adicional
mov fs, ax ; Configura el segmento FS
mov gs, ax ; Configura el segmento GS
; Inicialización de la memoria
xor rdi, rdi ; Limpia RDI
mov rdi, 0x7C00 ; Dirección de carga del bootloader
mov rcx, 512 ; Tamaño de un sector estándar
rep stosb ; Rellena con ceros el espacio asignado
; Configuración del puerto serie para comunicación
mov dx, 0x3F8 ; Puerto serie (COM1)
mov al, 0x80 ; Configura divisor de velocidad baud
out dx, al ; Escribe el valor en el puerto
mov dx, 0x3F8 ; Puerto serie
mov al, 'X' ; Mensaje a enviar (carácter ASCII)
out dx, al ; Envía el carácter al puerto
; Cargar etapa 2 del bootloader
mov rsi, 0x7C00 ; Dirección de inicio de la segunda etapa
mov rdi, 0x1000 ; Dirección destino
mov rcx, 256 ; Número de palabras a copiar
rep movsq ; Copia la etapa 2 a la dirección destino
; Salta a la segunda etapa
jmp 0x1000 ; Transferir control a la etapa 2
section .data
mensaje db "Bootloader x64 inicializado.", 0
Makefile para Ajustar el "Image Base"
Este Makefile establece explícitamente el "image base" para generar un archivo ELF con la dirección deseada y luego lo convierte en un binario crudo.
Archivo: Makefile
AS = nasm
LD = ld
OBJCOPY = objcopy
OBJ = bootloader_x86.o
# Image base para ELF
IMAGE_BASE = 0x7C00
all: bootloader_x86.bin
bootloader_x86.elf: $(OBJ)
$(LD) -Ttext $(IMAGE_BASE) -e _start --image-base $(IMAGE_BASE) -m i386pe -o bootloader_x86.elf $(OBJ)
bootloader_x86.bin: bootloader_x86.elf
$(OBJCOPY) -O binary bootloader_x86.elf bootloader_x86.bin
%.o: %.asm
$(AS) -f elf $< -o $@
clean:
rm -f *.o *.elf *.bin
Explicación del Makefile
- Variables:
IMAGE_BASE: Define la dirección base de memoria en la que se cargará el ELF (0x7C00).
- Reglas:
bootloader_x86.elf:Usaldpara generar un archivo ELF con:-Ttext $(IMAGE_BASE): Define la dirección base para la sección.text.--image-base $(IMAGE_BASE): Ajusta el "image base".-m i386pe: Genera un archivo PE para la arquitecturai386.
bootloader_x86.bin:Usaobjcopypara convertir el ELF en un binario crudo.
- Generación de objetos: Usa
nasmpara ensamblar el archivo fuente (bootloader_x86.asm) a un objeto ELF para arquitecturai386. - Regla de limpieza: Borra los archivos generados con el comando
make clean.
Cómo Usarlo
- Guarda este código en un archivo llamado
Makefileen el directorio que contienebootloader_x86.asm. - Ejecuta el comando
makepara generar el binario finalbootloader_x86.bin. - Prueba el binario en un emulador como
qemucon el siguiente comando:
qemu-system-i386 -drive format=raw,file=bootloader_x86.bin
Notas Adicionales
- Este Makefile se adapta mejor para generar bootloaders con formato ELF.
- Si necesitas personalizar la dirección
IMAGE_BASE, simplemente cámbiala en la definición del Makefile.
Comando: make
loadsManager/bootloader_x86$ make
nasm -f elf bootloader_x86.asm -o bootloader_x86.o
ld -Ttext 0x7C00 -e _start --image-base 0x7C00 -m i386pe -o bootloader_x86.elf bootloader_x86.o
objcopy -O binary bootloader_x86.elf bootloader_x86.bin
Interpretación del Proceso de Compilación del Bootloader_x86.bin
El comando make ejecutó correctamente las instrucciones para compilar, enlazar y generar el archivo binario del bootloader bootloader_x86.bin. Aquí está el desglose:
Etapas del Proceso
-
Ensamblado con
nasm:nasm -f elf bootloader_x86.asm -o bootloader_x86.o
- Qué hace: Convierte el código ensamblador
bootloader_x86.asmen un archivo objetobootloader_x86.oen formato ELF. - Formato: Usa
-f elfpara indicar que el archivo objeto será para arquitectura x86 (32 bits).
- Qué hace: Convierte el código ensamblador
-
Enlace con
ld:ld -Ttext 0x7C00 -e _start --image-base 0x7C00 -m i386pe -o bootloader_x86.elf bootloader_x86.o
- Qué hace: Convierte el archivo objeto
bootloader_x86.oen un archivo ELF ejecutablebootloader_x86.elf. - Opciones importantes:
-Ttext 0x7C00: Define la dirección de carga para la sección.text.-e _start: Especifica el punto de entrada del programa.--image-base 0x7C00: Ajusta la dirección base de la imagen.-m i386pe: Genera un archivo compatible con arquitectura x86 (32 bits) en formato PE.
- Qué hace: Convierte el archivo objeto
-
Generación del binario con
objcopy:objcopy -O binary bootloader_x86.elf bootloader_x86.bin
- Qué hace: Convierte el archivo ELF
bootloader_x86.elfen un archivo binario purobootloader_x86.bin. - Formato: Usa
-O binarypara eliminar metadatos y dejar únicamente las instrucciones en formato crudo.
- Qué hace: Convierte el archivo ELF
Significado General
El archivo binario generado (bootloader_x86.bin) está listo para ejecutarse como un bootloader desde la dirección 0x7C00. Es un formato ideal para cargar directamente en memoria o flashear en un dispositivo.
Próximos Pasos
- Usa un emulador como
qemupara probar el archivo binario con el siguiente comando:
qemu-system-i386 -drive format=raw,file=bootloader_x86.bin
Tags
Lenguaje ensamblador
