1.前言
本文主要介紹原子變量的實現原理,對原子變量的修改有一套特殊的機制
2. Local monitor和Global monitor
- UP時執行Load EX和Store EX時僅需關注Local Monitor的狀態即可
圖 UP時Local Monitor和Global Monitor
- SMP時執行Load EX和Store EX時需關注Local Monitor和Global Monitor的狀態
圖 SMP時Local Monitor和Global Monitor
3. Exclusive access instructions and Non-shareable memory locations
Non-hareable內存指的是具有內部共享屬性的的一塊存儲區域。它僅會在本PE內部進行共享
圖 Local Monitor狀態機圖
- Load-Exclusive
Load-Exclusive指令執行時local monitor標記PE執行load EX的地址為獨占,local monitor由Open Access狀態轉換為Exclusive Access狀態;
- Store-Exclusive
依賴local monitor的狀態:
(1)如果local monitor 為Exclusive Access狀態
如果store的地址為先前load EX訪問時的地址,則store EX會發生,並清空獨占地址標記,否則由各個廠商自己定義,狀態值會返回給寄存器,如果store EX發生則狀態值為0,否則狀態值為1;
(2)如果local monitor為Open Access狀態:
不會有store EX發生;狀態值1返回給寄存器,表示store EX沒有發生;狀態local monitor保持open access狀態
4. Exclusive access instructions and shareable memory locations
Shareable內存指的是具有內部共享或外部共享屬性的的一塊存儲區域。它會在所有的PE之間進行共享。
圖 SMP Global monitor狀態機
- Load-Exclusive
1. 對於shareable內存,local monitor會將本PE的load EX訪問地址標記,忽略其他PE的訪問請求, store Ex交由global monitor檢查;
2. PE執行load EX時,global monitor會為這個PE標記訪問的物理地址為獨占訪問,這標記主要用於本PE store EX操作,這個獨占訪問標記會被其它PE的load EX清除。
- Store-Exclusive
store EX操作時會檢查global monitor狀態是否對本PE設置獨占標記,如果是則store EX會執行,如果成功會清除global monitor為本PE設置的獨占標記, 並返回狀態0,失敗返回1。
也就是本PE store EX操作只有在gloabal monitor為本PE設置獨占標記的時候才能執行, 任一時刻global monitor至少為一個PE標記地址
5. Marking and the size of the marked memory block(?)
當執行Load Ex指令時,通過忽略掉64bit內存地址的的LSB來標記一個塊,標記的塊大小為2a 個Bytes ,標記的塊大小范圍為4~512 words, 由SOC廠家自定義。
例如廠家定義為4個words,則a為4,LDXRB地址 0x341B4 會使用0x341B4的bits[47:4] 標記一個塊為獨占訪問,也就是從0x341B0 到0x341BF被標記為獨占訪問。
6. Context switch support
異常返回會清空local monitor
7. Load-Exclusive and Store-Exclusive 指令使用限制
- LoadExcl/StoreExcl pair只有運行在相同的虛擬地址才能成功;
- LoadExcl/StoreExcl pair操作的數據寬度必須相同;
- LoadExcl/StoreExcl pair必須訪問相同數量的寄存器;
- LoadExcl/StoreExcl pair滿足一定的條件才可以繼續運行;
- LoadExcl/StoreExcl pair相隔越近則性能越好,因為相隔近,就會減少mornitor標記被清除的可能性;
- 體系結構設置了LoadExcl/StoreExcl pair設置獨享訪問的地址上限為2048字節。性能考慮,則將獨享訪問范圍分割成設定的粒度,分多次進行訪問;
- 如果接收到data abort異常,則獨享標記是未知的;
- LoadExcl/StoreExcl pair內存訪問屬性必須一致,否則store行為未知;
- LoadExcl/StoreExcl pair之間發生了虛擬地址與物理地址映射的改變,則store EX不會通過monitor的獨占標記檢查;
8.spin-locks中使用WFE 和 SEV指令
ARMv8 提供了 如下指令:
- Wait For Event
- Send Event
- and Send Event Local instructions
- WFE
- SEV
- SEVL
如上指令減少了power consumption and bus contention caused by PEs repeatedly attempting to obtain a spin-lock.這些指令是應用級的
9.參考文檔
[2] DDI0487A_k_armv8_arm_iss10775.pdf