练习1
理解通过 make 生成执行文件的过程。(要求在报告中写出对下述问题的回答)
在此练习中,大家需要通过阅读代码来了解:
1. 操作系统镜像文件 ucore.img 是如何一步一步生成的?(需要比较详细地解释 Makefile 中
每一条相关命令和命令参数的含义,以及说明命令导致的结果)
2. 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
1.1
首先先执行make V=
命令查看具体执行关于生成kernel和bootblock的相关命令
首先生成ucore.img
需要先生成kernel
、bootblock
1)生成kernel
代码
$(kernel): tools/kernel.ld
$(kernel): $(KOBJS)
@echo "bbbbbbbbbbbbbbbbbbbbbb$(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)
由截图可知显示进行了一连串的
+ cc kern/debug/kdebug.c
gcc -Ikern/debug/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/kdebug.c -o obj/kern/debug/kdebug.o
等等类似的命令用来生成init.o
、readline.o
、stdio.o
、kdebug.o
、monitor.o
panic.o
clock.o
console.o
intr.o
picirq.o
trap.o
、trapentry.o
、vectors.o
、pmm.o
、printfmt.o
、string.o
具体参数,查阅资料罗列如下:
- ggdb 生成可供gdb使用的调试信息
- m32 生成适用于32位环境的代码
- gstabs 生成stabs格式的调试信息
- nostdinc 不使用标准库
- fno-stack-protector 不生成用于检测缓冲区溢出的代码
- Os 为减小代码大小而进行优化
- I
添加搜索头文件的路径
fno-builtin 不进行builtin函数的优化
然后利用
ld -m elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel obj/kern/init/init.o obj/kern/libs/readline.o obj/kern/libs/stdio.o obj/kern/debug/kdebug.o obj/kern/debug/kmonitor.o obj/kern/debug/panic.o obj/kern/driver/clock.o obj/kern/driver/console.o obj/kern/driver/intr.o obj/kern/driver/picirq.o obj/kern/trap/trap.o obj/kern/trap/trapentry