自制操作系统_04_makefile现阶段状态, 以及bootloader的一些说明
BUILD_PATH:=../build
SRC:= ./
# 内核的执行位置
KERNEL_ENTRY_POINT := 0x10000
# boot的编译
$(BUILD_PATH)/boot/%.bin:$(SRC)/boot/%.asm
$(shell mkdir -p $(dir $@))
nasm -f bin $< -o $@
# kernel的编译, 把start.asm 编译成elf格式的 start.o
$(BUILD_PATH)/kernel/%.o:$(SRC)/kernel/%.asm
$(shell mkdir -p $(dir $@))
nasm -f elf32 $< -o $@
# kernel的编译, 需要依赖上面的 start.o
# 使用链接器将目标文件starrt.o链接成一个静态链接的文件
# 且重新编排指定程序的入口地址(_start符号)为 KERNEL_ENTRY_POINT 定义的地址,并将生成的可执行文件输出为 $@ 定义的文件名
$(BUILD_PATH)/kernel.bin:$(BUILD_PATH)/kernel/start.o
$(shell mkdir -p $(dir $@))
ld -m elf_i386 -static $^ -o $@ -Ttext $(KERNEL_ENTRY_POINT)
# elf文件从磁盘进入内存还需要特殊处理, 使用这种方式, 直接读入内存
# objcopy -O binary 输出文件中只包含了输入文件的纯二进制数据,没有任何 ELF 文件格式的头部信息
# 如数据段, 代码段等
$(BUILD_PATH)/system.bin: $(BUILD_PATH)/kernel.bin
objcopy -O binary $< $@
# kernel的符号表
$(BUILD_PATH)/system.map: $(BUILD_PATH)/kernel.bin
nm $< | sort > $@
# 创建镜像文件
$(BUILD_PATH)/master.img: $(BUILD_PATH)/boot/boot.bin \
$(BUILD_PATH)/boot/loader.bin \
$(BUILD_PATH)/system.bin \
$(BUILD_PATH)/system.map
yes | bximage -q -hd=16 -func=create -sectsize=512 -imgmode=flat $@
dd if=$(BUILD_PATH)/boot/boot.bin of=$@ bs=512 count=1 conv=notrunc
dd if=$(BUILD_PATH)/boot/loader.bin of=$@ bs=512 seek=2 count=4 conv=notrunc
dd if=$(BUILD_PATH)/system.bin of=$@ bs=512 seek=10 count=200 conv=notrunc
# 清理
.PHONY:clean
clean:
@rm -rf $(BUILD_PATH)/boot
test: $(BUILD_PATH)/master.img
# 启动系统
.PHONY:bochs
bochs: $(BUILD_PATH)/master.img
@rm -rf *lock
bochs -q
bootloader的说明¶
- boot.asm
- loader.asm
bootloader 的主要功能就是从 BIOS 加载内核,并且提供内核需要的参数。
bochs-x¶
0xaa55¶
魔数,就是用来检测错误;
- A 1010
- 5 0101
- 1010101001010101
0x7c00¶
- IBM PC 5150
- DOS 1.0
32K = 0x8000
栈:一般会放在内存的最后,因为栈时向下增长的;
32k - 1k = 0x7c00
grub¶
- multiboot / 多系统启动