练习1
1、生成操作系统镜像文件ucore.img
生成ucore.imge的代码如下:
$(UCOREIMG): $(kernel) $(bootblock)
$(V)dd if=/dev/zero of=$@ count=10000
$(V)dd if=$(bootblock) of=$@ conv=notrunc
$(V)dd if=$(kernel) of=$@ seek=1 conv=notrunc
$(call create_target,ucore.img)
用zero块设备作为输入生成一个大小为10000B的块
然后先将bootblock即BootLoader写入块中接着是kernel
输入“make V=”
+ cc kern/init/init.c
+ cc kern/libs/readline.c
+ cc kern/libs/stdio.c
+ cc kern/debug/kdebug.c
+ cc kern/debug/kmonitor.c
+ cc kern/debug/panic.c
+ cc kern/driver/clock.c
+ cc kern/driver/console.c
+ cc kern/driver/intr.c
+ cc kern/driver/picirq.c
+ cc kern/trap/trap.c
+ cc kern/trap/trapentry.S
+ cc kern/trap/vectors.S
+ cc kern/mm/pmm.c
+ cc libs/printfmt.c
+ cc libs/string.c
+ ld bin/kernel
+ cc boot/bootasm.S
+ cc boot/bootmain.c
+ cc tools/sign.c
+ ld bin/bootblock
第140~151行是生成kernel文件。
kernel编译链接:
# kernel中头文件目录
KINCLUDE += kern/debug/ \
kern/driver/ \
kern/trap/ \
kern/mm/
# kernel的源代码目录
KSRCDIR += kern/init \
kern/libs \
kern/debug \
kern/driver \
kern/trap \
kern/mm
# 在编译选项中添加头文件包含目录
KCFLAGS += $(addprefix -I,$(KINCLUDE))
# 调用function.mk中的add_files_cc函数,将kernel的全部源文件编译,将源文件和编译生成的OBJ文件加入kernel包(packet)中
$(call add_files_cc,$(call listf_cc,$(KSRCDIR)),kernel,$(KCFLAGS))
# 将KOBJS定义为编译生成的.o文件列表(大概??)
KOBJS = $(call read_packet,kernel libs)
# create kernel target
# (在kernel前面加上bin/目录名)
kernel = $(call totarget,kernel)
# kernel目标依赖于tools/kernel.ld文件
$(kernel): tools/kernel.ld
# kernel目标依赖于编译生成的OBJ文件
$(kernel): $(KOBJS)
# 输出"+ ld bin/kernel"到控制台
@echo + ld $@
# 即命令"ld -m elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel obj/kern/init/init.o ... obj/libs/printfmt.o"
$(V)$(LD) $(LDFLAGS) -T tools/kernel.ld -o $@ $(KOBJS)
# 将OBJ文件全部反编译为汇编文件
@$(OBJDUMP) -S $@ > $(call asmfile,kernel)
# 输出OBJ文件对应的符号表
@$(OBJDUMP) -t $@ | $(SED) '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $(call symfile,kernel)
# 将kernel包和OBJ文件添加到目标依赖
$(call create_target,kernel)
bootblock:
# -------------------------------------------------------------------
# create bootblock
# bootfiles为boot/文件夹下的全部文件列表
bootfiles = $(call listf_cc,boot)
# 编译boot/文件夹下的全部文件
$(foreach f,$(bootfiles),$(call cc_compile,$(f),$(CC),$(CFLAGS) -Os -nostdinc))
# (在bootblock前面加上bin/目录名)
bootblock = $(call totarget,bootblock)
# bootblock目标的依赖项为源文件对应的OBJ文件和bin/sign
$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign)
# 输出"+ ld bin/bootblock"到控制台
@echo + ld $@
# 将OBJ文件链接为bin/boo