xv6.img 的生成过程如下:
1:# build the own boot sector disk image
obj/xv6.img: obj/bootblock
dd if=/dev/zero of=obj/xv6.img count=10000 // 使用空白字符填充 xv6.img,即初始化 xv6.img
dd if=obj/bootblock of=obj/xv6.img conv=notrunc// 以 bootblock 为输入,不截断输出到 xv6.img,生成最终的硬盘镜像
# build bootloader
obj/bootblock: bootloader/bootasm.S bootloader/bootmain.c tools/sign
1: $(CC) $(CFLAGS) -O -nostdinc -Iinclude -Iinclude/x86 -c bootloader/bootmain.c -o obj/bootmain.o
//-c表示完成编译工作但不链接,最终以目标文件形式输出; 编译bootmain.c,不调用标准c头文件,并且只生成目标文件不链接
$(CC) $(CFLAGS) -nostdinc -Iinclude -Iinclude/x86 -c bootloader/bootasm.S -o obj/bootasm.o
//编译bootasm.S,不调用标准c头文件,并且只生成目标文件bootasm.o不连接
$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o obj/bootblock.o obj/bootasm.o obj/bootmain.o
//链接bootasm.o和bootmain.o生成bootblock.o并且将程序入口函数设定为start,令start的内存地址为0x7c00
// -N允许代码段数据段可读可写,取消数据段页对齐,禁止链接共享库
//-e 决定程序入口地址 比如
//-Ttext 设定函数地址 0x7c00
$(OBJDUMP) -S obj/bootblock.o > obj/bootblock.asm
$(OBJCOPY) -S -O binary obj/bootblock.o obj/bootblock.out
//将bootblock.o中的内容复制到bootblock.out中,并且声明不复制重分配和符号信息
tools/sign obj/bootblock.out obj/bootblock
//生成引导扇区的内容
# sign tool used to build boot sector
tools/sign: tools/sign.c
$(HOSTCC) -O2 -o tools/sign tools/sign.c
# clean the produced files
clean:
rm -f obj/* tools/sign
# run in QEMU emulator for x86 architecture
qemu: obj/xv6.img
qemu -parallel stdio -hda obj/xv6.img
# run in BOCHS emulator for x86 architecture
bochs: obj/xv6.img
bochs -q -f tools/xv6bochsrc.bxrc