ARM的位置无关程序设计

发布者:chenfengy818最新更新时间:2012-02-21 来源: 21IC关键字:ARM  位置无关  存储器  地址空间 手机看文章 扫描二维码
随时随地手机看文章

ARM处理器支持位置无关的程序设计,这种程序加载到存储器的任意地址空间都可以正常运行,其设计方法在嵌入式应用系统开发中具有重要的作用。尤其在裸机状态下开发Bootloader程序及进行内核初始化设计;利用位置无关的程序设计方法还可以在具体应用中用于构建高效率动态链接库,因而了解位置无关的程序设计方法,有助于开发人员设计出结构简单、清晰的应用程序。

应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要对所有目标文件进行重定位(relocatiON),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行过程中对变量、函数等符号的正确引用,使程序正常运行。在具有操作系统的系统中,重定位过程由操作系统自动完成。

在设计Bootloader程序时,必须在裸机环境中进行,这时Bootloader映像文件的运行地址必须由程序员设定。通常情况下,将Bootloader程序下载到ROM的0x0地址进行启动,而在大多数应用系统中,为了快速启动,首先将Bootloader程序拷贝到SDRAM中再运行。一般情况下,这两者的地址并不相同,程序在SDRAM中的地址重定位过程必须由程序员完成。实际上,由于Bootloader是系统上电后要执行的第一段程序,Bootloader程序的拷贝和在这之前的所有工作都必须由其自身来完成,而这些指令都是在ROM中执行的。也就是说,这些代码即使不在链接时所指定的运行时地址空间,也可以正确执行。这就是位置无关代码,它是一段加载到任意地址空间都能正常执行的特殊代码。

位置无关代码常用于以下场合:

程序在运行期间动态加载到内存;

程序在不同场合与不同程序组合后加载到内存(如共享的动态链接库);

在运行期间不同地址相互之间的映射(如Bootloader程序)。

虽然在用GCC编译时,使用-fPIC选项可为C语言产生位置无关代码,但这并不能修正程序设计中固有的位置相关性缺陷。特别是汇编语言代码,必须由程序员遵循一定的程序设计准则,才能保证程序的位置无关性。

ARM程序的位置无关可执行文件PIE(PositionIndependent Executable)包括位置无关代码PIC和位置无关数据PID(PositionIndependent Data)两部分。

PID主要针对可读写数据段(.data段),其中保存已赋初值的全局变量。为实现其位置无关性,通常使用寄存器R9作为静态基址寄存器,使其指向该可读写段的首地址,并使用相对于基址寄存器的偏移量来对该段的变量进行寻址。这种方法常用于为可重入程序的多个实例产生多个独立的数据段。在程序设计中,一般不必考虑可读写段的位置无关性,这主要是因为可读写数据主要分配在SDRAM中。

PIC包括程序中的代码和只读数据(.text段),为保证程序能在ROM和SDRAM空间都能正确运行(如裸机状态下的Bootloader程序),必须采用位置无关代码程序设计。

PIC遵循只读段位置无关ROPI(ReadOnly Position Independence)的ATPCS(ARMThumb Procedure Call STandard)的程序设计规范:

(1) 程序设计规范1

引用同一ROPI段或相对位置固定的另一ROPI段中的符号时,必须是基于PC的符号引用,即使用相对于当前PC的偏移量来实现跳转或进行常量访问。[page]

① 位置无关的程序跳转。在ARM汇编程序中,使用相对跳转指令B/BL实现程序跳转。指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实现位置无关性。

另外,还可使用ADR或ADRL伪指令将地址标号值读取到PC中实现程序跳转。这是因为ADR或ADRL等伪指令会被编译器替换为对基于PC的地址值进行操作,但这种方式所能读取的地址范围较小,并且会因地址值是否为字对齐而异。

但在ARM程序中,使用LDR等指令直接将地址标号值读取到PC中实现程序跳转不是位置无关的。例如:  LDR PC, =main

上面的伪指令编译后的结果为:  LDR PC, [PC, OFFSET_TO_LPOOL]

                                                                LPOOL

  DCD main

可见,虽然LDR是把基于PC的一个存储单元LPOOL的内容加载到PC中,但该存储单元中保存的却是链接时所决定的main函数入口的绝对地址,所以main函数实际所在的段不是位置无关。

② 位置无关的常量访问。在应用程序中,经常要读写相关寄存器以完成必要的硬件初始化。为增强程序的可读性,利用EQU伪指令对一些常量进行赋值,但在访问过程中,必须实现位置无关性。下面以PXA270的GPIO初始化介绍位置无关的常量访问方法。

  GPIO_BASE EQU 0x40e00000; GPIO基址寄存器地址

  GPDR0 EQU 0x00c; 相对于GPIO基址寄存器的偏移量

  init_GPDR0 EQU 0xfffbfe00; 寄存器GPDR0初值

  LDR R1, =GPIO_BASE

  LDR R0, =init_GPDR0

  STR R0, [R1, #GPDR0]

上述汇编代码段经编译后的结果为:

  LDR R1, [PC, OFFSET_TO_GPIO_BASE]

  LDR R0, [PC, OFFSET_TO_init_GPDR0]

  STR R0, [R1, #0xc]

  GPIO_BASE

  DCD 0x40e00000

  GPDR0

  DCD 0x00c

  init_GPDR0

  DCD 0xfffbfe00

可见,LDR伪指令实际上使用基于PC的偏移量来对符号常量GPIO_BASE和init_GPDR0进行引用,因而是位置无关的。由此可以得出如下结论:使用LDR伪指令将一个常量读取到非PC的其他通用寄存器中可实现位置无关的常量访问;但将一个地址值读取到PC中进行程序跳转时,跳转目标则是位置相关的。

(2) 程序设计规范2

其他被ROPI段中的代码引用的必须是绝对地址,或者是基于可读写位置无关(RWPI)段的静态基址寄存器的可写数据。

使用绝对地址只能引用被重定位到特定位置的代码段中的符号,通过在位置无关代码中引入绝对地址,可以让程序跳转到指定位置。例如,假设Bootloader的阶段1将其自身代码拷贝到链接时所指定的SDRAM地址空间后,当要跳转到阶段2的C程序入口时,可以使用指令“LDR PC, =main”跳转到程序在SDRAM中的main函数入口地址开始执行。这是因为程序在编译链接时给main函数分派绝对地址,系统通过将main函数的绝对地址直接赋给PC实现程序跳转。如果使用相对跳转指令“B main”,那么只会跳转到启动ROM内部的main函数入口。

关键字:ARM  位置无关  存储器  地址空间 引用地址:ARM的位置无关程序设计

上一篇:一种用ARM7+UC/OS-II设计的信号采集系统设计
下一篇:基于ARM平台的GPRS CQT测试系统的设计

推荐阅读最新更新时间:2024-03-16 12:53

ARM“吹牛”越发上瘾了:A57性能翻番!
基于64位ARMv8 Cortex-A53/A57架构的移动处理器将在今年底到明年初陆续面世,各家芯片厂商也都在纷纷做着最后的准备,那么在转向新架构、新工艺之后,我们能看到多大的性能提升呢? 在今天举行的第二届技术大会上,ARM今天又放出了一组官方幻灯片,其中就解答了这个问题,看起来很振奋。 首先,64位ARM处理器的类别将非常丰富,工艺上既有老的28nm,也有新的20nm、16nm FinFET,架构上既有单独的A53、A57,也有混合的A53+A57。 按照ARM的说法,如果都是28nm,A53可以比现在的A7性能高出接近50%,A57对比A15的话也是差不多的提升幅度。 但是我们不会在移动领域看到
[手机便携]
<font color='red'>ARM</font>“吹牛”越发上瘾了:A57性能翻番!
基于linux系统ARM学习步骤
很多人学完单片机就想学arm,但不知如何去学习~现在凌阳教育 ARM培训 网为大家列出一下学习这方面的步骤-----基于linux系统的学习步骤如下: 1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务 能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务 安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件
[单片机]
基于DSP E1-16XS的硬件开发平台设计
引言 嵌入式系统硬件的核心是各种类型的嵌入式处理器,目前全世界嵌入式处理器的品种已经超过1000多种,流行体系结构有30多个系列,嵌入式处理器一般可以分为嵌入式微处理器、嵌入式微控制器、嵌入式DSP处理器和嵌入式片上系统。 与标准微处理器相比,嵌入式微处理器只保留了和嵌入式应用有关的功能,并且为了满足嵌入式应用的特殊要求,在工作温度、抗电磁干扰、可靠性等方面都做了各种增强。 DSP嵌入式系统是DSP系统嵌入到应用电子系统中的一种通用系统,这种系统既具有DSP器件在数据处理方面的优势,又具有应用目标所需要的技术特征,在许多嵌入式应用领域,既需要在数据处理方面具有独特的优势的DSP,也需要在智能控制方面技高一筹的微处理器(MCU)
[嵌入式]
22个ARM常用概念
1 ARM中一些常见英文缩写解释 MSB:最高有效位; LSB:最低有效位; AHB:先进的高性能总线; VPB:连接片内外设功能的VLSI外设总线; EMC:外部存储器控制器; MAM:存储器加速模块; VIC:向量中断控制器; SPI:全双工串行接口; CAN:控制器局域网,一种串行通讯协议; PWM:脉宽调制器; ETM:嵌入式跟踪宏; CPSR:当前程序状态寄存器; SPSR:程序保护状态寄存器; 2MAM 使用注意事项 当改变 MAM 定时值时,必须先通过向 MAMCR 写入 0 来关闭 MAM,然后将新值写入 MAMTIM。最后,将需要的操作模式的对应值写入MAMCR,再次打开MAM。 对于低于 20MHz 的
[单片机]
22个<font color='red'>ARM</font>常用概念
基于ARM920T处理器核的图像采集系统设计
  引言   随着微电子技术和软件技术的发展,嵌入式技术也有了长足的进步。因此,基于嵌入式技术的图像数据采集与存储监控系统以其直观、方便、信息内容丰富的特点,广泛应用于许多场合。   处理器性能的提高,接口传输数据能力的增强,特别是未来高容量存储器的出现,图像监控系统的小型化、多功能化是易于实现的,嵌入式技术引入图像监控系统后,两个问题需要解决,一是灵活的图像监控系统结构调整,二是适合监控规范、集图像和信号检测与控制一体的交互式软件的设计。   1 系统平台的搭建   1.1 硬件平台的搭建   ARM(AdvancedRISCMachines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的统称,还可以认为
[单片机]
基于<font color='red'>ARM</font>920T处理器核的图像采集系统设计
ARM 启动代码笔记
1、汇编启动代码之看门狗 看门狗其实就是一个定时器,硬件上就是SOC内部的一个内部外设 看门狗不用分析原理图, 关键性操作寄存器 WTCON(xE270_0000) bit5 是开门狗的开关 1代表开,0代表关 2、汇编写启动代码之设置栈和调用C语言1 1、C语言运行需要和栈的意义 “C语言运行需要” 需要一定的条件,这些条件都是由汇编提供的。 C语言运行需要栈 栈的特点:自动进入,自动退出,C语言的局部变量,都是在栈中运行的。 如果我们汇编部分没有给C设置 合理的栈地址,那么C语言中的局部变量地址就会螺孔,整个程序就死掉了。 2、CPU模式各模式下的栈 每种模式下都有自
[单片机]
Nvidia确认ARM版Surface使用了Tegra芯片
6月20日消息,微软于昨日正式发布了两款Surface系列平板电脑, 其中Windows 8 Pro版配备的是22nm构架的英特尔Ivy Bridge芯片。而另一款经由Nvidia的确认,使用了Tegra芯片。   Nvidia公布的一段简短公告确认,Windows 8 RT版Surface配备了Tegra芯片,但并未指明具体是哪一款芯片。根据猜测,Surface使用的可能是四核Tegra 3 KAI平台,或者是许多Android设备将会使用的Tegra 3+。   目前,大多数WP设备所使用的都是高通芯片,例如Lumia 900,微软此举可以算作是一个重大的改变。Nvidia的四核芯片在性能和节能方面都十
[嵌入式]
Nvidia确认<font color='red'>ARM</font>版Surface使用了Tegra芯片
linux使用usb转串口调试ARM开发板
usb转串口使用的是pl2303芯片,linux2.4以上版本已经自带驱动。 1.安装minicom Ubuntu中使用 sudo apt-get install minicom 安装即可 2.配置minicom # minicom -s Serial port setup +-------------------------------------------------------------+ | A - Serial Device : /dev/ttyUSB0 | | B - Lockfile Location : /var/lock | | C
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved