02-cache的基本概念原理扫盲
引流關鍵詞:緩存,高速緩存,cache, CCI,CMN,CCI-550,CCI-500,DSU,SCU,L1,L2,L3,system cache, Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內存管理、頁表…
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
目錄
- 1、cache是多級相連的
- 2、cache一般是和MMU結合在一起使用的
- 3、硬件架構基礎介紹
- 3.1 `big.LITTLE`架構的cache
- 3.2 `DynamIQ`架構架構的cache
- 3.3 緩存一致性總線-CCI
- 3.4 緩存一致性總線-CMN
- 3.5 `big.LITTLE`架構中的cluster interface
- 3.6 `dynamIQ`架構中的DSU interface
- 3.7 架構圖示例
- 4、L1/L2/L3 cache的大小
- 5、cache的組織形式(index, way, set)
- 6、cache的種類(VIVT,PIPT,VIPT)
- 7、cache的分配策略(alocation,write-through, write-back)
- 8、架構中定義的cache的范圍(inner, outer)
- 9、架構中內存的類型
1、cache是多級相連的
cache是多級的,在一個系統中你可能會看到L1、L2、L3, 當然越靠近core就越小,也是越昂貴。
一般來說,對于big.LITTLE架構中,在L1是core中,L1又分為L1 data cache和 L1 Instruction cache, L2 cache在cluster中,L3則在BUS總線上。
2、cache一般是和MMU結合在一起使用的
很多時候cache都是和MMU一起使用的(即同時開啟或同時關閉),因為MMU頁表的entry的屬性中控制著內存權限和cache緩存策略等
在ARM架構中,L1 cache都是VIPT的,也就是當有一個虛擬地址送進來,MMU在開始進行地址翻譯的時候,Virtual Index就可以去L1 cache中查詢了,MMU查詢和L1 cache的index查詢是同時進行的。如果L1 Miss了,則再去查詢L2,L2還找不到則再去查詢L3。 注意在arm架構中,僅僅L1 cache是VIPT,L1L2和L3都是PIPT。
3、硬件架構基礎介紹
big.LITTLE架構 和 DynamIQ架構 的cache是有區別的
- 在big.LITTLE 架構中,大核小核在不同的cluster中,做為兩個不同的ACE或CHI Master,連接到緩存一致性總線上(CCI或CMN)。大核cluster和小核cluster的緩存一致性,也需要通過一致性總線來解決。
- 到了DynamIQ 架構中,大核和小核都是一個DSU cluster中,一個DSU cluster最多可以支持8個core。如果你的系統是8個core,那么一個DSU就夠了,那么系統中也就只有一個ACE或CHI Master,大核和小核之間的一致性,都在DSU cluster內完成了。
3.1 big.LITTLE架構的cache
在big.LITTLE的架構中,L1是在core中的,是core私有的;L2是在cluster中的,對cluster中的core是共享的;L3則對所有cluster共享。big.LITTLE的架構的一個cache層級關系圖如下所示:
3.2 DynamIQ架構架構的cache
在dynamIQ的架構中,L1和L2都在core中的,都是core私有的;L3則是在cluster中的,對cluster中的core是共享的;如有L3或system cache,則是所有cluster共享。dynamIQ的架構的一個cache層級關系圖如下所示。
注意,一般來說一個DSU Cluster就可以做到支持8個core,以下只是舉一個極端的例子,在硬件設計時,我非要放置兩個DSU cluster 可不可以?兩個DSU Cluster做為兩個ACE Master連接到了CCI一致性總線上。
3.3 緩存一致性總線-CCI
用于ACE Master緩存一致性總線有CCI-550、CCI-500、CCI-400。
它的主要作用是可以互聯多個ACE Master、ACE-lite Master,然后通過ACE接口協議,做到多個Master之間的緩存一致性。CCI最多支持2個ACE Master,共計支持8個ACE Master+ACE-lite Master。
所以呢,如果是big.LITTLE架構的,那么最多支持兩個cluster互聯,每個cluster 8個core,所以最多支持8個core;如果是dynamIQ架構的,那么最多支持兩個DSU cluster互聯,每個cluster 8個core,所以最多支持16個core
3.4 緩存一致性總線-CMN
用于CHI Master緩存一致性總線有CMN-700、CMN-600.
它的主要作用是可以互聯多個CHI Master、ACE-lite Master,然后通過CHI接口協議,做到多個Master之間的緩存一致性。CCI-600最多支持8個CHI Master,共計支持8個CHI Master+ACE-lite Master。
3.5 big.LITTLE架構中的cluster interface
在big.LITTLE架構中,cluster連接到一致性總線的接口,可以是ACE,也可以是CHI,所以big.LITTLE cluster既可以做為ACE Master連接到總線,也可以做為CHI Master連接到總線。
3.6 dynamIQ架構中的DSU interface
2017年引入dynamIQ架構, 在DSU(dynamIQ Share Unit)規范中,連接到一致性總線的接口,可以是ACE,也可以是CHI,所以DSU cluster既可以做為ACE Master連接到總線,也可以做為CHI Master連接到總線。
而在DSU-110中, 連接到一致性總線的接口可以是CHI ,但不再有ACE了。如果你使用的是DSU-110,DSU Cluster做為CHI Master了,那么你一定是采用CMN的總線互聯方式。
3.7 架構圖示例
所以呢,你看到的系統架構圖(也是近幾年最常用的),可能是下面這個樣子的,所有的core都在一個DSU cluster中,所有core共享L3 cache,DSU接到CCI或CMN緩存互聯一致性總線上,可以和其它ACE-Lite Master(如 GPU)共享緩存數據
當然了,舉個稍微極端的例子,如下連接架構圖也不是不可能,系統中有兩個DSU cluster,DSU接到CCI或CMN緩存互聯一致性總線上。
事實上big.LITTLE架構的cluster,也是可以做為CHI Master。下面這種超極端的例子,技術理論上也是可行的(當然可能不會有人用)。
4、L1/L2/L3 cache的大小
可以參考ARM文檔,
- 對于big.LITTLE架構的core,其cache大小基本是固定的。
- 對于dynamIQ架構的core,其L1和L2 cache大小基本是固定的。但對于L2 cache 則是可選擇可配置的
另外查閱DSU TRM文檔,可以看到L3 Cache可以配置 0 - 16MB的大小。
5、cache的組織形式(index, way, set)
cache的組織形式有:
- 全相連
- 直接相連
- 多路組相連(如4路組相連)
在一個core中一個架構中一個SOC中,所有cache的組織形式并不是都一樣的。即使L1 D-cache和L1 I-cache的組織形式,也都可能不是一樣的的。 具體的組織形式是怎樣的,需要查詢你的core trm手冊。
例如我們查詢到Cortex-A53的cache信息如下:
L1 I-Cache
- 可配:8KB, 16KB, 32KB, or 64KB
- cacheline:64bytes
- 2路組相連
- 128-bit的讀L2 memory的接口
L1 D-Cache
- 可配:8KB, 16KB, 32KB, or 64KB
- cacheline:64bytes
- 4路組相連
- 256-bit的寫L2 memory的接口
- 128-bit的讀L2 memory的接口
- 64-bit的讀L1到datapath
- 128-bit的寫datapath到L1
L2 cache
- 可配置的: 128KB, 256KB, 512KB, 1MB and 2MB.
- cacheline:64bytes
- Physically indexed and tagged cache(PIPT)
- 16路組相連的結構
因為有了多路組相連這個cache,所以也就有了一些術語概念:
- index : 用白話理解,其實就是在一塊cache中,一行一行的編號(事實是沒有編號/地址的)
- Set :用index查詢到的cache line可能是多個,這些index值一樣的cacheline稱之為一個set
- way:用白話來說,將cache分成了多個塊(多路),每一塊是一個way
- cache TAG :查詢到了一行cache后,cachelne由 TAG + DATA組成
- cache Data :查詢到了一行cache后,cachelne由 TAG + DATA組成
- cache Line 和 entry 是一個概念
6、cache的種類(VIVT,PIPT,VIPT)
cache一般是有如下種類;
- PIPT
- VIVT
- VIPT
在一個core中一個架構中一個SOC中,你所使用的cache是哪種類型的,都是固定的,是軟件改不了的。 在ARM架構中,一般L1 cache都是VIPT的,其余的都是PIPT的。
VIPT和PIPT的原理,基本也都是一樣的,只是硬件查詢時稍微有一丁點的區別,在后續講cache查詢時會再次介紹。
那么,你還學什么VIVT?你為什么還要去理解VIVT的原理?你為什么還要去分析cache同名、重名的問題? 這樣的問題,在armv7/armv8/armv9架構中都是不存在的
7、cache的分配策略(alocation,write-through, write-back)
-
讀分配(read allocation)
當CPU讀數據時,發生cache缺失,這種情況下都會分配一個cache line緩存從主存讀取的數據。默認情況下,cache都支持讀分配。 -
寫分配(write allocation)
當CPU寫數據發生cache缺失時,才會考慮寫分配策略。當我們不支持寫分配的情況下,寫指令只會更新主存數據,然后就結束了。當支持寫分配的時候,我們首先從主存中加載數據到cache line中(相當于先做個讀分配動作),然后會更新cache line中的數據。 -
寫直通(write through)
當CPU執行store指令并在cache命中時,我們更新cache中的數據并且更新主存中的數據。cache和主存的數據始終保持一致。 -
寫回(write back)
當CPU執行store指令并在cache命中時,我們只更新cache中的數據。并且每個cache line中會有一個bit位記錄數據是否被修改過,稱之為dirty bit(翻翻前面的圖片,cache line旁邊有一個D就是dirty bit)。我們會將dirty bit置位。主存中的數據只會在cache line被替換或者顯示的clean操作時更新。因此,主存中的數據可能是未修改的數據,而修改的數據躺在cache中。cache和主存的數據可能不一致
8、架構中定義的cache的范圍(inner, outer)
對于cacheable屬性,inner和outer描述的是cache的定義或分類。比如把L1/L2看做是inner cache,把L3看做是outer cache。
通常,內部集成的cache屬于inner cache,外部總線AMBA上的cache屬于outer cache。例如:
- 對于big.LITTLE架構(A53為例)中,L1/L2屬于inner cache,如果SOC上掛了L3的話,則其屬于outer cache
- 對于DynamIQ架構(A76為例)中,L1/L2/L3屬于inner cache,如果SOC上掛了System cache(或其它名稱)的話,則其屬于outer cache
然后我們可以對每類cache進行單獨是屬性配置,例如:
- 配置 inner Non-cacheable 、配置 inner Write-Through Cacheable 、配置 inner Write-back Cacheable
- 配置 outer Non-cacheable 、配置 outer Write-Through Cacheable 、配置 outer Write-back Cacheable
對于shareable屬性,inner和outer描述的是cache的范圍。比如inner是指L1/L2范圍內的cache,outer是指L1/L2/L3范圍內的cache
9、架構中內存的類型
在arm架構中,將物理內存分成了device和normal兩種類型
而是每種的內存下(device和normal)又分出了多種屬性。ARM提供一個MAIR寄存器, 將一個64位的寄存器分成8個attr屬性域,每個attr屬性域有8個比特,可配置成不同的內存屬性。
也就是說,在一個arm core,最多支持8中物理內存類型。
而我們在MMU使用的頁表的entry中的屬性位中,BIT[4:2]占3個比特,表示index,其實就是指向MAIR寄存器中的attr。
(Attribute fields in stage 1 VMSAv8-64 Block and Page descriptors)
- PBHA, bits[62:59] :for FEAT_HPDS2
- XN or UXN, bit[54] : Execute-never or Unprivileged execute-never
- PXN, bit[53] :Privileged execute-never
- Contiguous, bit[52] : translation table entry 是連續的,可以存在一個TLB Entry中
- DBM, bit[51] :Dirty Bit Modifier
- GP, bit[50] :for FEAT_BTI
- nT, bit[16] :for FEAT_BBM
- nG, bit[11] :緩存在TLB中的翻譯是否使用ASID標識
- AF, bit[10] : Access flag, AF=0后,第一次訪問該頁面時,會將該標志置為1. 即暗示第一次訪問
- SH, bits[9:8] :shareable屬性
- AP[2:1], bits[7:6] :Data Access Permissions bits,
- NS, bit[5] :Non-secure bit
- AttrIndx[2:0], bits[4:2]
也就是說,頁表的每一個entry中,都指向MAIR寄存器中的一個屬性域。也就是頁表的每一個entry都配置了一種內存類型。 如下所示,便很好的展示了,MMU頁表的每一個page descriptor(也叫entry)都指向一個內存屬性類型。
總結
以上是生活随笔為你收集整理的02-cache的基本概念原理扫盲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01-简述cache的基本概念和使用场景
- 下一篇: 04-多核多cluster多系统之间缓存