ARM中的對齊問題
1. 簡介
本文引用地址:http://cqxgywz.com/article/201611/316963.htm在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關鍵字!
============================


評論