linux启动流程分析---内核解压缩过程.doc

linux启动流程分析---内核解压缩过程.doc

ID:57688936

大小:16.00 KB

页数:2页

时间:2020-09-01

linux启动流程分析---内核解压缩过程.doc_第1页
linux启动流程分析---内核解压缩过程.doc_第2页
资源描述:

《linux启动流程分析---内核解压缩过程.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、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),

2、只不过没有和初始化文件及解压文件链接而已;vmlinux是(没有--lw:zImage是压缩过的内核)压缩过的内核,就是由piggy.o、head.o、misc.o、head-xscale.o组成的。在BootLoader完成系统的引导以后并将Linux内核调入内存之后,调用bootLinux(),这个函数将跳转到kernel的起始位置。如果kernel没有压缩,就可以启动了。如果kernel压缩过,则要进行解压,在压缩过的kernel头部有解压程序。压缩过得kernel入口第一个文件源码位置在arch/arm/boot

3、/compressed/head.S。它将调用函数decompress_kernel(),这个函数在文件arch/arm/boot/compressed/misc.c中,decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置,然后使用在打印出信息“UncompressingLinux...”后,调用gunzip()。将内核放于指定的位置。以下分析head.S文件:(1)对于各种ArmCPU的DEBUG输出设定,通过定义宏来统一操作。(2)设置ke

4、rnel开始和结束地址,保存architectureID。(3)如果在ARM2以上的CPU中,用的是普通用户模式,则升到超级用户模式,然后关中断。(4)分析LC0结构deltaoffset,判断是否需要重载内核地址(r0存入偏移量,判断r0是否为零)。这里是否需要重载内核地址,我以为主要分析arch/arm/boot/Makefile、arch/arm/boot/compressed/Makefile和arch/arm/boot/compressed/vmlinux.lds.in三个文件,主要看vmlinux.lds.i

5、n链接文件的主要段的位置,LOAD_ADDR(_load_addr)=0xA,而对于TEXT_START(_text、_start)的位置只设为0,BSS_START(__bss_start)=ALIGN(4)。对于这样的结果依赖于,对内核解压的运行方式,也就是说,内核解压前是在内存(RAM)中还是在FLASH上,因为这里,我们的BOOTLOADER将压缩内核(zImage)移到了RAM的0xA位置,我们的压缩内核是在内存(RAM)从0xA地址开始顺序排列,因此我们的r0获得的偏移量是载入地址(0xA)。接下来的工作是要

6、把内核镜像的相对地址转化为内存的物理地址,即重载内核地址。(5)需要重载内核地址,将r0的偏移量加到BSSregion和GOTtable中。(6)清空bss堆栈空间r2-r3。(7)建立C程序运行需要的缓存,并赋于64K的栈空间。(8)这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址。检查是否地址有冲突。将r5等于r2,使decompress后的kernel地址就在64K的栈之后。(9)调用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地

7、方(r2地址之后)。此时各寄存器值有如下变化:r0为解压后kernel的大小r4为kernel执行时的地址r5为解压后kernel的起始地址r6为CPU类型值(processorID)r7为系统类型值(architectureID)(10)将reloc_start代码拷贝之kernel之后(r5+r0之后),首先清除缓存,而后执行reloc_start。(11)reloc_start将r5开始的kernel重载于r4地址处。(12)清除cache内容,关闭cache,将r7中architectureID赋于r1,执行r4

8、开始的kernel代码。下面简单介绍一下解压缩过程,也就是函数decompress_kernel实现的功能:解压缩代码位于kernel/lib/inflate.c,inflate.c是从gzip源程序中分离出来的。包含了一些对全局数据的直接引用。在使用时需要直接嵌入到代码中。gzip压缩文件时总是在前32K字节的范围

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。