




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于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行)图其中$SRCARCH是平台的架构这里是X86,这句话显然包含了SOURCE_HOME/arch/x86/Makefile,打开这个文件继续寻找目标bzImage有如下发现:图212行规定生成的bzImage的位置在SOURCE_HOME/arch/x86/boot/下面.215行发现bzImage生成依赖于vmlinux.Vmlinux的生成显然vmlinux是SOURCE_HOME/Makefile中的规则负责生成的.图这个vmlinux的生产依赖于后面的几个目标,这些目标如下图图从上面的规则可以清楚看出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是如何生成的图上图主Makefile838行调用了scripts/Makefile.build对保存在vmlinux-dirs目录中的内容进行编译图可以看到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.ovmlinux.o的生成方式vmlinux.o依赖的vmlinux-main上一节讲过就是那些built-in.o.现在缺少的是$(modpost-init)查找$(modpost-init)发现图822行:modpost-init包括了vmlinux-init中除了init/built-in.o之外的那些文件.vmlinux-init := $(head-y) $(init-y)init-y是init/built-in.o,回头看图822行这么做的原因可能是不想多次包含init/built-in.o.$(head-y)在主Makefile没找到,既然包含了x86/Makefile就去找吧:在这里又发现其实主Makefile中定义的core-y,lib-y等又加入了和体系结构相关x86目录下的一些东西.而head-y如下:图可见head-y包含了x86/kernel/下面的head_32.o,head32.o,init_task.o至此vmlinux.o的生产条件已经满足了.图Kallsyms其实是script下的一个命令,主Makefile在757-759行生成了内核的全部符号表并且把这些符号交给scripts/kallsyms处理.处理的结果可以打开SOURCE_HOME下的.tmp_kallsymsX.o.cmd查看,这里的X代表1/2.图从图中看到这个命令生成的是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 elf_i386 -T arch/x86/boot/compressed/vmlinux_32.lds arch/x86/boot/compressed/head_32.o arch/x86/boot/compressed/misc.o arch/x86/boot/compressed/piggy.o -o arch/x86/boot/compressed/vmlinux可见他的输出文件是一个elf可执行文件,依赖于vmlinux_32.lds这个文件本来就有;misc.o,和head_32.o是运行时进行解压缩和重定位的代码.目录中有同名命令生成.而piggy.o还要去找.打开.piggy.o.cmdcmd_arch/x86/boot/compressed/piggy.o := ld -m elf_i386 -r -format binary -oformat elf32-i386 -T arch/x86/boot/compressed/vmlinux.scr arch/x86/boot/compressed/vmlinux.bin.gz -o arch/x86/boot/compressed/piggy.o这里发现piggy.o是吧vmlinux.bin.gz链接而成的.在去找vmlinux.bin.gz的生成.打开.vimlnux.bin.gz.cmdcmd_arch/x86/boot/compressed/vmlinux.bin.gz := gzip -f -9 arch/x86/boot/compressed/vmlinux.bin.gz很显然他使用了gzip命令把vmlinux.bin.all压缩后存放到comprssed/vmlinux.bin.gz在去找vmlinux.bin.all.同样打开同名文件.vmlinux.bin.all.cmdcmd_arch/x86/boot/compressed/vmlinux.bin.all := cat arch/x86/boot/compressed/vmlinux.bin arch/x86/boot/compressed/vmlinux.relocs arch/x86/boot/compressed/vmlinux.bin.all可见这个文件吧vmlinux.bin和vmlinux.relocs简单的合并成了vmlinux.bin.all在查看.vmlinux.bin.cmdcmd_arch/x86/boot/compressed/vmlinux.bin := objcopy -R .comment -S vmlinux arch/x86/boot/compressed/vmlinux.bin这个文件是用objcopy把原来主Makefile生成的vmlinux拷贝为二进制文件打开.vmlinux.relocs发现cmd_arch/x86/boot/compressed/vmlinux.relocs := arch/x86/boot/compressed/relocs vmlinux arch/x86/boot/compressed/vmlinux.relocs;arch/x86/boot/compressed/relocs -abs-relocs vmlinux说明vmlinux.relocs是把vmlinux的定位符提取出来,然后又用compressed/relocs把原来的vmlinux进行重定位了.这样正推过去就找到了这个目录下vmlinux的生成方式Aobjcopy 主Makefile生成的位于SOURCE_HOME下的那个vmlinux生成arch/x86/compressed/vmlinux.binBarch/x86/compressed/relocs提取SOURCE_HOME/vmlinux的重定位信息输出到arch/x86/compressed/vmlinux.relocs.Cvmlinux.relocs和vmlinux.bin被简单的合并到一块儿.其中vmlinux.bin在头部,重定位信息在尾部.输出为vmlinux.bin.allD用gzip命令把vmlinux.bin.all压缩为vmlinux.bin.gzEvmlinux.src和vmlinux.bin.gz被链接为piggy.o.Fhead_32.o和misc_32.o,piggy.o链接为vmlinux,格式为elf-i386.依照创建文件的时间顺序排列位于x86/boot下的那些cmd文件得到他们的顺序和编译时输出的顺序一样.分别打开他们会发现bzImage生成的后续步骤.Gboot/.vmlinux.bin.cmd使用objcopy把新生成的这个vmlinux拷贝为二进制文件boot/vmlinux.binHboot/.setup.elf.cmd生成elf文件setup.elf于当前目录Iboot/.setup.bin.cmd把setup.elf 用objcopy命令拷贝为二进制文件setup.bin于当前目录.Jcmd_arch/x86/boot/bzImage := arch/x86/boot/tools/build -b arch/x86/boot/setup.bin arch/x86/boot/vmlinux.bin CURRENT arch/x86/boot/bzImage上面的命令负责生成boot目录下的bzImage.显然他使用boot/tools/build把boot目录下的vmlinux.bin和setup.bin合成为bzImage这样bzImage就生成了!从上面的生成过程可以了解到bzImage由两部分组成:vmlinux代码段和跟特定体系结构机器启动紧密相关的setup代码段.Vmlinux包含了可以重定位和自解压的代码.setup 则包含了arch/x86/boot目录下的很多代码,可以断定她和启动的关系非常大.通过以上的分析bzImage 的代码结构也就一目了然了.linux 的启动过程分析一:BIOS启动阶段Cpu上电时他的指令寄存器cs:ip总是指向一个固定的地址,这个地址保存在主板上的ROM里.这条指令是cpu执行的第一条指令的地址.x86启动之后进入到实模式下,他的地址线只有20位,因此可以寻址1MB的地址空间,段寄存器是16位.第一条指令的地址是0xffff0000.BIOS加载之后会按照自己的设置查找活动设备的可引导记录.以grub引导硬盘为例.grub在安装时会把自己的一部分写入到MBR中,MBR512字节.BIOS会把这块的内容加载到物理地址为0x7c00的地方.然后就到这个地方来执行.这里就是grub的代码.grub大于512B所以分为stage1和stage2.其中stage1放入MBR中,负责载入stage2的内容.stage2的代码会根据配置文件列出操作系统供选择,如果选择了linux则他就把bzImage载入到内存中.这之后grub转到linux的实模式代码setup的入口点_start.这时内存布局如下图所示: Setup的入口点_start可以在arch/x86/boot/setup.ld里找到而_start的代码则定义在boot/header.S里Header.S最后调转到C语言的/boot/main.c里运行main.c里的main函数会把header.S收集到的参数拷贝一份到文件内的结构体boot_params里.这个结构体定义在include/asm-x86/bootparam.h中.在boot_params里有个结构体很特别setup_header他里面的数据几乎就是header.S 的.header.S收集到的很多信息都被main函数调用的copy_boot_params拷贝到本文件定义的boot_params里的结构体setup_header里了.grub可以向内核传递参数,grub会把参数放在hdr的cmd_line_ptr里等
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专项13 现代文阅读(解析版)
- 扬州中学2025届高三寒假自主检测(二)物理试卷及答案
- 6.2《密度》说课稿 2025年初中 人教版物理八年级上册
- 房屋委托还款协议
- 仓库安全管理检讨书
- 建筑工程转让居间
- 亲子活动中心居间协议
- 智能家居控制系统工厂
- 安防监控监测系统
- 农业生产性经营主体培育作业指导书
- JJG 393-2018便携式X、γ辐射周围剂量当量(率)仪和监测仪
- 建筑物电子信息系统防雷技术规范(局部修订条文)
- 《护士条例》全文
- 华住会酒店员工手册
- 铁岭卫生职业学院单招参考试题库(含答案)
- 塔斯汀营销分析
- 市纪委跟班学习工作总结
- 脑梗死一病一品
- 【部编版】三年级语文下册第9课《古诗三首》精美课件
- 2024社会工作者《社会工作实务(初级)》考试题库及答案
- 护士在医疗事故中的法律责任与应对
评论
0/150
提交评论