嵌入式系统原理(第十四周).ppt

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

《嵌入式系统原理》 广州大学华软软件学院 本周课的重点: 为什么要重定位; 如何重定位。 一、引言 本学期的课程已经过去一半了,发现部分同学对编程过程中的“地址”概念不是很清楚,而这又是嵌入式编程过程中无法回避的一个问题: 工程设置中我们需要设置:“R/O Base”和“R/W Base”地址; 烧写时可执行文件镜像是需要指定烧写到NOR FLASH的具体地址; 在线仿真时需要知道把程序下载到内存什么地方(当然我们的仿真环境很“智能”,能够通过分析文件头部得知下载地址);也需要指定程序加载后的入口地址 ; 还有一个一直想回避现在不能再回避了的“重定位”问题; 上面这几个问题是嵌入式编程人员必须要弄清楚的,不得有半点的含糊。 一、引言 “地址”对于计算机的运行是非常重要的,cpu要根据指令指针的内容来确定执行哪条指令;指令执行的过程中要根据寻址方式来确定操作数的来源。 说了这么多,那么“地址”和我们平时的程序有什么关系呢?(下面的讲述过程中我讲尽量避开汇编语言) 二、“地址”和“程序” 请看下面一个非常简单的程序: 二、“地址”和“程序” 链接起始地址我们设置为: 三、“地址”和“程序” 该程序编译链接,分析其map文件可知: 变量x分配的存储单元的编号是0软件仿真反汇编后内容如下: “int y=9”汇编成“MOV R0,#0,其二进制为“E3A00009”,存放在内存单元“0处 全局变量x的值就存放在这里!! 此条指令执行完后变量x的值将变为27!! 三、“地址”和“程序” 从上面我们可以看出我们用c语言写的一个简短的程序最终生成的二进制指令放在内存中什么地址,全局变量所分配的地址。 三、“地址”和“程序” 程序不变,现在我们把链接相关的地址设置如下: 编译链接后,我们通过map文件查看变量x所分配的地址: 可以看出,”Main”所分配的地址是0而变量”x”所分配的地址为0现在我们似乎看到了某种联系: “Main”是代码的起始地址,代码当然是只读的,“R/O Base”正是设置目标文件只读部分的起始地址; 变量“x”所分配的地址为0x是属于可读可写的数据,“R/W ”正是设置目标文件可读可写部分的起始地址; 三、“地址”和“程序” 现在我们通过软件仿真把我们的程序加载内存里面去,下面显示的是其加载后内存情况: 把变量x的地址放到r1中 这部分代码即完成了”x=y+x”,换一种表述就是:0储单元的内容和r0中的内容求和并把结果放回到0储单元。 似乎变量x的初始值0x12放到了存储单元0?X分配的地址不是0? 查看内存0发现00: 三、“地址”和“程序” 见演示,我们发现程序执行完后,变量x(0储单元)并没有得到我们想要的结果,为什么呢? 大家或许已经看明白了:变量x的初始值0x12没有放在0储单元,而放在了0。 0变量x的加载时地址,0运行时地址!!加载时地址和运行时地址不一致造成了运行结果的错误!! 加载时地址? 运行时地址? 烧写或通过仿真器在线下载 四、加载时地址和运行时地址(下面的情况不使用使用分散加载文件时的内存布局) RW RO 头部 RW RO RW RO ZI 可执行文件放在外存上的布局 可执行文件放加载到内存时的布局 可执行文件放在内存运行时的布局 加载 重定位 Pc机的硬盘上 Nor flash或sdram sdram上 Nor flash或sdram 依靠RO段开始的一点点代码对加载时地址和运行时地址不一致的段进行重定位 为什么要加载? 因为程序必须放到系统的内存中才可能运行。 为什么要重定位? 程序中运行时地址和加载时地址不一致的段必须在正确地 运行时位置后才可对其访问,除非是运行位置无关的段。 |Image$$RO$$Base| |Image$$RO$$Limit|=|Image$$RO$$Base| +RO段的长度 |Image$$RW$$Base| |Image$$ZI$$Base| 加载时地址:程序中的段放在内存但还没有被访问时所在的地址; 运行时地址:程序中的段在运行时的地址。 五、重定位 开始我们的那个简单的程序编译后其地址分配如下: RO(code+ro-data)段为32字节,rw-data为4字节,zi-data为0字节,这里rw-data的4个字节就是我们定义的全局

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档