TARGET := riscv64gc-unknown-none-elf KERNEL_ENTRY := 0x80200000 MODE := release KERNEL_ELF := target/$(TARGET)/$(MODE)/os KERNEL_BIN := $(KERNEL_ELF).bin SYMBOL_MAP := target/system.map QEMU_CMD_PATH := /Users/zhangxinyu/Downloads/qemu-7.0.0/build/qemu-system-riscv64 QEMU_PID = $(shell ps aux | grep "[q]emu-system' | awk '{print $$2}") OBJDUMP := rust-objdump --arch-name=riscv64 OBJCOPY := rust-objcopy --binary-architecture=riscv64 RUST_FLAGS := -Clink-arg=-Tsrc/linker.ld # 使用我们自己的链接脚本 RUST_FLAGS += -Cforce-frame-pointers=yes # 强制编译器生成帧指针 RUST_FLAGS:=$(strip ${RUST_FLAGS}) # 编译elf文件 build_elf: clean CARGO_BUILD_RUSTFLAGS="$(RUST_FLAGS)" \ cargo build --$(MODE) --target=$(TARGET) # 导出一个符号表, 供我们查看 $(SYMBOL_MAP):build_elf nm $(KERNEL_ELF) | sort > $(SYMBOL_MAP) # 丢弃内核可执行elf文件中的元数据得到内核镜像 $(KERNEL_BIN): build_elf @$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $@ debug:build_elf $(KERNEL_BIN) $(SYMBOL_MAP) kill $(QEMU_CMD_PATH) \ -machine virt \ -display none \ -daemonize \ -bios ../bootloader/rustsbi-qemu.bin \ -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY) \ -s -S run:build_elf $(KERNEL_BIN) $(SYMBOL_MAP) kill $(QEMU_CMD_PATH) \ -machine virt \ -nographic \ -bios ../bootloader/rustsbi-qemu.bin \ -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY) clean: rm -rf ./target* kill: -kill -9 $(QEMU_PID)