下载此文档

嵌入式Linux2.6内核启动流程).doc


文档分类:IT计算机 | 页数:约14页 举报非法文档有奖
1/14
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/14 下载此文档
文档列表 文档介绍
Linux内核构成(国嵌)Linux/arch/arm/pressed/.arch/arm/kernel/(国嵌)arch/arm/pressed/(—负责解压缩)Start:.typestart,#,.******@umberstohelptheloader.******@absoluteload/******@zImageendaddress1:movr7,******@savearchitectureIDmovr8,******@saveatagspointer这也标志着u-boot将系统完全的交给了OS,bootloader生命终止。之后代码在133行会读取cpsr并判断是否处理器处于supervisor模式——从u-boot进入kernel,系统已经处于SVC32模式;而利用angel进入则处于user模式,还需要额外两条指令。之后是再次确认中断关闭,并完成cpsr写入mrsr2,******@getcurrentmodetstr2,#******@notuser?bnenot_angelmovr0,#******@angel_SWIreason_******@angel_SWI_ARMnot_angel:mrsr2,******@turnoffinterruptstoorrr2,r2,#******@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相关的,,下面只粘贴一部分addr5,r5,r0addr6,r6,r0addip,ip,r0后面在211行进行bss段的清零工作not_relocated: movr0,#01: strr0,[r2],#******@clearbssstrr0,[r2],#4strr0,[r2],#4strr0,[r2],#4cmpr2,r3blo1b然后224行,打开cache,并为后面解压缩设置64KB的临时malloc空间blcache_onmovr1,******@mallocspaceabovestackaddr2,sp,#******@64kmax接下来238行进行检查,确定内核解压缩后的Image目标地址是否会覆盖到zImage头,如果是则准备将zImage头转移到解压出来的内核后面cmpr4,r2bhswont_overwritesubr3,sp,r5@>compressedkernelsizeaddr0,r4,r3,lsl#******@allowfor4xexpansioncmpr0,r5blswont_overwritemovr5,******@pressaftermallocspacemovr0,r5movr3,press_kernel真实情况——在大多数的应用中,内核编译都会把压缩的zImage和非压缩的Image链接到同样的地址,s3c2410平台下即是0x30008000。这样做的好处是,人们不用关心内核是Image还是zImage,放到这个位置执行就OK,所以在解压缩后zImage头必须为真正的内核让路。在250行解压完毕,内核长度返回值存放在r0寄存器里。在内核末尾空出128字节的栈空间用,并

嵌入式Linux2.6内核启动流程) 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数14
  • 收藏数0 收藏
  • 顶次数0
  • 上传人2072510724
  • 文件大小390 KB
  • 时间2020-03-25