Makefile Actualizado
El siguiente Makefile incluye soporte para múltiples arquitecturas con detección condicional de acuerdo con la variable ARCH. Las configuraciones predeterminadas están optimizadas para ensambladores y enlazadores.
Descripción modular
bootloader.asm: Contiene la configuración básica del sistema y la lógica para cargar la segunda etapa del bootloader (Stage 2).x86.asm: Código optimizado para sistemas de 32 bits (x86) con configuración inicial de hardware y periféricos.x86_64.asm: Módulo preparado para sistemas de 64 bits (x86_64), incluyendo configuraciones avanzadas como GPIO, UART, y temporizadores.
Cambios implementados
- Punto de entrada (
-e _start):- El enlazador usará la etiqueta
_startcomo el punto inicial del programa.
- El enlazador usará la etiqueta
- Objetivo principal (
all):- Ahora incluye automáticamente todos los objetivos (
bootloader,graphics,architecture, ylink).
- Ahora incluye automáticamente todos los objetivos (
- Limpieza explícita (
clean):- Elimina todos los archivos generados (*.o y el binario final
system.bin).
- Elimina todos los archivos generados (*.o y el binario final
- Compatibilidad con múltiples arquitecturas (
ARCH):- Puedes cambiar entre las arquitecturas (
x86,x86_64,arm,risc) usando el argumentoARCH.
- Puedes cambiar entre las arquitecturas (
- Uso de
.PHONY:- Evita conflictos con nombres de archivos reales en el directorio.
Makefile
ASM=nasm
ARM_ASM=arm-none-eabi-as
RISC_ASM=riscv64-unknown-elf-as
LD=ld
ASM_FLAGS_32=-f elf32
ASM_FLAGS_64=-f elf64
LD_FLAGS=--oformat binary -Ttext 0x7C00
# Detectar la arquitectura especificada como variable (por defecto x86_64)
ARCH ?= x86_64
ifeq ($(ARCH), x86)
ASM_FLAGS=$(ASM_FLAGS_32)
ARCH_SRC=architecture/x86.asm
LD_ARCH=architecture/x86.o
else ifeq ($(ARCH), x86_64)
ASM_FLAGS=$(ASM_FLAGS_64)
ARCH_SRC=architecture/x86_64.asm
LD_ARCH=architecture/x86_64.o
else ifeq ($(ARCH), arm)
ASM=$(ARM_ASM)
ASM_FLAGS=
ARCH_SRC=architecture/arm_support.asm
LD_ARCH=architecture/arm_support.o
else ifeq ($(ARCH), risc)
ASM=$(RISC_ASM)
ASM_FLAGS=
ARCH_SRC=architecture/risc_support.asm
LD_ARCH=architecture/risc_support.o
else
$(error "Arquitectura desconocida: $(ARCH)")
endif
# Marcamos los objetivos como phony para evitar conflictos
.PHONY: all bootloader graphics architecture link clean
# Objetivo principal
all: bootloader graphics architecture link
# Compilación del bootloader
bootloader:
$(ASM) $(ASM_FLAGS) -o bootloader/bootloader.o bootloader/bootloader.asm
# Compilación del módulo de gráficos
graphics:
$(ASM) $(ASM_FLAGS) -o graphics/graphics.o graphics/graphics.asm
# Compilación específica de la arquitectura
architecture:
$(ASM) $(ASM_FLAGS) -o $(LD_ARCH) $(ARCH_SRC)
# Enlace final de los módulos
link:
$(LD) $(LD_FLAGS) -e _start -o system.bin bootloader/bootloader.o $(LD_ARCH) graphics/graphics.o
# Limpieza de los archivos generados
clean:
rm -f bootloader/*.o architecture/*.o graphics/*.o system.bin
Instrucciones paso a paso
Para compilar este Makefile, sigue los pasos a continuación:
1. Compilar para una arquitectura específica
# Para x86:
make ARCH=x86
# Para x86_64:
make ARCH=x86_64
# Para ARM:
make ARCH=arm
# Para RISC-V:
make ARCH=risc
2. Limpieza de archivos generados
Ejecuta el siguiente comando para eliminar los archivos objeto generados y el binario:
make clean
3. Depuración
Activa el modo de depuración para rastrear el proceso de compilación:
make ARCH=x86 --debug=v
Notas adicionales
- Asegúrate de que los ensambladores
nasm,arm-none-eabi-as, yriscv64-unknown-elf-asestén correctamente instalados y configurados en tu sistema. - Verifica que los archivos fuente (
bootloader.asm,x86.asm,x86_64.asm, etc.) estén en las rutas especificadas en el Makefile.
Tags
Lenguaje ensamblador
