Makefile para Ajustar el Image Base de bootloader_x86.asm

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: Usa ld para 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 arquitectura i386.
    • bootloader_x86.bin: Usa objcopy para convertir el ELF en un binario crudo.
  • Generación de objetos: Usa nasm para ensamblar el archivo fuente (bootloader_x86.asm) a un objeto ELF para arquitectura i386.
  • Regla de limpieza: Borra los archivos generados con el comando make clean.

Cómo Usarlo

  1. Guarda este código en un archivo llamado Makefile en el directorio que contiene bootloader_x86.asm.
  2. Ejecuta el comando make para generar el binario final bootloader_x86.bin.
  3. Prueba el binario en un emulador como qemu con el siguiente comando:
  4. 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

  1. Ensamblado con nasm:
    nasm -f elf bootloader_x86.asm -o bootloader_x86.o
    • Qué hace: Convierte el código ensamblador bootloader_x86.asm en un archivo objeto bootloader_x86.o en formato ELF.
    • Formato: Usa -f elf para indicar que el archivo objeto será para arquitectura x86 (32 bits).
  2. 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.o en un archivo ELF ejecutable bootloader_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.
  3. Generación del binario con objcopy:
    objcopy -O binary bootloader_x86.elf bootloader_x86.bin
    • Qué hace: Convierte el archivo ELF bootloader_x86.elf en un archivo binario puro bootloader_x86.bin.
    • Formato: Usa -O binary para eliminar metadatos y dejar únicamente las instrucciones en formato crudo.

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 qemu para probar el archivo binario con el siguiente comando:
  • qemu-system-i386 -drive format=raw,file=bootloader_x86.bin
  • Si pruebas en hardware real, flashea el archivo binario en el dispositivo de almacenamiento adecuado.

Destacado

Bootloader Avanzado en Ensamblador

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