跳转至

自制操作系统_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

https://github.com/StevenBaby/computer/blob/main/x86_assembly/docs/Ubuntu%20%E9%85%8D%E7%BD%AE%20bochs%20%E7%9A%84%E6%96%B9%E6%B3%95.md

sudo apt install bochs-x

bximage -hd -mode="flat" -size=60 -q master.img

0xaa55

魔数,就是用来检测错误;

  • A 1010
  • 5 0101
  • 1010101001010101

0x7c00

  • IBM PC 5150
  • DOS 1.0

32K = 0x8000

栈:一般会放在内存的最后,因为栈时向下增长的;

32k - 1k = 0x7c00

grub

  • multiboot / 多系统启动

参考文献