ARM體系中儲存系統

GeekAdo發表於2014-07-15

ARM體系中儲存系統

 

1. ARM體系中的儲存空間

        ARM體系使用單一的平板地址空間.該地址空間的大小為232個8位位元組.這些位元組單元的地址是一個無符號的32位數值,起取值範圍為0232-1.

        32位情況:

ARM的地址空間也可以看作是230個32位的字單元.這些字單元的地址可以被4整除,也就是說該地址的低兩位為0b00.地址為A的字資料包括地址為A,A+1,A+2,A+3 4個位元組單元的內容.

        16位情況:

ARM版本4及以上的版本中,ARM的地址空間也可以看作是231個16位的半字單元.這些半字單元的地址可以被2整除,也就是說該地址的最低位為0b0.地址為A的半字資料包括地址為A,A+1兩個位元組單元的內容.

        地址取模:

各儲存單元的地址作為32位的無符號數,可以進行常規的整數運算.這些運算的結果進行232取模.也就是說,運算結果發生上溢位和下溢位是,地址將會發生繞圈.

2. ARM儲存器格式

        在ARM體系中,每個字單元中包含4各位元組單元或者兩個半字單元;1各半字單元中包含兩個位元組單元.但是在字單元中,4各位元組哪一個是高位位元組,哪一個是低位位元組則有兩種不同的格式:big-endian格式和little-endian格式.

        在big-endian格式中,對於地址位A的字單元包括位元組單元A,A+1,A+2,A+3,其中位元組單元有高位到低位位元組順序為A,A+1,A+2,A+3;地址為A的字單元包括半字單元A,A+2,其中半字單元有高位到低位位元組順序位A,A+2;地址為A的半字單元包括位元組單元A,A+1,其中位元組單元有高位到低位位元組順序為A,A+1.這種儲存格式如圖1.1所示.

        在little-endian格式中,地址為A的字單元包括位元組單元A,A+1,A+2,A+3,其中位元組單元有高位到低位位元組順序為A+3,A+2,A+1,A;地址為A的字單元包括半字單元A,A+2,其中半字單元有高位到低位位元組順序位A+2,A;地址為A的半字單元包括位元組單元A,A+1,其中位元組單元有高位到低位位元組順序為A+1,A.這種儲存器格式如圖1.2所示.

    

   31               24 23               16 15               8 7               0 

字單元A

半字單元A

半字單元A+2

位元組單元A

位元組單元A+1

位元組單元A+2

位元組單元A+3

 

                        圖1.1 big-endian格式的儲存系統

 

 

31               24 23               16 15               8 7               0 

字單元A

半字單元A+2

半字單元A

位元組單元A+1

位元組單元A+2

位元組單元A+1

位元組單元A

 

                        圖1.2 little-endian格式的儲存系統

3. 非對齊的儲存訪問操作

        在ARM,通常希望字單元的地址是字對齊的(地址的低兩位為0b00),半字單元的地址是半字對齊的(地址的最低為0b0).在儲存訪問操作中,如果儲存單元的地址沒有遵守上述的對齊規則,則稱為非對齊(unaligned)的儲存訪問操作.

 

1.非對齊的指令預取操作

當處理器處於ARM狀態器件,如果寫入到暫存器PC中的值是非字對齊的(低兩位不為0b00),要麼指令執行的結果不可預知,要麼地址值中最低兩位被忽略;

 

當處理器處於Thumb狀態器件,如果寫入到暫存器PC中的值是非半字對齊的(最低位不為0b0),要麼指令執行的結果不可預知,要麼的重地值中最低位被忽略.

 

如果系統中指定,當發生非對齊的指令預取操作時,忽略地址值中相應的位,則有儲存系統實現這種”忽略”.也就是說,這時該地址值原封不動的送到儲存系統.

 

2.非對齊的資料訪問操作

對於Load/Store操作,如果是非對齊的資料訪問操作,系統定義了下面3種可能的結果.

 

<1>執行的結果不可預知.

<2>忽略字單元地址的低兩位,即訪問地址為(address and 0xffffffc)的字單元;忽略半字單元地址的最低位的值,即訪問地址位(address and 0xffffffe)的半字單元.

<3>忽略字單元地址值種的低兩位的值;忽略半字單元地址的最低位的值.有儲存體統實現這種”忽略”.也就是說,這時該地址值原封不動的送到儲存系統.

當發生非對齊的資料訪問時,到底採用上述3種處理方法種的哪一種,是有各指令指定的.

指令預取和自修改程式碼

        在ARM中允許指令預取.CPU執行當前指令的同時,可以從儲存器種預取出若干條指令,具體預取多少條指令,不同的ARM實現種有不同的數值.

        預取的指令並不一定能夠得到執行.比如當前指令完成後,如果發生了異常中斷,程式將會跳轉到異常中斷處理程式處執行,當前預取的指令將被拋棄.或者如果執行了跳轉指令,則當前預取的指令也將被拋棄.

        正如在不同的ARM實現預取的指令條數可能不同,當發生程式跳轉是,不同的ARM實現種採用的跳轉預測演算法也可能不同.

        自修改程式碼指的是程式碼在執行過程種可能修改自身.對於支援指令預取的ARM系統,自修改程式碼可能帶來潛在的問題.當指令被預取後,在該指令被執行前,如果有資料訪問指令修改了位於主存種的該指令,這是被預取的指令和主存種對應的指令不同,從而可能使執行的結果發生錯誤.

 

相關文章