linux启动流程分析---内核解压缩过程
Linux 启动流程分析 --- 内核解压缩过程 Linux 启动流程中的内核解压缩过程是一个非常重要的步骤,它决定了 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 是一个压缩的内核,就是由 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 是否为零)。 (5) 需要重载内核地址,将 r0 的偏移量加到 BSS region 和 GOT table 中。 (6) 清空 bss 堆栈空间 r2-r3。 (7) 建立 C 程序运行需要的缓存,并赋于 64K 的栈空间。 (8) 这时 r2 是缓存的结束地址,r4 是 kernel 的最后执行地址,r5 是 kernel 境象文件的开始地址。检查是否地址有冲突。 (9) 将 r5 等于 r2,使 decompress 后的 kernel 地址就在 64K 的栈之后。 (10) 调用文件 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。 Linux 启动流程中的内核解压缩过程是一个非常复杂的过程,它涉及到内核的压缩、解压缩、地址重载、缓存设置等多个方面。但是,通过对 head.S 文件的分析,我们可以更好地理解这个过程,并更好地 debug 和优化 Linux 内核的启动流程。
- 海神8002020-06-11很好的资源,感谢分享!
- Quietly2011-10-14觉得不很详细,有没有更详细的资源
- 粉丝: 801
- 资源: 773
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于C语言的系统服务框架.zip
- (源码)基于Spring MVC和MyBatis的选课管理系统.zip
- (源码)基于ArcEngine的GIS数据处理系统.zip
- (源码)基于JavaFX和MySQL的医院挂号管理系统.zip
- (源码)基于IdentityServer4和Finbuckle.MultiTenant的多租户身份认证系统.zip
- (源码)基于Spring Boot和Vue3+ElementPlus的后台管理系统.zip
- (源码)基于C++和Qt框架的dearoot配置管理系统.zip
- (源码)基于 .NET 和 EasyHook 的虚拟文件系统.zip
- (源码)基于Python的金融文档智能分析系统.zip
- (源码)基于Java的医药管理系统.zip