



全文预览已结束
VIP免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
位置无关代码(PIC)的思考 分类: C/C+linux2011-11-13 11:49888人阅读评论(0)收藏举报应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要对所有目标文件进行重定位(relocation),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行过程中对变量、函数等符号的正确引用,使程序正常运行。在具有操作系统的系统中,重定位过程由操作系统自动完成。在设计Bootloader程序时,必须在裸机环境中进行,这时Bootloader映像文件的运行地址必须由程序员设定。通常情况下,将Bootloader程序下载到ROM的0x0地址进行启动,而在大多数应用系统中,为了快速启动,首先将Bootloader程序拷贝到SDRAM中再运行。一般情况下,这两者的地址并不相同。首先来看下面的链接脚本文件:cpp view plaincopyprint?1. ENTRY(_start) 2. ;指定输出可执行文件的起始代码段为_start. 3. SECTIONS 4. 5. .= BOOTADDR ; bootloader的开始地址/ 6. .= ALIGN(4); 代码以4字节对齐 7. .text :;指定代码段 8. 9. cpu/arch/start.o (.text) ; bootloader中的text段 10. *(.text) ;其它text段 11. 12. .= ALIGN(4) 13. .rodata :*(.rodata);指定只读数据段 14. .= ALIGN(4); 15. .data :*(.data);指定读/写数据段 16. .= ALIGN(4); 17. _bss_start =.; 把_bss_start赋值为当前位置,即bss段的开始位置 18. .bss :*(.bss); 指定bss段 19. _end =.; 把_end赋值为当前位置,即bss段的结束位置 20. ENTRY(_start) ;指定输出可执行文件的起始代码段为_start.SECTIONS .= BOOTADDR ; bootloader的开始地址/ .= ALIGN(4); 代码以4字节对齐 .text :;指定代码段 cpu/arch/start.o (.text) ; bootloader中的text段 *(.text) ;其它text段 .= ALIGN(4) .rodata :*(.rodata);指定只读数据段 .= ALIGN(4); .data :*(.data);指定读/写数据段 .= ALIGN(4); _bss_start =.; 把_bss_start赋值为当前位置,即bss段的开始位置 .bss :*(.bss); 指定bss段 _end =.; 把_end赋值为当前位置,即bss段的结束位置需要指出的是,链接脚本中所描述的输出段地址为虚拟地址VMA(VirtualMemoryAddress)。这里的“虚拟地址”仅指映像文件执行时,各输出段所重定位到相应的存储地址空间,与映像文件烧写到的实际的地址无关(即映像的加载地址)。因此,上面的链接脚本实际上指定了Bootloader映像在执行时,将被重定位到BOOTADDR开始的存储地址空间,以保证在相关位置对符号进行正确引用,使程序正常运行。假设这里指定BOOTADDR= 0x0。以ARM为例, ARM处理器复位后总是从0x0地址取第1条指令,因此只需把BOOTADDR设置为0,再把编译后生成的可执行二进制文件下载到ROM的0x0地址开始的存储空间,程序便可正常引导;但是,一旦在链接时指定映像文件从0x0地址开始,那么Bootloader就只能在0x0地址开始的ROM空间内运行,而无法拷贝到SDRAM空间运行实现快速引导。当然,搬运代码最后的跳转语句可以写成绝对地址,如jmp 0x10000,这样可以正确的跳到RAM中的0x10000地址处,但当执行继续执行碰到其他符号地址计算,或全局数据访问的时候,由于此时不是位置无关代码,此时地址的计算需要查询map表,但是map表中的地址仍然在ROM空间中,所以还会跳回ROM空间,另外,还会有其他问题,如动态内存申请等。有了位置无关代码,只需修改链接脚本文件的BOOTADDR=0x10000即可,即将整个镜像文件都映射到RAM空间,但是bootloader最开始的搬运代码必须是位置无关的代码,这样虽然搬运代码被映射到RAM地址空间,但它在0x0开始的ROM中也能正确执行,搬运代码最后的跳转语句就可以跳转到某个标号了,因为此时标号的地址已经被映射到了ram空间,之后的代码执行将没有任何问题。当然,可以将搬运代码和搬运完成跳转到的代码分段映射,即搬运代码映射到ROM地址空间,其他代码映射到RAM空间。但是这样会存在一个问题:生成的bin文件变得非常大。生成的bin文件将会按照映射到地址空间来生成,如果ROM空间与RAM空间地址不连续,假设ROM地址空间为0x0 0x1000 , RAM地址空间为0x100000x20000,那么, 0x10000x10000之间的地址空间都被填充为0,除非在生成bin文件时重新进行拼装。如何编写位置无关代码呢?引用同一位置无关段或相对位置固定的另一位置无关段中的符号时,必须是基于PC的符号引用,即使用相对于当前PC的偏移量来实现跳转或进行常量访问。1.位置无关的程序跳转。使用相对跳转指令实现程序跳转。指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实现位置无关性。2.位置无关的常量访问。在应用程序中,经常要读写相关寄存器以完成必要的硬件初始化。为增强程序的可读性,利用EQU伪指令对一些常量进行赋值,但在访问过程中,必须实现位置无关性。3. 使用绝对地址进行跳转,一般是在不同的位置无关代码段之间跳转。最后,总结一下位置无关代码段的优点:1.简化设计,方便实现系统的快速引导。位置无关代码可以避免在引导时进行地址映射,并方便地跳转到RAM中实现快速引导2.实现复位处理智能化。位置无关的代码可以被加载到任意地址空间运行3.便于调试。Bootloader的调试通常也是一个繁琐的过程,使用位置无关代码,则可以将映像文件加载到RAM中进行调试,这既能真实地反映程序从ROM中 进行系统引导的情况,又可以避免频繁烧写程序存储器。 位置无关代码(PIC)的分析理解 -转载(2012-03-28 13:48:12) 转载标签: it分类: 刚开始学 首先,需要理解加载域与运行域的概念。加载域是代码存放的地址,运行域是代码运行时的地址。为什么会产生这2个概念?这2个概念的实质意义又是什么呢?在一些场合,一些代码并不在储存这部分代码的地址上执行地址,比如说,放在norflash中的代码可能最终是放在RAM中运行,那么中norflash中的地址就是加载域,而在RAM中的地址就是运行域。在汇编代码中我们常常会看到一些跳转指令,比如说b、bl等,这些指令后面是一个相对地址而不是绝对地址,比如说b main,这个指令应该怎么理解呢?main这里究竟是一个什么东西呢?这时候就需要涉及到链接地址的概念了,链接地址实际上就是链接器对代码中的变量名、函数名等东西进行一个地址的编排,赋予这些抽象的东西一个地址,然后在程序中访问这些变量名、函数名就是在访问一些地址。一般所说的链接地址都是指链接这些代码的起始地址,代码必须放在这个地址开始的地方才可以正常运行,否则的话当代码去访问、执行某个变量名、函数名对应地址上的代码时就会找不到,接着程序无疑就是跑飞。但是上面说的那个b main的情形有点特殊,b、bl等跳转指令并不是一个绝对跳转指令,而是一个相对跳转指令,什么意思呢?就是说,这个main标签最后得到的只并不是main被链接器编排后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 标签感知嵌入与表征学习
- 毕业实习教育总结(30篇)
- 专业车辆碰撞责任界定与赔偿协议
- 场地环境风险评估合同
- 民间借贷财产保全法律文书定制服务协议
- 2025年中考考前最后一卷化学(深圳卷)(全解全析)
- 乡镇宗教活动方案
- 吉林医药宿舍管理制度
- 学校节日活动管理制度
- 公司高管用车管理制度
- 2022年山东省职业院校技能大赛高职组“HTML5交互融媒体内容设计与制作”赛项-任务书(样)
- 塘实小腾讯扣叮创意编程赛自测题附有答案
- 炼焦工中级工题库
- YDT 4560-2023-5G数据安全评估规范
- 数字健康在慢病管理中的应用
- 中国移动劳动合同范本
- DL-T-5728-2016水电水利工程控制性灌浆施工规范
- DL5190.4-2019电力建设施工技术规范第4部分:热工仪表及控制装置
- 2022-2023学年上海市闵行区八年级(下)期末数学试卷
- 2023年7月浙江省高中学业水平考试生物试卷真题(含答案详解)
- 加油站廉洁培训课件
评论
0/150
提交评论