ARM的位置在Bootloader中的应用_第1页
ARM的位置在Bootloader中的应用_第2页
ARM的位置在Bootloader中的应用_第3页
ARM的位置在Bootloader中的应用_第4页
ARM的位置在Bootloader中的应用_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、ARM的位置在Bootloader中的应用引言1 位置无关代码及程序设计方法1.1 基本概念与实现原理1.2 arm处理器的位置无关程序设计要点(1) 程序设计规范(2) 程序设计规范22 位置无关代码在Bootloader设计中的应用使用位置无关设计Bootloader程序有如下优点:3 结论arm处理器支支持位置置无关的的程序设设计,这这种程序序加载到到存储器器的任意意地址空空间都可可以正常常运行,其设计计方法在在嵌入式式应用系系统开发发中具有有重要的的作用。本文首首先介绍绍位置无无关代码码的基本本概念和和实现原原理,然然后阐述述基于arm汇编位置置无关的的程序设设计方法法和实现现过程,最

2、后以以嵌入式式Bootloader程序设计计为例,介绍位位置无关关程序设设计在Bootloader程序设计计中的作作用。基于位置置无关代代码PIC(PositionIndependentCode)的程序序设计在在嵌入式式应用系系统开发发中具有有重要的的作用,尤其在在裸机状状态下开开发Bootloader程序及进进行内核核初始化化设计;利用位位置无关关的程序序设计方方法还可可以在具具体应用用中用于于构建高高效率动动态链接接库,因因而深入入理解和和熟练掌掌握位置置无关的的程序设设计方法法,有助助于开发发人员设设计出结结构简单单、清晰晰的应用用程序。本文首首先介绍绍位置无无关代码码的基本本概念和和实

3、现原原理,然然后阐述述基于arm汇编位置置无关的的程序设设计方法法和实现现过程,最后以以Bootloader程序设计计为例,介绍了了位置无无关程序序设计在在Bootloader程序设计计中的作作用。引言1.1基本概念念与实现现原理应用程序序必须经经过编译译、汇编编和链接接后才变变成可执执行文件件,在链链接时,要对所所有目标标文件进进行重定定位(relocation),建立符符号引用用规则,同时为为变量、函数等等分配运运行地址址。当程程序执行行时,系系统必须须把代码码加载到到链接时时所指定定的地址址空间,以保证证程序在在执行过过程中对对变量、函数等等符号的的正确引引用,使使程序正正常运行行。在具

4、具有操作作系统的的系统中中,重定定位过程程由操作作系统自自动完成成。在设计Bootloader程序时,必须在在裸机环环境中进进行,这这时Bootloader映像文件件的运行行地址必必须由程程序员设设定。通通常情况况下,将将Bootloader程序下载载到ROM的0 x0地址进行行启动,而在大大多数应应用系统统中,为为了快速速启动,首先将将Bootloader程序拷贝贝到SDRAM中再运行行。一般般情况下下,这两两者的地地址并不不相同,程序在在SDRAM中的地址址重定位位过程必必须由程程序员完完成。实实际上,由于Bootloader是系统上上电后要要执行的的第一段段程序,Bootloader程序

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

6、码码,但这这并不能能修正程程序设计计中固有有的位置置相关性性缺陷。特别是是汇编语语言代码码,必须须由程序序员遵循循一定的的程序设设计准则则,才能能保证程程序的位位置无关关性。位置无关关代码常常用于以以下场合合:arm程序的位位置无关关可执行行文件PIE(PositionIndependent Executable)包括位位置无关关代码PIC和位置无无关数据据PID(PositionIndependent Data)两部分分。PID主要针对对可读写写数据段段(.data段),其其中保存存已赋初初值的全全局变量量。为实实现其位位置无关关性,通通常使用用寄存器器R9作为静态态基址寄寄存器,使其指指向

7、该可可读写段段的首地地址,并并使用相相对于基基址寄存存器的偏偏移量来来对该段段的变量量进行寻寻址。这这种方法法常用于于为可重重入程序序的多个个实例产产生多个个独立的的数据段段。在程程序设计计中,一一般不必必考虑可可读写段段的位置置无关性性,这主主要是因因为可读读写数据据主要分分配在SDRAM中。1.2arm处理器的的位置无无关程序序设计要要点PIC包括程序序中的代代码和只只读数据据(.text段),为为保证程程序能在在ROM和SDRAM空间都能能正确运运行(如如裸机状状态下的的Bootloader程序),必须采采用位置置无关代代码程序序设计。下面重重点介绍绍PIC的程序设设计要点点。PIC遵循

8、只读读段位置置无关ROPI(ReadOnlyPositionIndependence)的ATPCS(armThumbProcedureCallStandard)的程序序设计规规范:引用同一一ROPI段或相对对位置固固定的另另一ROPI段中的符符号时,必须是是基于PC的符号引引用,即即使用相相对于当当前PC的偏移量量来实现现跳转或或进行常常量访问问。 位置置无关的的程序跳跳转。在在arm汇编程序序中,使使用相对对跳转指指令B/BL实现程序序跳转。指令中中所跳转转的目标标地址用用基于当当前PC的偏移量量来表示示,与链链接时分分配给地地址标号号的绝对对地址值值无关,因而代代码可以以在任何何位置进进行

9、跳转转,实现现位置无无关性。另外,还还可使用用ADR或ADRL伪指令将将地址标标号值读读取到PC中实现程程序跳转转。这是是因为ADR或ADRL等伪指令令会被编编译器替替换为对对基于PC的地址值值进行操操作,但但这种方方式所能能读取的的地址范范围较小小,并且且会因地地址值是是否为字字对齐而而异。但但在在arm程序中,使用LDR等指令直直接将地地址标号号值读取取到PC中实现程程序跳转转不是位位置无关关的。(1) 程序序设计规规范例如:LDRPC,=main上面的LDR汇编伪指指令编译译后的结结果为:LDRPC,PC,OFFSET_TO_LPOOLLPOOLDCDmain可见,虽虽然LDR是把基于于

10、PC的一个存存储单元元LPOOL的内容加加载到PC中,但该该存储单单元中保保存的却却是链接接时所决决定的main函数入口口的绝对对地址,所以main函数实际际所在的的段不是是位置无无关。 位置置无关的的常量访访问。在在应用程程序中,经常要要读写相相关寄存存器以完完成必要要的硬件件初始化化。为增增强程序序的可读读性,利利用EQU伪指令对对一些常常量进行行赋值,但在访访问过程程中,必必须实现现位置无无关性。下面以以PXA270的GPIO初始化介介绍位置置无关的的常量访访问方法法。GPIO_BASEEQU0 x40e00000;GPIO基址寄存存器地址址GPDR0EQU0 x00c;相对于GPIO基

11、址寄存存器的偏偏移量init_GPDR0EQU0 xfffbfe00;寄存器GPDR0初值LDRR1,=GPIO_BASELDRR0,=init_GPDR0STRR0,R1,#GPDR0上述汇编编代码段段经编译译后的结结果为:LDRR1,PC,OFFSET_TO_GPIO_BASELDRR0,PC,OFFSET_TO_init_GPDR0STRR0,R1,#0 xcGPIO_BASEDCD0 x40e00000GPDR0DCD0 x00cinit_GPDR0DCD0 xfffbfe00可见,LDR伪指令实实际上使使用基于于PC的偏移量量来对符符号常量量GPIO_BASE和init_GPDR0进

12、行引用用,因而而是位置置无关的的。由此此可以得得出如下下结论:使用LDR伪指令将将一个常常量读取取到非PC的其他通通用寄存存器中可可实现位位置无关关的常量量访问;但将一一个地址址值读取取到PC中进行程程序跳转转时,跳跳转目标标则是位位置相关关的。其他被ROPI段中的代代码引用用的必须须是绝对对地址,或者是是基于可可读写位位置无关关(RWPI)段的静态态基址寄寄存器的的可写数数据。使用绝对对地址只只能引用用被重定定位到特特定位置置的代码码段中的的符号,通过在在位置无无关代码码中引入入绝对地地址,可可以让程程序跳转转到指定定位置。例如,假设Bootloader的阶段1将其自身身代码拷拷贝到链链接时

13、所所指定的的SDRAM地址空间间后,当当要跳转转到阶段段2的C程序入口口时,可可以使用用指令“LDRPC, =main”跳转到程程序在SDRAM中的main函数入口口地址开开始执行行。这是是因为程程序在编编译链接接时给main函数分派派绝对地地址,系系统通过过将main函数的绝绝对地址址直接赋赋给PC实现程序序跳转。如果使使用相对对跳转指指令“Bmain”,那么只只会跳转转到启动动ROM内部的main函数入口口。(2) 程序序设计规规范2在使用GNU工具开发发Bootloader时,程序序在链接接时会通通过一个个链接脚脚本(linkerscript)来设定定映像文文件的内内存映射射。一个个简单

14、的的链接脚脚本结构构如下:OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS. =BOOTADDR;/*Bootloader的起始地地址*/_boot_start=.;.textALIGN(4):/*代码段.text*/*(.text)2位置无关关代码在在Bootloader设计中的的应用.dataALIGN(4):/*数据段.data*/*(.data).gotALIGN(4): /*全局偏移移量表.got段*/*(.got)_boot_end =.;/*Bootloader映像文件件的结束束地址*/.bssALIGN(16):/*堆栈段.bss*/_bss_star

15、t= .;*(.bss)_bss_end=.;这里不再再介绍链链接脚本本的语法法。需要要指出的的是,链链接脚本本中所描描述的输输出段地地址为虚虚拟地址址VMA(Virtual MemoryAddress)。这里里的“虚拟地址址”仅指映像像文件执执行时,各输出出段所重重定位到到相应的的存储地地址空间间,与内内存管理理无关。因此,上面的的链接脚脚本实际际上指定定了Bootloader映像在执执行时,将被重重定位到到BOOTADDR开始的存存储地址址空间,以保证证在相关关位置对对符号进进行正确确引用,使程序序正常运运行。arm处理器复复位后总总是从0 x0地址取第第1条指令,因此只只需把BOOTAD

16、DR设置为0,再把编编译后生生成的可可执行二二进制文文件下载载到ROM的0 x0地址开始始的存储储空间,程序便便可正常常引导;但是,一旦在在链接时时指定映映像文件件从0 x0地址开始始,那么么Bootloader就只能在在0 x0地址开始始的ROM空间内运运行,而而无法拷拷贝到SDRAM空间运行行实现快快速引导导。当然然,对PXA270等具有MMU功能的微微处理器器来说,虽然可可以先将将Bootloader映像整个个拷贝到到SDRAM中,再使使用MMU功能将SDRAM空间映射射到0 x0地址,进进而继续续在SDRAM中运行;但这样样一方面面会使得得Bootloader的设计与与实现复复杂化,另

17、一方方面在一一些必须须屏蔽MMU功能的应应用中(例如引引导armlinux系统),无法使使用MMU进行地址址重映射射。利用ARM的基于位位置无关关的程序序设计可可以解决决上述问问题。只只需在程程序链接接时,将将BOOTADDR设置为SDRAM空间的地地址(一一般情况况下利用用SDRAM中最高的的1 MB存储空间间作为起起始地址址),这这样arm处理器上上电复位位后Bootloader仍然可以以从地址址0开始执行行,并将将自身拷拷贝到指指定的_boot_start起始的SDRAM中运行。实现上上述功能能的链接接脚本所所对应的的启动代代码架构构如下:.section.text.globl_star

18、t_start:Breset/*复位异常常*/*其他异常常处理代代码*/reset:/*复位处理理程序*/copy_boot:/*拷贝Bootloader到SDRAM*/LDRR0,=0 x0LDRR1,=_boot_startLDRR2,=_boot_end1:LDRMIAR0!, R3-R10 STRMIAR1!, R3-R10CMPR1,R2BLT1bclear_bss:/*清零.bss段*/BLinit_Stack/*初始化堆堆栈*/LDRPC,=main/*跳转到阶阶段2的C程序入口口*/.end程序入口口为_start,即复位位异常,所有其其他异常常向量都都使用相相对跳转转指令B来

19、实现,以保证证位置无无关特性性。在完完成基本本的硬件件初始化化后,利利用链接接脚本传传递过来来_boot_start和_boot_end的参数,将Bootloader映像整个个拷贝到到指定的的SDRAM空间,并并清零.bss段,初始始化堆栈栈后,程程序将main函数入口口的绝对对地址赋赋给PC,进而跳跳转到SDRAM中继续运运行。程程序在跳跳转到main函数之前前,所有有的代码码都在ROM中运行,因而必必须要保保证代码码的位置置无关性性,所以以在调用用初始化化GPIO、存储系系统和堆堆栈等子子程序时时,都使使用相对对跳转指指令来完完成。 简化化设计,方便实实现系统统的快速速引导。位置无无关代码

20、码可以避避免在引引导时进进行地址址映射,并方便便地跳转转到SDRAM中实现快快速引导导。 实现现复位处处理智能能化。由由于位置置无关代代码可以以被加载载到任意意地址空空间运行行,因此此其运行行时的当当前地址址与链接接时所指指派的地地址并不不一定相相同。利利用这一一特性,可以在在复位处处理程序序中使处处理器进进入SVC模式并关关闭中断断后加入入如下代代码,便便可根据据当前运运行时的的地址进进行不同同的复位位处理:ADRR0,_start/*读取当前前PC附近的_start标号所在在指令地地址*/LDRR1,=_boot_start/*读取Bootloader在SDRAM的起始地地址*/CMPR0,R1BEQclear_

温馨提示

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

评论

0/150

提交评论