预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共29页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。Linux内核构成(国嵌)Linux/arch/arm/boot/compressed/head.s1.解压缩2.初始化3.启动应用程序1arch/arm/boot/compressed/Makefilearch/arm/boot/compressed/vmlinux.lds2.arch/arm/kernel/vmlinux.ldsLinux内核启动流程(国嵌)arch/arm/boot/compressed/start.S(head.s—负责解压缩)Start:.typestart,#function.rept8movr0,r0.endrb1f.word0x016f2818@Magicnumberstohelptheloader.wordstart@absoluteload/runzImageaddress.word_edata@zImageendaddress1:movr7,r1@savearchitectureIDmovr8,r2@saveatagspointer这也标志着u-boot将系统完全的交给了OS,bootloader生命终止。之后代码在133行会读取cpsr并判断是否处理器处于supervisor模式——从u-boot进入kernel,系统已经处于SVC32模式;而利用angel进入则处于user模式,还需要额外两条指令。之后是再次确认中断关闭,并完成cpsr写入mrsr2,cpsr@getcurrentmodetstr2,#3@notuser?bnenot_angelmovr0,#0x17@angel_SWIreason_EnterSVCswi0x123456@angel_SWI_ARMnot_angel:mrsr2,cpsr@turnoffinterruptstoorrr2,r2,#0xc0@preventangelfromrunningmsrcpsr_c,r2然后在LC0地址处将分段信息导入r0-r6、ip、sp等寄存器,并检查代码是否运行在与链接时相同的目标地址,以决定是否进行处理。由于现在很少有人不使用loader和tags,将zImage烧写到rom直接从0x0位置执行,因此这个处理是必须的(可是zImage的头现在也保留了不用loader也可启动的能力)。arm架构下自解压头一般是链接在0x0地址而被加载到0x30008000运行,因此要修正这个变化。涉及到r5寄存器存放的zImage基地址r6和r12(即ip寄存器)存放的got(globaloffsettable)r2和r3存放的bss段起止地址sp栈指针地址很简单,这些寄存器统统被加上一个你也能猜到的偏移地址0x30008000。该地址是s3c2410相关的,其它的ARM处理器能够参考下表PXA2xx是0xa0008000IXP2x00和IXP4xx是0x00008000Freescalei.MX31/37是0x80008000TIdavinciDM64xx是0x80008000TIomap系列是0x80008000AT91RM/SAM92xx系列是0x8000CirrusEP93xx是0x00008000这些操作发生在代码172行开始的地方,下面只粘贴一部分addr5,r5,r0addr6,r6,r0addip,ip,r0后面在211行进行bss段的清零工作not_relocated:movr0,#01:strr0,[r2],#4@clearbssstrr0,[r2],#4strr0,[r2],#4strr0,[r2],#4cmpr2,r3blo1b然后224行,打开cache,并为后面解压缩设置64KB的临时malloc空间blcache_onmovr1,sp@mallocspaceabovestackaddr2,sp,#0x10000@64kmax接下来238行进行检查,确定内核解压缩后的Image目标地址是否会覆盖到zImage头,如果是则准备将zImage头转移到解压出来的内核后面cmpr4,r2bhswont_overwritesubr3,sp,r5@>compressedkernelsizeaddr0,r4,r3,lsl#2@allowfor4xexpansioncmpr0,r5blswont_overwritemovr5,r2@decompressaftermallocspacemovr0,r5movr3,r7bldecompress_kernel真实情况——在大多数的应用中,内核编译都会把压缩的zImage和非压缩的Image链接到同样的地址,s3c2410平台下即是0x30008000。这样做的好处是,人们不用关心内核是Image还是zImage,放到这个位置执行