Android培训班(97)内核解压过程10

经过上面打开MMU代码之后,就进入了另一个主要环节,就是把压缩的内核代码解压出来,变换回原来可执行代码的模样,这样才可以让CPU理解并执行相应的指令。由于加载压缩的内核就占用了一定的内存空间,如果这个压缩的内核比较大,而物理内存比较小,那么解压后的内核就会把未解压部份的内核数据覆盖,否则就可以采用更简单的方法来解压了,直接写入相应的位置就行了。下面这段代码里,r4是解压内核的开始地址,r5是未解压正在执行的内核文件开始位置,r2是未解压正在执行的内核文件堆栈位置偏移64K的位置。当r4大于等于r2时,就是意味着解压后的内核在目前执行文件后面,因此直接写入就可以,不用考虑覆盖的问题,跳到wont_overwrite标号执行。当r4加上解压后内核的长度小于r5时,就是意味着解压后的内核永远在当前执行内核的前面,因此也直接写入就可以,不用考虑覆盖的问题,跳到wont_overwrite标号执行。其它情况,就需要先考虑把内核解压出来,放到一个临时地方,并不能直接放到r4直接开始位置了,然后再通过解压后的一段代码把临时地方的内核进行重定位操作,才可以再执行。从一段简单的内核代码,就可以看到考虑的条件要面面俱到,否则就会很容易出错的。

/*

*Check to see if we will overwrite ourselves.

* r4 = final kernel address

* r5 = start of this image

* r2 = end of malloc space (and therefore this image)

*We basically want:

* r4 >= r2 -> OK

* r4 + image length <= r5 -> OK

*/

cmp r4,r2

bhs wont_overwrite

sub r3,sp, r5 @ > compressed kernel size

add r0,r4, r3, lsl #2 @ allow for 4x expansion

cmp r0,r5

bls wont_overwrite


mov r5,r2 @ decompress after malloc space

mov r0,r5

mov r3,r7

bl decompress_kernel


add r0,r0, #127 + 128 @ alignment + stack

bic r0,r0, #127 @ align the kernel length

转载于:https://www.cnblogs.com/ajuanabc/archive/2012/04/11/2463013.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值