之前有一个启动流程,是介绍未压缩内核的启动流程
linux内存管理 (三) 3 未压缩内核启动流程-从stext到start_kernel
现在这个是介绍 压缩内核启动流程-从start到解压内核
linux内存管理 (三) 4 压缩内核启动流程-从start到解压内核
两者关系
压缩内核启动过程 会引导 未压缩内核启动流程
因为压缩内核肯定要解压缩,解压缩之后就是 未压缩内核的启动流程了
- 启动涉及到的文件
arch/arm/boot/compressed/head.S
arch/arm/boot/compressed/piggy.gzip.S
arch/arm/boot/compressed/decompress.c
arch/arm/boot/compressed/lib1funcs.S
arch/arm/boot/compressed/misc.c
linux内存管理 (三) 2 压缩与未压缩的内核镜像启动粗略解析 大概描述了入口与出口
- 大致过程
开cache
如果怕踩踏,搬运当前代码
用got技术重定位 清0bss段 设置sp
解压 压缩内核,得到 位于zreladdr地址的 Image
关cache
设置r0,r1,r2,跳转到 Image 中的 start
1.
解决 Booting from Angel 的问题
2.
关闭IRQ与FIQ
3.
ldr r4, =zreladdr // 是非压缩内核(Image)所在的起始地址
3.
cache_on
4.
计算链接地址与运行地址,算出压缩内核最后一个字节的运行地址.
根据压缩内核的最后4个字节(需要翻转)得到 Image 的大小
6.
如果 当前被压缩的内核 与 即将被解压的内核 内存空间有重叠,则将 当前运行的映像搬运到 即将被解压的内核 结束地址 后面
不重叠的条件
即将被解压的内核 起始地址 >= 当前镜像的结束地址 + 16384
或
pc >= 即将被解压的内核 起始地址 + 即将被解压的内核(Image) 的大小
7.
如果链接地址与运行地址不等,重定位 .bss 段 与 .got 段
8.
清空 .bss 段
9.
设置参数,调用 decompress_kernel
10.
cache_clean_flush
cache_off
11.
设置r0,r1,r2,设置pc=zreladdr,zreladdr地址的符号就是 stext (arch/arm/kernel/head.S)
zreladdr 的运行地址是多少 ??? //0x50008000
链接:https://pan.baidu.com/s/1-HZ-7azVgNyrF5yoavIEbA
提取码:qza8
其他
- decompress_kernel 调用关系
bl decompress_kernel head.S
decompress_kernel->do_decompress arch/arm/boot/compressed/misc.c
do_decompress -> decompress arch/arm/boot/compressed/decompress.c
#define decompress gunzip lib/decompress_inflate.c
gunzip 中的 函数引用全部都由 以下提供
1. include/linux/decompress/mm.h 中定义的malloc 和 free
2. lib/zlib_inflate/inflate.c 中定义的 zlib_xxx
3. lib/zlib_inflate/inffast.c 中定义的 inflate_fast
4. lib/zlib_inflate/inftrees.c 中定义的 zlib_inflate_table