linux内核 image,linux内核zImage详解

以下内容基于s5pv210进行分析

zImage由head.o,piggy.gzip.o,misc等链接组成,piggy.gzip.o中包含压缩的内核镜像,zImage的作用实际上就是对内核进行解码。

zImage还是位置无关码,它的链接地址为0,可以在任何地址运行,因为在对其源文件进行编译时编译器参数设置了-fpic,通过反汇编看到编译生成了.got和.got.plt段。.dot.plt为空,查看反汇编得知编译器对c语言函数的调用是通过bl指令实现的,所以c的函数调用是位置无关码;而对于c中全局变量的处理是通过相对寻址找到全局变量一一对应的.got地址(这里的相对寻址是:在每个函数段中如果使用了全局变量都会存放.got首地址相对运行pc的偏移量以及全局变量在.got中的偏移),所以无论运行地址和链接地址匹不匹配,代码都能正确找到全局变量的.got地址。.got地址中存放了全局变量的链接地址,所以只要在zImage的初始化c语言运行环境部分增加对.got部分全局变量的重定位则代码将正确运行,因此zImage成为了位置无关码

现在开始分析arch/arm/boot/compressed/head.s进行代码分析:

start: .typestart,#function //用于指定标号start为函数 .rept8 //指定.endr以前的指令循环8次 movr0, r0 .endr b1f .word0x016f2818@魔数用于表示zImage的身份 .wordstart@ zImage的链接地址 .word_edata@ zImage的链接结束地址 1:movr7, r1@ save architecture ID movr8, r2@ save atags pointer

#ifndef __ARM_ARCH_2__ /*用于判断是不是angel启动,我们是u-boot启动进来时已经是svc模式了所以直接跳到 not_angel */ mrsr2, cpsr@ get current mode tstr2, #3@ not user? bnenot_angel movr0, #0x17@ angel_SWIreason_EnterSVC ARM(swi0x123456)@ angel_SWI_ARM THUMB(svc0xab)@ angel_SWI_THUMB not_angel: mrsr2, cpsr@ turn off interrupts to orrr2, r2, #0xc0@ prevent angel from running msrcpsr_c, r2 #else teqppc, #0x0c000003@ turn off interrupts #endif

.text adrr0, LC0 //将LC0的运行地址加载到r0, ARM(ldmiar0, {r1, r2, r3, r4, r5, r6, r11, ip, sp}) /*将r0指定的地址中的数据依次加载到括号里的寄存器中: r1 : LC0的链接地址 r2 : BSS start r3 : BSS end r4 : 内核的链接地址 r5 : zImage的链接地址 r6 : 内核的大小 r11 :.got的起始链接地址, ip :.got的结束链接地址 sp :链接下的栈顶 r0 : LC0的运行运行地址*/ THUMB(ldmiar0, {r1, r2, r3, r4, r5, r6, r11, ip}) //无效 THUMB(ldrsp, [r0, #32]) //无效 subsr0, r0, r1@r0成为运行地址与链接地址的偏移量 beqnot_relocated@运行地址与连接地址相同跳转该语句 addr5, r5, r0 @r5 : zImage的运行地址 addr11, r11, r0 @r11:.got的起始运行地址 addip, ip, r0 @ip:.got的结束运行地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值