一文講解ARMv8內存屬性與類型(Memory types and attributes)簡介
ARMv8中將內存分為兩種類型:Normal memory和Device memory,Normal memory適用于系統中的大部分內存,而Device memory則適用于外設所使用的內存。
1. Normal Memory
Normal memory類型屬性適用于系統中的大多數內存。它表示架構允許硬件對這些位置執(zhí)行推測數據讀取訪問(Speculative data read accesses),而不管這些位置的訪問權限如何。為了確保訪問Normal memory是的順序性,有必要使用內存屏障指令:DMB 。
1.1 Shareable Normal Memory
一個Normal?內存地址可以具有以下一種 Shareability 屬性:
Inner Shareable, ?適用于Inner Inner Shareable shareability 區(qū)域。
Outer Shareable, 適用于Inner Shareable and the Outer Shareable shareability 區(qū)域。
Non-shareable.
1.1.1 Inner Shareable, and Outer Shareable屬性
ARM 架構將系統抽象成一系列 Inner和Outer 可共享屬性區(qū)域。
每個Inner共享域包含一組觀察者(observers),這些觀察者對于該組中的每個成員都是數據一致的,用于使用該組中的任何成員所創(chuàng)建的內部共享屬性(Inner Shareable attribute)進行數據訪問。
每個Outer共享域包含一組觀察者,這些觀察者對于該組的每個成員都是數據一致的,用于使用該組的任何成員所創(chuàng)建的外部共享屬性(Outer Shareable attribute)進行數據訪問。
同樣具有以下屬性:
每個觀察者只是一個內部共享域的成員。
每個觀察者只能是單個外部共享域的成員。
內部可共享域中的所有觀察者總是同一外部可共享域的成員。
這意味著內部共享性域是外部共享性域的一個子集,盡管它不需要是一個合適的子集。
因為對Non-cacheable位置的所有數據訪問,對所有觀察者來說都是數據一致的,所以Non-cacheable位置總是被視為外部共享的(Outer Shareable)。內部共享域預期是由單個hypervisor或操作系統控制的PE的集合。
如果一個系統中存在兩個處理器簇(cluster),則必須保證:
在每個簇中,處理器的data caches和unified caches對所有帶有Inner Shareable屬性的內存位置的數據訪問,均是透明的。
然而,在兩個簇之間,如果僅僅是Inner Shareable屬性,caches在數據訪問中不需被要求保持一致性。如果是Outer Shareable屬性,則要求保持數據一致性。
在這樣一個系統中,對于Inner Shareable 屬性,每個cluster處于不同的shareability 區(qū)域,但是對于Outer Shareable屬性,子系統中的所有組件均在同一個shareability區(qū)域。
一個系統可能實現兩個這樣的子系統,如果其中一個子系統的data cache和unified cache均對其他子系統中訪問不透明,那么這個系統就有兩個Outer shareable 區(qū)域。
對于可共享的普通內存(shareable Normal memory),Load-Exclusive和Store-Exclusive指令考慮了同一共享域中多個觀察者(多個core)訪問的可能性。

1.2 Non-shareable Normal memory
對于Normal 內存區(qū)域,不可共享的normal內存是一塊只能被單個CPU訪問的Normal內存。Non-shareable的Normal內存不要求硬件保證多個觀察者數據訪問的一致性,除非該內存是不可緩存的(Non-cacheable)。
對于Non-shareable內存,如果其他觀察者共享這個內存系統,軟件必須使用緩存維護相關指令,來保證在多個觀察者之間數據通信的緩存一致性問題。此外也需要額外的內存屏障操作來保證內存的處理順序。
此外,對于Non-shareable內存,是否支持Load-Exclusive和Store-Exclusive指令中考慮了多個觀察者訪問的可能性,這個由具體的實現定義IMPLEMENTATION DEFINED。
1.3 Cacheability attributes for Normal memory
除了Outer Shareable, Inner Shareable 和 Non-shareable屬性外,每個Normal 內存還被分配了一個緩存屬性:
Write-Through Cacheable.Write-Back Cacheable.
Non-cacheable.
緩存屬性為位于內存區(qū)域共享域之外的觀察者提供了一種一致性控制機制。在某些情況下,與使用硬件一致性機制或使用緩存維護的程序相比,使用Write-Through cache或non -cacheable區(qū)域可能提供更好的機制來控制一致性。為此,架構要求non -cacheable或Write-Through緩存內存具有以下屬性:
觀察者訪問某一級緩存內的內存系統時,對該級緩存的Write-Through cache或non -cacheable的內存位置的完整寫入,對于所有訪問該一級緩存外的內存系統的觀察者來說都是可見的,而不需要顯式的緩存維護。
由訪問某個level cache之外的內存系統的觀察者,所完成的對該級別cache的Non-cacheable
的內存位置的寫入,對于訪問該級cache內部的內存系統的所有觀察者來說都是可見的,而不需要顯式的緩存維護。
對于Non-cacheable的普通內存的訪問,DMB指令在對單個外設或IMPLEMENTATION DEFINED大小的內存塊的所有訪問上引入一個Barrier-ordered-before關系。
對于普通內存,Arm架構提供了緩存屬性,這些屬性是為緩存的兩個概念級別(內部緩存和外部緩存,the inner and the outer cache)獨立定義的。這些概念級緩存和實現的物理級緩存之間的關系是IMPLEMENTATION DEFINED的,并且可以區(qū)別于內部和外部共享域之間的邊界,但是:
Inner是指最內層的緩存,即最接近PE的緩存,并且總是包括最低級別的緩存。
由Inner緩存屬性控制的緩存不能位于由Outer緩存屬性控制的緩存之外。
在具體的實現中可能沒有outer 緩存。比如有L1,L2, L3的三級緩存架構中,三個緩存可能都是inner緩存,而不存在outer緩存。也可以是L1是inner緩存,L2和L3是outer緩存。
【文章福利】小編推薦自己的Linux內核技術交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ??


2.?Device Memory
Device內存類型屬性定義了內存位置,其中對該位置的訪問可能導致副作用,或者加載返回的值可能根據執(zhí)行的加載數量而變化。通常,Device內存屬性用于內存映射的外設(memory-mapped peripherals)和類似的位置。
device內存區(qū)域通常是給一些外設,比如USB uart之類的模塊用的,首先是non-cacheable的,也就是不能走cache,直接訪問內存,數據只存在內存中,其他地方沒有備份,這樣可以保證數據的唯一性,準確性。其次,外設的內存交互一般對時間(timing)的要求較高,所以也需要在有限的時間內完成讀寫操作。還有就是除了不走cache之外,訪問device 內存可能也沒有其他的內存訪問上的優(yōu)化,比如推測性訪問。總而言之,就是給外設用的內存屬性,外設的內存交互需要滿足:及時,高效,準確:
不允許對具有任何Device memory屬性的任何內存位置進行推測性數據訪問(Speculative data accesses)。這意味著對任何Device內存類型的每個內存訪問都必須是由程序的簡單順序執(zhí)行生成的。
對任何Device memory類型的內存位置的寫入在有限時間內完成。
如果從Device memory類型的內存位置讀取的返回值發(fā)生了變化,而觀察者沒有顯式的內存寫入影響,則該變化也必須在有限時間內對系統中的所有觀察者進行全局觀察。這樣的更改可能發(fā)生在保存狀態(tài)信息的外設(peripheral location that holds status?information)。
對于系統中的所有觀察者來說,對Device memory位置的數據訪問都是一致的,并相應地被視為可外部共享的(Outer Shareable)。
具有任何Device memory屬性的內存位置都不能分配到緩存中。
對于任何Device memory類型的訪問,使用DMB指令,在對單個外設或指定大小的內存塊的所有訪問上引入一個Barrier-ordered-before關系。
如果內存位置不能支持未對齊的內存訪問(unaligned memory accesses),那么對該內存位置的未對齊訪問將在轉換的第一階段生成對齊錯誤(Alignment fault),該轉換將該位置定義為Device。
硬件不會阻止從具有任何Device memory屬性的內存位置進行推測性的指令獲取,除非該內存位置也被標記為所有異常級別的execute-never。
原文作者:Arm精選
