boot/Makefrag
#
# Makefile fragment for the JOS kernel.
# This is NOT a complete makefile;
# you must run GNU make in the top-level directory
# where the GNUmakefile is located.
#
OBJDIRS += boot
#调用这个变量的时候,将会调用$(OBJDIR)/boot/%.o: boot/%.c和$(OBJDIR)/boot/main.o: boot/main.c
BOOT_OBJS := $(OBJDIR)/boot/boot.o $(OBJDIR)/boot/main.o
$(OBJDIR)/boot/%.o: boot/%.c
@echo + cc -Os $<
@mkdir -p $(@D)
$(V)$(CC) -nostdinc $(KERN_CFLAGS) -Os -c -o $@ $<
$(OBJDIR)/boot/%.o: boot/%.S
@echo + as $<
@mkdir -p $(@D)
$(V)$(CC) -nostdinc $(KERN_CFLAGS) -c -o $@ $<
$(OBJDIR)/boot/main.o: boot/main.c
@echo + cc -Os $<
$(V)$(CC) -nostdinc $(KERN_CFLAGS) -Os -c -o $(OBJDIR)/boot/main.o boot/main.c
#V,LD,LDFLAGS都定义在GNUmakefile中
#V= LD=i386-jos-elf-ld LDFLAGS=-m elf_i386
#这里主要是链接boot.S目标文件生成可执行文件
#第一行命令:使用了 @echo 命令打印信息,表示正在进行链接操作。
#第二条命令 i386-jos-elf-ld -m elf_i386 -N -e start -Ttext 0x7C00 -o $@.out $^
#ld -m:输出为 elf 的目标格式,386是目标平台
#ld -N:将文本和数据部分设置为可读和可写。此外,不要对数据段进行页面对齐。
#ld -e:使用entry作为程序开始执行的显式符号,而不是默认的入口点。
#ld start:
#ld -Ttext 0x7C00:即,-Ttext是连接时将初始地址重定向为0x7c00(若不注明此,则程序的起始地址为0)。比如,在mbr_start.S文件中函数inb()的编译完成后在mbr_start.o中的偏移地址是0x006b,则在连接时指定-Ttext=0x7c00,连接之后其地址为0x7c6b, 其他函数调用此函数时,也就会调用地址0x7c6b,而不会是0x006b。
#-o $@.out $^:通过链接$^(指$(BOOT_OBJS))生成$@.out($(OBJDIR)/boot/boot.out)
#第三条命令
#OBJDUMP -S 显示混合了反汇编的源代码
#这条主要作用是反汇编obj/boot/boot,生boot.asm文件
#第四条命令 objcopy infile [outfile] GNU objcopy实用程序将一个对象文件的内容复制到另一个对象文件。
#OBJCOPY -S 不要从源文件复制重定位和符号信息。也删除调试段。
#OBJCOPY -O binary:输出文件格式是二进制
#-O binary 选项,它告诉 OBJCOPY 将输出文件以纯二进制格式写入磁盘,而不是生成一个特定格式的可执行文件。这对于引导加载程序或者嵌入式系统等场景很常见,因为这些环境可能需要简单的二进制文件而不是标准的可执行文件格式。
#OBJCOPY -j .text:只复制.text部分
#总的来讲,第三条命令将boot.out的.text部分复制到了boot,并且去掉了重定位和符号信息
#第五条命令 perl是一种编程语言,看看chagpt对sign.pl的分析:
#这个Perl脚本似乎是用来修改引导块文件的。它打开了命令行参数中指定的文件,读取了前1000个字节,并检查其大小是否大于510个字节。如果是,则打印错误消息并退出。否则,它会添加空字节以填充引导块到510字节,并在末尾添加字节0x55和0xAA。
#修改引导块后,将修改后的内容写回同一文件。
#这个脚本可能用于确保引导块文件符合引导操作系统或设备所需的特定大小和格式要求。
$(OBJDIR)/boot/boot: $(BOOT_OBJS)
@echo + ld boot/boot
$(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o $@.out $^
$(V)$(OBJDUMP) -S $@.out >$@.asm
$(V)$(OBJCOPY) -S -O binary -j .text $@.out $@
$(V)perl boot/sign.pl $(OBJDIR)/boot/boot