Lesson01-利用Makefile创建内核镜像文件kernel8.img

编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。
在MakeFile里的构建过程分为3步:
1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。
2.将.o文件经过链接生成.elf可执行文件。
3.将.elf文件转换成二进制的.img镜像文件。

#变量-交叉编译工具
ARMGNU ?= aarch64-linux-gnu
#变量-编译可选参数
COPS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only
#变量-汇编可选参数
ASMOPS = -Iinclude

#变量-源文件目录
SRC_DIR = src
#变量-生成文件目录
BUILD_DIR = build

#构建-all首个构建对象
all: kernel8.img

#构建-clean
clean: 
	rm -rf $(BUILD_DIR) *.img

#构建-.c变.o
$(BUILD_DIR)/*_c.o: $(SRC_DIR)/*.c
	mkdir -p $(@D)
	$(ARMGNU)-gcc $(COPS) -MMD -c -o $@ $< 
#构建-.S变.o
$(BUILD_DIR)/*_S.o: $(SRC_DIR)/*.S
	$(ARMGNU)-gcc $(ASMOPS) -MMD -c -o $@ $<

#变量-.c文件
C_FILES = $(wildcard $(SRC_DIR)/*.c)
#变量-.S文件
ASM_FILES = $(wildcard $(SRC_DIR)/*.S)

#变量-.o文件
OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o)
OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_S.o)

#变量-.d文件
DEP_FILES = $(OBJ_FILES:%.o=%.d)

#函数-包含依赖.d文件
-include $(DEP_FILES)

#构建-.o变.elf .elf变.img
kernel8.img: $(SRC_DIR)/linker.ld $(OBJ_FILES)
	$(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES)
	$(ARMGNU)-objcopy  $(BUILD_DIR)/kernel8.elf -O binary kernel.img