linux内存管理 (三) 4 压缩内核启动流程-从start到stext

之前有一个启动流程,是介绍未压缩内核的启动流程
	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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值