Android arm linux kernel启动流程
因为没有将kernel解压在要求的地址,所以必须重定向,说穿了就是要将解压的kernel拷贝到正确的地址,因为正确的地址与zImage的地址是重合的,而要拷贝我们又要执行zImage的重定位代码,所以这里首先将重定位代码reloc_start拷贝到vmlinx上面,然后再将vmlinx 拷贝到正确的地址并覆盖掉zImage。这里首先计算出解压后的vmlinux的高地址放在r1里面,r2存放着重定位代码的首地址,r3存放着重定位代码的size,这样通过拷贝就将reloc_start移动到vmlinx后面去了,然后跳转到重定位代码开始执行。
view plainprint?
- /*
- *Allcodefollowingthislineisrelocatable.Itisrelocatedby
- *theabovecodetotheendofthedecompressedkernelimageand
- *executedthere.Duringthistime,wehavenostacks.
- *
- *r0=decompressedkernellength
- *r1-r3=unused
- *r4=kernelexecutionaddress
- *r5=decompressedkernelstart
- *r6=processorID
- *r7=architectureID
- *r8=atagspointer
- *r9-r14=corrupted
- */
- .align5
- reloc_start:addr9,r5,r0
- subr9,r9,#128@donotcopythestack
- debug_reloc_start
- movr1,r4
- 1:
- .rept4
- ldmiar5!,{r0,r2,r3,r10-r14}@relocatekernel
- stmiar1!,{r0,r2,r3,r10-r14}
- .endr
- cmpr5,r9
- blo1b
- addsp,r1,#128@relocatethestack
- debug_reloc_end
- call_kernel:blcache_clean_flush
- blcache_off
- movr0,#0@mustbezero
- movr1,r7@restorearchitecturenumber
- movr2,r8@restoreatagspointer
- movpc,r4@callkernel
这里就是将vmlinx拷贝到正确的地址了,拷贝到正确的位置以后,就将kernel的首地址赋给PC,然后就跳转到真正kernel启动的过程~~
最后我们来总结一下一个基本的过程:
1)当bootloader要从分区中数据读到内存中来的时候,这里涉及最重要的两个地址,一个就是ZTEXTADDR还有一个是 INITRD_PHYS。不管用什么方式来生成IMG都要让bootloader有方法知道这些参数,不然就不知道应该将数据从FLASH读入以后放在什么地方,下一步也不知道从哪个地方开始执行了;
2)bootloader将IMG载入RAM以后,并跳到zImage的地址开始解压的时候,这里就涉及到另外一个重要的参数,那就是 ZRELADDR,就是解压后的kernel应该放在哪。这个参数一般都是arch/arm/mach-xxx下面的Makefile.boot来提供的;
3)另外现在解压的代码head.S和misc.c一般都会以PIC的方式来编译,这样载入RAM在任何地方都可以运行,这里涉及到两次冲定位的过程,基本上这个重定位的过程在ARM上都是差不多一样的。
写这个总结的时候咱的心情是沉重的,因为还有好多东西没弄明白。。。感叹自己的知识还是浅薄得很,前途钱途漫漫阿~~不过基本脉络是清楚的,具体的细节只能留在以后有时间再啃了。这里的第二部分启动流程指的是解压后kernel开始执行的一部分代码,这部分代码和ARM体系结构是紧密联系在一起的,所以最好是将ARM ARCHITECTURE REFERENCE MANUL仔细读读,尤其里面关于控制寄存器啊,MMU方面的内容~
前面说过解压以后,代码会跳到解压完成以后的vmlinux开始执行,具体从什么地方开始执行我们可以看看生成的vmlinux.lds(arch/arm/kernel/)这个文件:
view plainprint?
- OUTPUT_ARCH(arm)
- EN
Androidarmlinuxkernel启动流 相关文章:
- Android arm linux kernel启动流程一(11-09)
- Android arm linux kernel启动流程二(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)