查看 makefile
文件
我们利用的是 make 命令
在 makefile 中,首先是对一些内容的初始化
判断了对应的 格式
定义对应的编译器是 gcc 和 clang ,和他们的用到的 flags 标志
然后有个 include tools/function.mk
我们要去查看这个的内容
# create ucore.img
UCOREIMG := $(call totarget,ucore.img)
$(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)
在这个创建之前,首先要创建 kernel
bootblock
这两个
kernel
# include kernel/user
INCLUDE += libs/
CFLAGS += $(addprefix -I,$(INCLUDE))
LIBDIR += libs
$(call add_files_cc,$(call listf_cc,$(LIBDIR)),libs,)
# -------------------------------------------------------------------
# kernel
KINCLUDE += kern/debug/ \\
kern/driver/ \\
kern/trap/ \\
kern/mm/
KSRCDIR += kern/init \\
kern/libs \\
kern/debug \\
kern/driver \\
kern/trap \\
kern/mm
KCFLAGS += $(addprefix -I,$(KINCLUDE))
$(call add_files_cc,$(call listf_cc,$(KSRCDIR)),kernel,$(KCFLAGS))
KOBJS = $(call read_packet,kernel libs)
# create kernel target
kernel = $(call totarget,kernel)
$(kernel): tools/kernel.ld
$(kernel): $(KOBJS)
@echo + ld $@
$(V)$(LD) $(LDFLAGS) -T tools/kernel.ld -o $@ $(KOBJS)
@$(OBJDUMP) -S $@ > $(call asmfile,kernel)
@$(OBJDUMP) -t $@ | $(SED) '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $(call symfile,kernel)
$(call create_target,kernel)
首先调用 $(call add_files_cc,$(call listf_cc,$(LIBDIR)),libs,)
其中
add_files_cc = $(call add_files,$(1),$(CC),$(CFLAGS) $(3),$(2),$(4))
listf_cc = $(call listf,$(1),$(CTYPE))
add_files_cc 中的 add_files
listf
在 tools/function.mk
中
其中 listf
是列出目录下所有符合某种 type
的文件,如果规定了文件类型,那么用 addprefix
构造一个 pattern
,之后用 wildcard
得到该目录下所有的文件。
add_files
调用了 do_add_files_to_packet
define do_add_files_to_packet
__temp_packet__ := $(call packetname,$(4))
ifeq ($$(origin $$(__temp_packet__)),undefined)
$$(__temp_packet__) :=
endif
__temp_objs__ := $(call toobj,$(1),$(5))
$$(foreach f,$(1),$$(eval $$(call cc_template,$$(f),$(2),$(3),$(5))))
$$(__temp_packet__) += $$(__temp_objs__)
endef
如果未定义 初始化为 空
然后利用 toobj 获得对应的 目录 然后进行编译后 放到对应的 目录下 对应的
后续操作
KINCLUDE存放kernel代码的引用目录,KSRCDIR存放kernel的源码目录,KCFLAGS存放kernel的编译选项
编译kern文件夹下的源代码,编译号的obj文件会放在obj目录下
KOBJS = $(call read_packet,kernel libs)
依次读取__objs_kernel和__objs_libs这两个变量中的文件序列,并返回给KOBJS
最后 使用tools/kernel.ld脚本链接所有目标文件
bootblock
# create bootblock
bootfiles = $(call listf_cc,boot)
$(foreach f,$(bootfiles),$(call cc_compile,$(f),$(CC),$(CFLAGS) -Os -nostdinc))
bootblock = $(call totarget,bootblock)
$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign)
@echo + ld $@
$(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 $^ -o $(call toobj,bootblock)
@$(OBJDUMP) -S $(call objfile,bootblock) > $(call asmfile,bootblock)
@$(OBJCOPY) -S -O binary $(call objfile,bootblock) $(call outfile,bootblock)
@$(call totarget,sign) $(call outfile,bootblock) $(bootblock)
$(call create_target,bootblock)
bootblock是BIOS中一段特定的区域,包含有用于引导的最小指令集,正常的BIOS升级操作不能消除这段信息。如果BIOS升级失败,可以利用bootblock来重新恢复。
bootfiles = $(call listf_cc,boot)
列出boot/下的所有.c.S文件;