1.前言
本文主要從應用的角度介紹ARMV8的編程模型和存儲模型
2. AArch64應用級編程模型
從應用的角度看到的ARM處理器元素:
可見的元素(寄存器/指令) |
說明 |
可見的寄存器 |
R0-R30、SP、 PC、 V0-V31、 FPCR、 FPSR |
可見的PSTATE位 |
NZCV DAIF |
可見的系統寄存器 |
Cache ID registers Debug registers Performance Monitors registers Thread ID registers Timer registers |
性能監控支持 |
可通過高一級的異常級別修改PMUSERENR_EL0寄存器來使能EL0的性能監控功能 |
異常處理 |
通過SVC指令引發系統調用異常(異常處理是由高於EL0的異常級別執行的) |
等待中斷與等待事件 |
WFI和WFE指令 |
Yield指令 |
為提高整體性能,某個線程讓給其它線程,用於多線程執行下的性能優化 |
Cache管理 |
很少的cache管理指令供EL0使用,通過高異常級別設置SCTLR_EL1,來使能cache管理指令 |
Debug事件 |
應用級軟件對大部分Debug事件不可見,僅有的包括: BKPT指令:引起BKPT指令事件發生; DBG指令:給debug系統提供暗示?? HLT指令:引發進入debug狀態 |
表 AARCH64下從應用的角度可以看到的寄存器或指令集
3. AArc64應用級存儲模型
3.1 地址空間
- 采用64bit寄存器計算地址;
- 高8位可由supervisory軟件配置作為tag信息;
- 高8位配置為tag信息將不做有效性檢查,也不會傳遞給PC;
- supervisory軟件決定有效地址范圍,如果訪問非法地址會導致MMU fault.
3.2 存儲類型
- Normal
主要用於大塊內存的讀寫、只讀操作;
- Device
禁止隨機讀寫操作,如大部分的IO寄存器
3.3 Cache與存儲層級
內存系統的實現非常依賴各個處理器的具體實現,ARMV8體系結構定義了與內存系統交互的應用級接口,包括帶有多級caches的存儲層級系統
- cache
Cache是一種高速的存儲塊。包含很多的存儲項,每個存儲項包含主存的地址(稱為tag)和數據信息。利用時間局部性和空間局部性提高了內存的訪問速度;
Cache line: 將cache分成一些固定大小的存儲空間, 這些存儲空間叫做Cache Line.
Cache hit:cache命中,訪問的數據存在於cache中;
Cache miss:cache失效,訪問的數據不在cache中;
- PoU(Point of Unification)
PoU是一個存儲層級的點,data cache, instruction cache和translation table walks看到的都是相同的copy. 那么這個點就是該PE的Point of Unification。
假設一個4核cpu,每個core都有自己的L1 instruction cache和L1 Data cache,所有的core共享L2 cache。在這樣的一個系統中,PoU就是L2 cache,只有在該點上,特定PE的instruction cache、data cache和translation table walk硬件單元訪問memory的時候看到的是同一個copy
- PoC(Point of Coherency)
可以認為是Point of System,它和PoU的概念類似,只不過PoC是以系統中所有的agent(bus master,又叫做observer,包括CPU、DMA engine等)為視角
這些agents在進行memory access的時候看到的是同一個copy的那個“點”。例如上一段文章中的4核cpu例子,如果系統中還有一個DMA controller和main memory(DRAM)通過bus連接起來,在這樣的一個系統中,PoC就是main memory這個level,因為DMA controller不通過cache訪問memory,因此看到同一個copy的位置只能是main memory了。
- Cacheablily和shareablity
用來描述多處理器系統中的存儲層級屬性.
Cacheablity:定義了是否某段內存被指定給了一個cache;
Shareablity:定義了某段內存位置在整個系統中是共享的. 指當前內存頁表項的數據是否可以同步到其它CPU上,多核CPU調用帶有該屬性頁表項的數據,一旦某個CPU修改了數據,那么系統將自動更新到其它CPU的數據拷貝,實現內存數據一致性
3.4 應用訪問cache相關功能
體系結構定義了一組cache維護指令,應用軟件可以用來管理cache一致性。運行在EL1或更高異常等級的軟件可以使能/禁用EL0的一些功能:
(1)SCTLR_EL1.UCI == 1
運行在EL0的軟件可以訪問數據cache維護指令(DC CVAC/DC CVAU/DC CIVAC)和指令cache維護指令(IC IVAU)
(2)SCTLR_EL1.UCT== 1
運行在EL0的軟件可以訪問cache type register.
(3)SCTLR_EL1.DZE== 1
運行在EL0的軟件可以訪問1數據cache zero指令(DC ZVA)
3.5 應用程序員關於cache的一些隱含問題
- 數據一致性問題
可以通過如下方法解決數據一致性問題:
(1)不使用cache。使用non-cached memory,直寫memory; 不要使能系統中的cache;
(2)使用cache維護指令來管理軟件中的一致性問題;
(3)通過使用硬件一致性機制來保證不同共享域的觀察者所見的內存訪問是一致的;
- 數據與指令訪問的同步和一致性問題
下面以修改一條指令為例說明如何保證數據一致性:
(1)STR Wt, [Xn]
將新的修改的指令存入Xn指向的內存(實際存入了data cache);
(2)DC CVAU, Xn
將data cache中數據真正刷入內存;
(3)DSB ISH
等前面的DC指令執行完成后再執行后面的指令;
(4)IC IVAU, Xn
無效指令cache到PoU的數據;
(5)DSB ISH
等前面的IC指令執行完成;
(6)ISB
3.6 Preload caches
將指令或數據提前放入cache來加快內存訪問速度
3.7 對齊支持
3.7.1 Instruction alignment
A64指令必須是word(32bits)對齊,試圖從一個PC未對齊的位置取指會引發PC對齊錯誤
3.7.2 Data alignment
- 對device memory的訪問
必須對齊,否則會引發unalignment fault;
- 對normal memory的訪問
(1) Load-Exclusive/Store-Exclusive and Load-Acquire/Store-Release
任何訪問地址沒有對齊到訪問元素將會產生對齊錯誤
(2) 其它情況
a). SCTLR_ELx.A==1,使能對齊檢查,任何訪問地址沒有對齊到元素將會產生對齊錯誤;
b). SCTLR_ELx.A==0,不使能對齊檢查,支持對非對齊的訪問
注:SCTLR_EL1.A只能在EL1訪問,設置的EL0和EL1的對齊檢查
- 對齊檢查失敗將會導致對齊錯誤,會捕獲data abort異常
(1) 如果從Non-secure EL0或EL1訪問,如果齊檢查失敗發生在地址轉換的第一階段,異常將傳遞給EL1;
(2) 如果從Non-secure EL0或EL1訪問,如果對齊檢查失敗發生在地址轉換的第二階段,異常將傳遞給EL2;
(3) 對於除(1)(2)的其它情況,如果對齊檢查失敗,異常將傳遞給能處理此異常的最低異常級別,但要遵循異常發生時異常等級不能降低的原則:
EL0或EL1下的對齊異常會傳給EL1;
EL2下的對齊異常會傳給EL2;
EL3下的對齊異常會傳給EL3;
3.7.3 Unaligned data access restrictions
(1)除字節外,單次拷貝不能保證是原子的;
(2)相比於對齊訪問,非對齊訪問會花費額外的時鍾;
(3)非對齊訪問會跨越頁邊界,執行兩次訪問,會比單次訪問更容易引發data abort異常
3.8 端支持
- 端的通常描述
大端存儲:高位存在低地址,低位存在高地址;
小端存儲:高位存在高地址,低位存在低地址;
- 指令大小端描述
A64指令固定為32bit,且為小端存儲
- 數據大小端描述
在EL1或更高的異常級別通過配置SCTLR_EL1.E0E來決定EL0下數據為大端還是小端
3.9 Atomicity
見 ARMV8 datasheet學習筆記3:AArch64應用級體系結構之Atomicity 一文
3.10 指令修改與執行的並行化
當PE正在修改指令時,要保證沒有其它PE在執行此指令;
單處理器:PE修改了內存(cached)中的指令,需要清data cache,無效指令cache;
多處理器:通過廣播告知所有PE無效指令cache,每個PE需通過ISB等待修改操作完成
3.11 memory order
見 ARMV8 datasheet學習筆記3:AArch64應用級體系結構之Memory order 一文
3.12 Memory Type and Attributes
見 ARMV8 datasheet學習筆記3:AArch64應用級體系結構之Memory Type and Attributes 一文
3.13 Synchronization and semapores
見 ARMV8 datasheet學習筆記3:AArch64應用級體系結構之Synchronization and semapores 一文
4. 參考文檔
[1] DDI0487A_k_armv8_arm_iss10775.pdf
[2] ARMv8之Atomicity