- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于x86体系结构分析linux-2.6.26的启动过程
实验报告:基于x86体系结构分析linux-2.6.26的启动过程
仅考虑32位体系结构
不考虑多核多处理器
要求1:分析流程按照开机--BIOS--grub--Linux的顺序进行,到start_kernel结束
要求2:结合几个关键的Makefile文件和缺省编译linux的输出信息,给出Linux映像的make过程分析,说明编译链接的结果有哪些?
要求3:结合GRUB和几个链接描述文件,说明GRUB是如何加载bzImage的,GRUB将跳转到内存的哪个地址上开始运行Linux,该地址的代码对应于哪个Linux源文件中的哪处?
要求4:给出Linux中的启动相关的几个关键源文件的执行顺序,分析setup和内核解压缩前后这三个阶段的主要流程(直到start_kernel)。
编译内核过程分析
首先分析linux-2.6.26的顶层Makefile文件,我们发现这里没有bzImage,不过有如下语句
其中的include?$(srctree)arch/$(ARCH)/Makefile,?对于x86架构而言,ARCH将会展开成x86,由于bzImage目标在当前的Makefile中并未找到,因此会到该Makefile中包含的子Makefile中寻找。
进入/linux-2.6.26/arch/x86/Makefile中分析代码
从图中我们可以看到bzImage是依赖于目标vmlinux的,于是下文我们将分两部分分析
1.vmlinux的生成
A.依赖分析
首先在/linux-2.6.26/Makefile中,我们找到vmlinux的定义
我们可以看出vmlinux?依赖于vmlinux-lds?,vmlinux-init?,vmlinux-main?和kallsysm.o?变量。然后我们继续查找这些变量可看到:
从这里可以看出vmlinux-init依赖于(head-y)?$(init-y),
vmlinux-main依赖于$(core-y) $(libs-y) $(drivers-y) $(net-y)
接下来我们需要分析这些是什么.我们可以找到相关的定义,如下图
由图中可以看出,首先这些*-y变量代表着不用的文件夹地址(kernel/ init/ net/等等等)
经过patsubst是实现匹配替换的,在这里将文件夹的尾部替换为/built-in.o?。例如,init-y初始值为init/经过patsubst替换为“init/built-in.o”?
在内核根目录有以下子目录:
init 内核初始化代码。提供main.c,包含start kernel函数。
kernel 内核管理代码。
mm 内存管理代码。
ipc 进程间通讯代码。
net 网络部分代码。
lib 与体系结构无关的内核库代码。
drivers 设备驱动代码。每类设备有相应的子目录,如char、
block、net
fs 文件系统代码。每个支持文件系统有相应的子目录,
如ext2、proc等。
通过上述分析,我们发现,vmlinux的生成是依赖于这些文件夹内部的built-in.o的,然后最终这些.o文件经过vmlinux-lds的链接描述规则,连接成为vmlinux.
至此,vmlinux生成依赖分析完毕。
B.生成规则
重新找到vmlinux的生成规则
其中$(call if changed rule, vmlinux)即调用rule_vmlnux__
找到rule_vmlinux__的相关定义,如下
根据定义,可以看出它的作用是调用cmd_vmlinux__最终生成并检验System.map
找到cmd_vmlinux__
可以分析出,它定义了根据vmlinux-lds的规定了链接vmlinux-init以及vmlinux-main生成vmlinux的规则。
2.bzImage的生成
首先找到/arch/x86/Makefile中bzImage的规则,如下
可以观察得知它只是一个链接,链接到文件夹下
找到/arch/x86/boot/Makefile的中bzImage
根据规则可以看出来bzImage依赖于setup.bin以及vimlinux.bin.而vmlinux.bin有指的是/compressed/vmlinux,我们需要找到compressed目录下的Makefile,如下:
根据规则可以看出来这里的vmlinux依赖于以下文件vmlinux_32.lds(本来就有),head_32.o,misc.o以及piggy.o。
其中,head_32.o以及misc.o是用于解压缩和重定位的代码,piggy.o我们可以追溯编译时的console输出情况,最终发现,piggy.o是由vmliux经过一系列过程产生的。具体过程如下
文档评论(0)