基于x86的linux.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于x86的linux

基于x86的linux2.6.26代码分析 由Makefile分析bzImage的生成过程 内核配置完毕之后使用命令make bzImage生成内核镜像文件,这里使用的make规则默认是源代码目录linux-2.6.26(以后定为SOURCE_HOME).打开SOURCE_HOME/Makefile发现其中的target是vmlinux,没有发现命令中指定的目标bzImage.由于makefile 文件可以包含其他的make规则最后发现SOURCE_HOME/Makefile多处出现下面的一句话(431行) 图1 其中$SRCARCH是平台的架构这里是X86,这句话显然包含了SOURCE_HOME/arch/x86/Makefile,打开这个文件继续寻找目标bzImage有如下发现: 图2 212行规定生成的bzImage的位置在SOURCE_HOME/arch/x86/boot/下面. 215行发现bzImage生成依赖于vmlinux. Vmlinux的生成 显然vmlinux是SOURCE_HOME/Makefile中的规则负责生成的. 图3 这个vmlinux的生产依赖于后面的几个目标,这些目标如下 图4 图5 从上面的规则可以清楚看出vmlinux的生成用到了SOURCE_HOME下面的这些目录:kernel/,mm/,fs/,ipc/,security/, crypto/,kblock/,init/,lib/,net/,/drivers/, Vmlinux到最后直接依赖的是vmlinux.o,kallsyms.o,和上面所说那些目录下的built-in.o. built-in.o是如何生成的 图6 上图主Makefile838行调用了scripts/Makefile.build对保存在vmlinux-dirs目录中的内容进行编译 图7 可以看到vmlinux-dirs包括SOURCE_HOME下面的init,drivers,net,lib,kernel,mm,fs,ipc.security,crypto,block这些和体系结构无关的目录内容. 在scripts/Makefile.build83行看到每个目录生成的结构都保存在built-in.o中,这就生成了vmlinux所依赖的部分文件. 有了built-in.o还需要vmlinux.o和kallsyms.o vmlinux.o的生成方式 vmlinux.o依赖的vmlinux-main上一节讲过就是那些built-in.o.现在缺少的是$(modpost-init) 查找$(modpost-init)发现图5822行:modpost-init包括了vmlinux-init中除了init/built-in.o之外的那些文件. vmlinux-init := $(head-y) $(init-y) init-y是init/built-in.o,回头看图5822行这么做的原因可能是不想多次包含init/built-in.o. $(head-y)在主Makefile没找到,既然包含了x86/Makefile就去找吧: 在这里又发现其实主Makefile中定义的core-y,lib-y等又加入了和体系结构相关x86目录下的一些东西.而head-y如下: 图8 可见head-y包含了x86/kernel/下面的head_32.o,head32.o,init_task.o 至此vmlinux.o的生产条件已经满足了. 图9 Kallsyms其实是script下的一个命令,主Makefile在757-759行生成了内核的全部符号表并且把这些符号交给scripts/kallsyms处理.处理的结果可以打开SOURCE_HOME下的..tmp_kallsymsX.o.cmd查看,这里的X代表1/2. 图10 从图中看到这个命令生成的是kallsyms.o依赖的.tmp_kallsymsX.o.至此kallsyms.o生成的条件完全满足了. 最后从主Makefile看出又分了三步一步一步修正vmlinux和kallsyms.o最终生成主目录下的vmlinux. 最后查看bzImage是如何生成的,方法是查看编译时的输出信息: 在上图的970行中vmlinux生成了.然而不是最终的bzImage. 从上图983-989,1007-1011行看到vmlinux显然又经过了一些变化,生成的目标都放在compress和boot目录下.到compress目录下查看发现几个命令文件,这些命令文件是编译时的输出,比较详细. 首先是.vmlinux.cmd文件他的目标又是一个vmlinux,目的地是本目录. cmd_arch/x86/boot/compressed/vmlinux := ld -m

文档评论(0)

xjj2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档