网站大量收购独家精品文档,联系QQ:2885784924

W_S3C2440啟动文件分析.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
W_S3C2440啟动文件分析

S3c2440init.s启动文件分析 启动部分的代码功能可以分成5部分来看,代码搬移与重定位、中断向量表及相关跳转设置、初始化硬件、初始化堆栈、C的main函数入口设定。以下就对这几个部分来分析 代码搬移与重定位 首先要搞明白编译链接的结果、RO,RW,ZI段、加载域、运行域。RO就是read only,RW就是read/write,ZI就是zero。程序在经过keil的编译后就成了二进制代码,每段代码的RO、RW、ZI属性在这时就已经由程序与编译器确定下来了,代码的链接由keil的分散加载文件来设置。在链接完成之后形成的bin文件称为映像文件,这是实际烧写到芯片中的文件,也就是加载域。所有的RO段都被放在了映像文件的最前端,RW端紧跟着RO段,ZI段紧跟着RW段。在实际运行的过程中,RO段应该重新定位在ROM,而需要反复读写的RW与ZI段应该放在RAM中,这才是芯片实际运行的程序结构,这就是运行域。在keil中已经由用户配置好了RO的起始地址与RW的起始地址,就是变量|Image$$RO$$Limit|、|Image$$RW$$Base|、|Image$$ZI$$Base| |Image$$RW$$Base| = RW base 地址指定 |Image$$RW$$Limit| =|Image$$RW$$Base|+ RW Data(编译器计算出来的) |Image$$ZI$$Base| = |Image$$RW$$Limit| + 1 |Image$$ZI$$Limit| = |Image$$ZI$$Base| + ZI Data(编译器计算出来的) C中的指令以及常量被编译后视RO类型数据 C中的未被初始化或初始化为0的变量编译后是ZI类型数据 C中的已被初始化成非0值的变量编译后是RW类型数据 S3C2440有三种启动运行模式,一是从norflash启动,二是从nandflash启动,三是用仿真器直接从内存启动。 从norflash启动。Norflash是可以直接运行代码的,从norflash启动,S3C2440的bank0地址空间就映射到了norflash上,从0地址开始运行,在2440init.o的前4k代码中,有一段代码(就是copy_proc_beg)的作用是把代码从norflash搬运到sdram,并进行重定位,这段代码运行结束后,PC指针就从norflash跳到了sdram中的同一个位置,实现了加载域到运行域的无缝连接。 从nandflash启动。Nandflash是不可以直接运行代码的,所以在arm上电之后,有一个4k大小的称之为steping stone的东西会把nandflash中的前4k代码复制过来,这部分工作是由硬件自动实现的,于是这4k代码开始运行,依旧是从0地址开始。这4k代码检测到时nandflash启动,就先由nand_boot_beg这段代码把nandflash的所有数据全部复制到sdram中,再由copy_proc_beg实现RW与ZI段的重定位。注意,copy_proc_beg这段代码在sdram中做重定位的时候,有个前提,就是源代码RO+RW+ZI的总长度必须小于|Image$$RW$$Base| - |Image$$RO$$ Base |,否则重定位的时候RW与ZI的数据就有可能被冲洗掉。 用仿真器直接从sdram启动。用仿真器的时候,代码直接被烧写到sdram中,copy_proc_beg就只完成了RW与ZI的重定位。 接下来行分析代码搬移与重定位的实现原理。(详见关于2440init中数据复制部分的理解--Jack_X的笔记.htm)(注:copy_proc_beg与nand_boot_beg这两段代码是由一个叫hzh的高手写的,官方原厂的对应代码是copy_myself,on_the_ram) ldr r0, =BWSCON ldr r0, [r0] ands r0, r0, #6 ;OM[1:0] != 0, 开关被打到norflash一侧 bne copy_proc_beg ;do not read nand flash adr r0, ResetEntry ;OM[1:0] == 0,开关被打到nandflash一侧 cmp r0, #0 ;使用仿真器运行 bne copy_proc_beg ; ;nop nand_boot_beg ;复制nandflash数据到sdram 注意上面的adr指令是加载运行当时的相对地址,所以从norflash启动或从nandflash启动的时候, ResetEntry的值为0x0000000,如果用仿真器从sdram启动,ResetEntry的值就为0中断向量表及相关跳转

文档评论(0)

fv45ffsjjI + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档