非对齐数据访问.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
非对齐数据访问.doc

ARM体系中存储系统非对齐的存储访问操作 ARM系列处理器是RISC (Reducded Instruction Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC处理器。和很多RISC处理器一样,ARM系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;存取“字节(Byte)”数据时要求该数据按其自然尺寸边界(Natural Size Boundary)定位。   ARM编译程序通常将全局变量对齐到自然尺寸边界上,以便通过使用LDR和STR指令有效地存取这些变量。这种内存访问方式与多数CISC (Complex Instruction Set Computing)体系结构不同,在CISC体系结构下,指令直接存取未对齐的数据。因而,当需要将代码从CISC体系结构向ARM处理器移植时,内存访问的地址对齐问题必须予以注意。在RISC体系结构下,存取未对齐数据无论在代码尺寸或是程序执行效率上,都将付出非常大的代价。   本文将从以下几个方面讨论在ARM体系结构下的程序设计问题。   未对齐的数据指针   C和C++编程标准规定,指向某一数据类型的指针,必须和该类型的数据地址对齐方式一致,所以ARM编译器期望程序中的C指针指向存储器中字对齐地址,因为这可使编译器生成更高效的代码。   比如,如果定义一个指向int数据类型的指针,用该指针读取一个字,ARM编译器将使用LDR指令来完成此操作。如果读取的地址为四的倍数(即在一个字的边界)即能正确读取。但是,如果该地址不是四的倍数,那么,一条LDR指令返回一个循环移位结果,而不是执行真正的未对齐字载入。循环移位结果取决于该地址向对于字的边界的偏移量和系统所使用的端序(Endianness)。例如,如果代码要求从指针指向的地址0x8006载入数据,即要载入0x8006、0x8007、0x8008和0x8009四字节的内容。但是,在ARM处理器上,这个存取操作载入了0x8004、0x8005、0x8006和0x8007字节的内容。这就是在未对齐的地址上使用指针存取所得到的循环移位结果。   因而,如果想将指针定义到一个指定地址(即该地址为非自然边界对齐),那么在定义该指针时,必须使用 __packed限定符来定义指针: 例如,   __packed int *pi; // 指针指向一个非字对其内存地址   使用了_packed限定符限定之后,ARM编译器将产生字节存取命令(LDRB或STRB指令)来存取内存,这样就不必考虑指针对齐问题。所生成的代码是字节存取的一个序列,或者取决于编译选项、跟变量对齐相关的移位和屏蔽。但这会导致系统性能和代码密度的损失。   值得注意的是,不能使用 __packed限定的指针来存取存储器映射的外围寄存器,因为ARM编译程序可使用多个存储器存取来获取数据。因而,可能对实际存取地址附近的位置进行存取,而这些附近的位置可能对应于其它外部寄存器。当使用了位字段(Bitfield)时, ARM程序将访问整个结构体,而非指定字段。 在ARM中,通常希望字单元的地址是字对齐的(地址的低两位为0b00),半字单元的地址是半字对齐的(地址的最低为0b0).在存储访问操作中,如果存储单元的地址没有遵守上述的对齐规则,则称为非对齐(unaligned)的存储访问操作. 1.非对齐指令的预取操作 当处理器处于ARM状态器件,如果写入到寄存器PC中的值是非字对齐的(低两位不为0b00),要么指令执行的结果不可预知,要么地址值中最低两位被忽略; 当处理器处于Thumb状态器件,如果写入到寄存器PC中的值是非半字对齐的(最低位不为0b0),要么指令执行的结果不可预知,要么的重地值中最低位被忽略. 如果系统中指定,当发生非对齐的指令预取操作时,忽略地址值中相应的位,则有存储系统实现这种”忽略”.也就是说,这时该地址值原封不动的送到存储系统. 2.非对齐的数据访问操作 对于Load/Store操作,如果是非对齐的数据访问操作,系统定义了下面3种可能的结果. 1执行的结果不可预知. 2忽略字单元地址的低两位,即访问地址为(address _and 0xffffffc)的字单元;忽略半字单元地址的最低位的值,即访问地址位(address _and 0xffffffe)的半字单元. 3忽略字单元地址值种的低两位的值;忽略半字单元地址的最低位的值.有存储体统实现这种”忽略”.也就是说,这时该地址值原封不动的送到存储系统.arm开发板 当发生非对齐的数据访问时,到底采用上述3种处理方法种的哪一种,是有各指令指定的. ar

文档评论(0)

ziyouzizai + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档