zImage内核镜像解压过程详解

[11-20 15:53:56]   来源:http://www.88dzw.com  arm嵌入式   阅读:8665

文章摘要:•需要重载内核地址,将r0的偏移量加到BSS region和GOT table中的每一项。对于位置无关的代码,程序是通过GOT表访问全局数据目标的,也就是说GOT表中中记录的是全局数据目标的绝对地址,所以其中的每一项也需要重载。• 清空bss堆栈空间r2-r3•建立C程序运行需要的缓存•这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址•用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地方(r2地址之后)。可能大家看了上面的文字描述还是不清楚解压的动态过

zImage内核镜像解压过程详解,标签:arm嵌入式系统,arm系统,http://www.88dzw.com

  •需要重载内核地址,将r0的偏移量加到BSS region和GOT table中的每一项。

  对于位置无关的代码,程序是通过GOT表访问全局数据目标的,也就是说GOT表中中记录的是全局数据目标的绝对地址,所以其中的每一项也需要重载。

  • 清空bss堆栈空间r2-r3

  •建立C程序运行需要的缓存

  •这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址

  •用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地方(r2地址之后)。

  可能大家看了上面的文字描述还是不清楚解压的动态过程。还是先用图表的方式描述下代码的搬运解压过程。然后再针对中间的一些关键过程阐述。

  假定zImage在内存中的初始地址为0x30008000(这个地址由bootloader决定,位置不固定)

  1、初始状态

.text

. got

?

. data

?

.bss

?

.stack

  2、head.S调用misc.c中的decompress_kernel刚解压完内核后

.text

. got

?

. data

?

.bss

?

.stack

  3、此时会将head.S中的部分代码重定位

.text

. got

?

. data

?

.bss

?

.stack

上一页  [1] [2] [3] [4]  下一页


Tag:arm嵌入式arm嵌入式系统,arm系统arm嵌入式

《zImage内核镜像解压过程详解》相关文章

分类导航
最新更新
热门排行