- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux启动流程分析---内核解压缩过程内核压缩和解压缩代码都在目录kernel/arch/arm/boot/compressed, 编译完成后将产生vmlinux、head.o、misc.o、head-xscale.o、piggy.o这几个文件, head.o是内核的头部文件,负责初始设置; misc.o将主要负责内核的解压工作,它在head.o之后; head-xscale.o文件主要针对Xscale的初始化,将在链接时与head.o合并; piggy.o是一个中间文件,其实是一个压缩的内核(kernel/vmlinux),只不过没有和初始化文件及解压文件链接而已; vmlinux是(没有--lw:zImage是压缩过的内核)压缩过的内核,就是由piggy.o、head.o、misc.o、head-xscale.o组成的。 在BootLoader完成系统的引导以后并将Linux内核调入内存之后,调用bootLinux(), 这个函数将跳转到kernel的起始位置。如果kernel没有压缩,就可以启动了。 如果kernel压缩过,则要进行解压,在压缩过的kernel头部有解压程序。 压缩过得kernel入口第一个文件源码位置在arch/arm/boot/compressed/head.S。 它将调用函数decompress_kernel(),这个函数在文件arch/arm/boot/compressed/misc.c中, decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置, 然后使用在打印出信息“Uncompressing Linux...”后,调用gunzip()。将内核放于指定的位置。 以下分析head.S文件: (1)对于各种Arm CPU的DEBUG输出设定,通过定义宏来统一操作。 (2)设置kernel开始和结束地址,保存architecture ID。 (3)如果在ARM2以上的CPU中,用的是普通用户模式,则升到超级用户模式,然后关中断。 (4)分析LC0结构delta offset,判断是否需要重载内核地址(r0存入偏移量,判断r0是否为零)。 这里是否需要重载内核地址,我以为主要分析arch/arm/boot/Makefile、arch/arm/boot/compressed/Makefile 和arch/arm/boot/compressed/vmlinux.lds.in三个文件,主要看vmlinux.lds.in链接文件的主要段的位置, LOAD_ADDR(_load_addr)=0xA0008000,而对于TEXT_START(_text、_start)的位置只设为0,BSS_START(__bss_start)=ALIGN(4)。 对于这样的结果依赖于,对内核解压的运行方式,也就是说,内核解压前是在内存(RAM)中还是在FLASH上, 因为这里,我们的BOOTLOADER将压缩内核(zImage)移到了RAM的0xA0008000位置,我们的压缩内核是在内存(RAM)从0xA0008000地址开始顺序排列, 因此我们的r0获得的偏移量是载入地址(0xA0008000)。接下来的工作是要把内核镜像的相对地址转化为内存的物理地址,即重载内核地址。 (5)需要重载内核地址,将r0的偏移量加到BSS region和GOT table中。 (6)清空bss堆栈空间r2-r3。 (7)建立C程序运行需要的缓存,并赋于64K的栈空间。 (8)这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址。检查是否地址有冲突。 将r5等于r2,使decompress后的kernel地址就在64K的栈之后。 (9)调用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地方(r2地址之后)。此时各寄存器值有如下变化: r0为解压后kernel的大小 r4为kernel执行时的地址 r5为解压后kernel的起始地址 r6为CPU类型值(processor ID) r7为系统类型值(architecture ID) (10)将reloc_start代码拷贝之kernel之后(r5+r0之后),首先清除缓存,而后执行reloc_start。 (11)reloc_start将r5开始的kernel重载于r4地址处。 (12)清除cache内容,关闭cache,将r7中architecture ID赋于r1,执行r4开始的kernel代码。 下面简单介绍一下解压缩过程,也就是函数decompress_kerne
有哪些信誉好的足球投注网站
文档评论(0)