Android arm linux kernel启动流程
址,而我们直接跳到ZTEXTADDR跑的,实际上PC里面现在的地址肯定是0x00208000以后的一个值,adr r0, LC0编译之后实际上为addr0, pc, #208,这个208就是LC0到.text段头部的偏移。
view plainprint?
- addr5,r5,r0
- addr6,r6,r0
- addip,ip,r0
然后就是重定位了,即都加上一个偏移,经过重定位以后就都是绝对地址了。
view plainprint?
- not_relocated:movr0,#0
- 1:strr0,[r2],#4@clearbss
- strr0,[r2],#4
- strr0,[r2],#4
- strr0,[r2],#4
- cmpr2,r3
- blo1b
- /*
- *TheCruntimeenvironmentshouldnowbesetup
- *sufficiently.Turnthecacheon,setupsome
- *pointers,andstartdecompressing.
- */
- blcache_on
重定位完成以后打开cache,具体这个打开cache的过程咱没仔细研究过,大致过程是先从C0里面读到processor ID,然后根据ID来进行cache_on。
view plainprint?
- movr1,sp@mallocspaceabovestack
- addr2,sp,#0x10000@64kmax
解压的过程首先是在堆栈之上申请一个空间
view plainprint?
- /*
- *Checktoseeifwewilloverwriteourselves.
- *r4=finalkerneladdress
- *r5=startofthisimage
- *r2=endofmallocspace(andthereforethisimage)
- *Webasicallywant:
- *r4>=r2->OK
- *r4+imagelength<=r5->OK
- */
- cmpr4,r2
- bhswont_overwrite
- subr3,sp,r5@>compressedkernelsize
- addr0,r4,r3,lsl#2@allowfor4xexpansion
- cmpr0,r5
- blswont_overwrite
- movr5,r2@decompressaftermallocspace
- movr0,r5
- movr3,r7
- bldecompress_kernel
- addr0,r0,#127+128@alignment+stack
- bicr0,r0,#127@alignthekernellength
这个过程是判断我们解压出的vmlinx会不会覆盖原来的zImage,这里的final kernel address就是解压后的kernel要存放的地址,而start of this image则是zImage在内存中的地址。根据我们前面的分析,现在这两个地址是重复的,即都是0x00208000。同样r2是我们申请的一段内存空间,因为他是在sp上申请的,而根据vmlinx.lds我们知道stack实际上处与vmlinx的最上面,所以r4>=r2是不可能的,这里首先计算zImage的大小,然后判断r4+r3是不是比r5小,很明显r4和r5的值是一样的,所以这里先将r2的值赋给r0,经kernel先解压到s 申请的内存空间上面,具体的解压过程就不描述了,定义在misc.c里面。(这里我所说的上面是指内存地址的高地址,默认载入的时候从低地址往高地址写,所以从内存低地址开始运行,stack处于最后面,所以成说是最上面)
view plainprint?
- *r0=decompressedkernellength
- *r1-r3=unused
- *r4=kernelexecutionaddress
- *r5=decompressedkernelstart
- *r6=processorID
- *r7=architectureID
- *r8=atagspointer
- *r9-r14=corrupted
- */
- addr1,r5,r0@endofdecompressedkernel
- adrr2,reloc_start
- ldrr3,LC1
- addr3,r2,r3
- :ldmiar2!,{r9-r14}@copyrelocationcode
- stmiar1!,{r9-r14}
- ldmiar2!,{r9-r14}
- stmiar1!,{r9-r14}
- cmpr2,r3
- blo1b
- addsp,r1,#128@relocatethestack
- blcache_clean_flush
- addpc,r5,r0@callrelocationcode
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)