1.什么叫地址對齊?
RISC 下使用訪存指令讀取或寫入數據單元時,目標地址必須是所訪問之數據單元字節數的整數倍,這個叫做地址對齊。
2.計算機主要的架構分哪兩類?及其地址對齊在兩者的區別?
計算機主要的架構就分為兩類,復雜指令集計算機(CISC)和精簡指令集計算機(RISC)。CISC最有代表性的架構就是x86,RISC最有代表性的架構就是ARM。不管是什么架構,對要訪問的一定長度的數據的地址是有要求的,比如要訪問一個32位的整數,那么這個數據必須(最好)存儲在以4字節(32/8=4)對齊的地方。一般來說,RISC對對齊要求的更嚴格些,非對齊訪問可能會帶來性能上的損失。這對程序在不同架構間移植非常重要,因為它極有可能導致你的程序崩潰。
從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定類型變量的時候經常在特定的內存地址訪問,各個硬件平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。
3.MIPS平台的地址對齊。
在 MIPS 平台上,lh 讀取一個半字時,存儲器的地址必須是 2 的整數倍; lw 讀取一個字時,存儲器的地址必須是 4的整數倍; sd 寫入一個雙字時,存儲器的地址必須是 8 的整數倍。倘若訪存時,目標地址不對齊,則會引起異常,典型的是系統提示“總線錯誤”后,直接殺死進程。
直接貼代碼:
1 int main(void){ 2 unsigned int i = 0x12345678; 3 4 unsigned char *p = (unsigned char *)&i; 5 *p = 0x00; 6 unsigned short *p1 = (unsigned short *)(p+1); 7 *p1 = 0x0000; 8 9 return 0; 10 }
最后兩句代碼,從奇數邊界去訪問unsigned short型變量,顯然不符合對齊的規定。在X86上,類似的操作只會影響效率;但在MIPS或者SPARC上可能導致error,因為它們要求必須字節對齊。