上篇文章《自己动手写一个操作系统——MBR(1)》,我们使用 dd 生成了一个 512 字节的镜像,并用 vim 将其最后两个字节修改成了 55 AA,以此来完成了 MBR 的构建。这种办法终归上不了台面,而且还需要手动操作,无法纳入自动化编译工程中。今天,我们就介绍另外一种办法来完成这件事情。
首先,编写一份汇编代码 mbr.S
.global _start
_start:
jmp _start
.org 0x1fe
.byte 0x55, 0xAA
Makefile
OUTPUT=output
all: clean
as --32 -o ${OUTPUT}/mbr.o mbr.S # 汇编
ld -m elf_i386 ${OUTPUT}/mbr.o -o ${OUTPUT}/mbr.elf # 链接
objcopy -O binary ${OUTPUT}/mbr.elf ${OUTPUT}/mbr.bin # elf --> bin
dd if=${OUTPUT}/mbr.bin of=${OUTPUT}/mbr.img conv=notrunc # bin --> img
clean:
-rm ${OUTPUT}/*
run:
qemu-system-i386 -daemonize -m 128M -drive file=${OUTPUT}/mbr.img,index=0,media=disk,format=raw \
#-s -S
然后执行 make 就 OK 了。
检查一下
org 的功能是告诉编译器:“嘿,老兄,你帮我把后面所有数据(指令和数据)的地址以 xxxx 为起始开始编吧”。