lab1 操作系统启动过程
实验指导书:
https://chyyuu.gitbooks.io/ucore_os_docs/content/lab1/lab1_1_goals.html
实验中可能使用到的工具:
https://chyyuu.gitbooks.io/ucore_os_docs/content/lab0/lab0_ref_ucore-tools.html
ucore源码以及参考答案
https://github.com/chyyuu/ucore_os_lab
官方问答
https://chyyuu.gitbooks.io/os_course_qa/content/
练习1:理解通过make生成执行文件的过程。
question 1
操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
这个练习只是要大家熟悉makefile以及make,不必完整的掌握makefile里面的源码,只需要知道那些命令是什么意思就够了,了解就好。这东西要你记也记不住,学习makefile和linux系统命令一样,不是一朝一夕久能学好的,需要时间的累积和经验的积累。
下面来进行分析
首先我们查看lab1下的Makefile文件
找到create ucrore.image 大概在169h
看172行 用到了两个块分别叫做kernel和bootblock,我们先展示不管这两个块的内容是什么,假设我们已经有这两个块了,先直接分析下面的代码,先全局再局部分析嘛
dd是一条linux命令指令:
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 conv=conversion:用指定的参数转换文件。 conv=notrunc:不截短输出文件
这里的意思就是说先创建一个大小为10000字节的内存块儿,然后再将bootblock和kernel拷贝过去
然后我们再去看看kernel和bootblock的内容
这里用到了很多函数 就不一一截图了,太麻烦,这两个部分主要就是通过gcc编译一些源码,源码在你的lab1/boot和lab1/kern中,暂时我们不用去追究源码写的什么内容,后面的实验会慢慢分析的。
在终端中执行输入 make V= 会看到ucore.image 的编译内容
正是我们之前说的先创建一个大小为10000字节的内存块儿,然后再将bootblock和kernel拷贝过去
其中相关参数的含义为:
-
ggdb 生成可供gdb使用的调试信息
-
m32生成适用于32位环境的代码
-
gstabs 生成stabs格式的调试信息
-
nostdinc 不使用标准库
-
fno-stack-protector 不生成用于检测缓冲区溢出的代码
-
0s 位减小代码长度进行优化
question 2
一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
查看lab1/tools/sign.c源代码