ARM中的对齐问题
1. 简介
在ARM中,有ARM和Thumb两种指令。
ARM指令 :每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上,
即地址的低两位为bits[0b00],也就是说地址必须是4的倍数。
Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,
即地址的低两位为bits=0,也就是说地址必须是2的倍数。
遵循以上方式叫对齐(aligned)方式,不遵守这样方式称为非对齐(unaligned)的存储访问操作。
ARM CPU不支持未对齐双字(8 bytes)访问。
双字访问必须是8字节/4字节对齐.
2. ARM平台中的字节对齐关键字
(1) __align(num)
(2) __packed
进行一字节对齐。
(3) __unaligned
用于修饰某个变量,可按照非对齐方式访问。
3. __packed与#pragma pack(1)的区别
4. __attribute__((aligned))
用于指定类型的最低对齐要求.
5. --unaligned_access / --no_unaligned_access
用于启用/禁止:CPU上的未对齐数据访问.
ARMv6 / ARMv7-AR : 默认值为--unaligned_access
ARMv6之前的/ARMv7-M : 默认值为--no_unaligned_access
EDK中RVCT_ALL_CC_FLAGS设为:--no_unaligned_access
ARMGCC没有设。
6. 内存分配函数
尽量保证返回的地址,都是4字节对齐的。
7. 如何查找与字节对齐方面的问题
(1) 编译器的big little 设置
EDK中ARMGCC的flag设为:-mlittle-endian
(2) CPU是否支持非对齐访问
===================
字节对齐的故障只能出现在“引用”的使用过程中。当使用“对象名”来操作对象时,根本不用担心字节对齐问题。
在ADS环境下,有“ALIGN” 、“__align(x)” 、“__packed”关键字用于字节对齐处理。ALIGN用于汇编语言,__align(x)用于C语言,
__packed用于放弃字节对齐。
单字节对齐类型的引用可以操作任何对象,双字节对齐类型的引用可以操作双字节、四字节、八字节对齐的对象,…………。
只有遵守这个规则,程序才可能是健壮的。
如果我们想使用双字节对齐类型的引用来操作单字节对齐对象,那么你在定义该引用时必须使用__packed关键字!
============================
ARM对齐问 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)