ARM处理器的位置无关程序设计._第1页
ARM处理器的位置无关程序设计._第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ARM 处理器的位置无关程序设计ARM 处理器支持位置无关的程序设计,这种程序加载到存储器的任意地址空间 都可以正常运行,其设计方法在嵌入式应用系统开发中具有重要的作用。尤其 在裸机状态下开发 Bootloader 程序及进行内核初始化设计;利用位置无关的程 序设计方法还可以在具体应用中用于构建高效率动态链接库,因而了解位置无 关的程序设计方法,有助于开发人员设计出结构简单、清晰的应用程序。应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要 对所有目标文件进行重定位 (relocatiON) ,建立符号引用规则,同时为变量、 函数等分配运行地址。当程序执行时,系统必须把代码加载到

2、链接时所指定的 地址空间,以保证程序在执行过程中对变量、函数等符号的正确引用,使程序 正常运行。在具有操作系统的系统中,重定位过程由操作系统自动完成。在设计 Bootloader 程序时,必须在裸机环境中进行,这时 Bootloader 映 像文件的运行地址必须由程序员设定。通常情况下,将 Bootloader 程序下载到 ROM 勺0 x0 地址进行启动,而在大多数应用系统中,为了快速启动,首先将 Bootloader 程序拷贝到 SDRA 中再运行。一般情况下,这两者的地址并不相 同,程序在 SDRAMS的地址重定位过程必须由程序员完成。实际上,由于 Bootloader 是系统上电后要执

3、行的第一段程序, Bootloader 程序的拷贝和在这 之前的所有工作都必须由其自身来完成,而这些指令都是在ROM 中执行的。也就是说,这些代码即使不在链接时所指定的运行时地址空间,也可以正确执 行。这就是位置无关代码,它是一段加载到任意地址空间都能正常执行的特殊 代码。位置无关代码常用于以下场合:程序在运行期间动态加载到内存;程序在不同场合与不同程序组合后加载到内存 ( 如共享的动态链接库 );在运行期间不同地址相互之间的映射(如 Bootloader 程序)。虽然在用 GCC 编译时,使用-fPIC 选项可为 C 语言产生位置无关代码,但 这并不能修正程序设计中固有的位置相关性缺陷。特别

4、是汇编语言代码,必须 由程序员遵循一定的程序设计准则,才能保证程序的位置无关性。ARM 程序的位置无关可执行文件 PIE ( Positionlndependent Executable ) 包括位置无关代码 PIC 和位置无关数据 PID (Positionlndependent Data )两 部分。PID 主要针对可读写数据段(.data 段),其中保存已赋初值的全局变量。 为实现其位置无关性,通常使用寄存器R9 作为静态基址寄存器,使其指向该可 读写段的首地址,并使用相对于基址寄存器的偏移量来对该段的变量进行寻 址。这种方法常用于为可重入程序的多个实例产生多个独立的数据段。在程序 设计

5、中,一般不必考虑可读写段的位置无关性,这主要是因为可读写数据主要 分配在 SDRA 中。PIC包括程序中的代码和只读数据 (.text段) , 为保证程序能在 ROM和 SDRAMS间都能正确运行(如裸机状态下的 Bootloader 程序),必须采用位置 无关代码程序设计。PIC 遵循只读段位置无关 ROPI (ReadOnly Position Independence )的ATPCS( ARMThumb Procedure Call STandard )的程序设计规范:程序设计规范#e#(1)程序设计规范 1引用同一 ROPI 段或相对位置固定的另一 ROPI 段中的符号时,必须是基于

6、PC的符号引用,即使用相对于当前 PC 的偏移量来实现跳转或进行常量访问。 位置无关的程序跳转。在 ARM 匚编程序中,使用相对跳转指令 B/BL 实 现程序跳转。指令中所跳转的目标地址用基于当前PC 的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实 现位置无关性。另外, 还可使用 ADR或 ADRL伪指令将地址标号值读取到 PC中实现程序跳 转。这是因为 ADR 或 ADRL 等伪指令会被编译器替换为对基于 PC 的地址值进行 操作,但这种方式所能读取的地址范围较小,并且会因地址值是否为字对齐而 异。但在 ARMg序中,使用 LDR 等指令直接将地址

7、标号值读取到 PC 中实现程序 跳转不是位置无关的。例如:LDR PC, =main上面的伪指令编译后的结果为:LDR PC, PC, OFFSET_TO_LPOOLLPOOLDCD main可见, 虽然 LDR 是把基于 PC 的一个存储单元 LPOOL 勺内容加载到 PC 中,但该存储单元中保存的却是链接时所决定的 main 函数入口的绝对地址,所以 main 函数实际所在的段不是位置无关。 位置无关的常量访问。在应用程序中,经常要读写相关寄存器以完成必 要的硬件初始化。为增强程序的可读性,利用EQL 伪指令对一些常量进行赋值,但在访问过程中,必须实现位置无关性。下面以PXA270 勺 GPIO 初始化介绍位置无关的常量访问方法。GPIO_BASE EQU 0 x40e00000; GPIO 基 址寄存器地址GPDR0 EQU 0 x0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论