01-简述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呢?
- 2.1、 不同的Master硬件共享數據時
- 2.1.1、軟件中維護內存一致性 – flush cache
- 2.1.2、軟件中維護內存一致性 – invalid cache
- 2.2、 不同的緩存策略的系統共享數據時
- 2.2.1、軟件中維護內存一致性 – flush cache
- 2.2.2、軟件中維護內存一致性 – invalid cache
- 3、怎么去刷cache呢? (軟件維護cache的一致性)
- 3.1、cache一致性指令介紹
- 3.2、cache一致性指令的使用示例
- 3.3、 操作系統中軟件維護cache一致性的API
1、為什么要用cache?
ARM 架構剛開始開發時,處理器的時鐘速度和內存的訪問速度大致相似。今天的處理器內核要復雜得多,并且時鐘頻率可以快幾個數量級。然而,外部總線和存儲設備的頻率并沒有達到同樣的程度。可以實現可以與內核以相同速度運行的小片上 SRAM塊,但與標準 DRAM 塊相比,這種 RAM 非常昂貴,標準 DRAM 塊的容量可能高出數千倍。在許多基于 ARM 處理器的系統中,訪問外部存儲器需要數十甚至數百個內核周期。
高速緩存是位于核心和主內存之間的小而快速的內存塊。它在主內存中保存項目的副本。對高速緩沖存儲器的訪問比對主存儲器的訪問快得多。每當內核讀取或寫入特定地址時,它首先會在緩存中查找。如果它在高速緩存中找到地址,它就使用高速緩存中的數據,而不是執行對主存儲器的訪問。通過減少緩慢的外部存儲器訪問時間的影響,這顯著提高了系統的潛在性能。通過避免驅動外部信號的需要,它還降低了系統的功耗
2、為什么要學習cache呢?
cache和我們軟件工程師有啥關系?其實在很多時候,硬件都會自動去維護cache和內存直接的一致性,這和我們軟件工程師都沒有太大的關系,所以很多時候我們也無需去理解cache的原理。但是實就是事實,不管你有沒有理解,你都是一直在使用的。做為一名底層的軟件開發者,有些時候,你也不得不去主動刷新cache,即軟件中維護內存一致性 。
那么一般什么時候需要主動刷cache呢(軟件中維護內存一致性) ? 以下便舉了幾個最常見的示例。
2.1、 不同的Master硬件共享數據時
例如一個core和一個crypto engine硬件,在共享數據的時候。需要軟件主動去invalid或flush cache的操作。
2.1.1、軟件中維護內存一致性 – flush cache
2.1.2、軟件中維護內存一致性 – invalid cache
2.2、 不同的緩存策略的系統共享數據時
例如在一個TEE + linux的系統中,且兩個系統有著不同的緩存策略。如linux kernel中是outer cacheable,TEE中是non-cacheable
2.2.1、軟件中維護內存一致性 – flush cache
2.2.2、軟件中維護內存一致性 – invalid cache
3、怎么去刷cache呢? (軟件維護cache的一致性)
ARM提供了操作cache的指令, 軟件維護操作cache的指令有三類:
- Invalidation:其實就是修改valid bit,讓cache無效。
- Cleaning: 清除cache中的data和TAG,這其實就是我們所說的flush cache,這里會將cache數據回寫到內存,并清除dirty標志
- Zero:將cache中的數據清0.
那么一般什么時候需要軟件維護cache一致性呢?:
(1)、當有其它的Master改變的external memory,如DMA操作
(2)、MMU的enable或disable的整個區間的內存訪問,
(3)、當不同緩存策略的系統使用同一塊內存通信時,如REE enable了mmu,TEE disable了mmu.
針對第(2)點,cache怎么和mmu扯上關系了呢?那是因為: mmu的開啟和關閉,影響了內存的permissions, cache policies
3.1、cache一致性指令介紹
查閱armv8/armv9的aarch64體系中,定義了如下的緩存一致性操作指令
指令太多,不太好記,然后我們總結如下:
按照指令,分為:
- IC : 操作instruction cache
- DC : 操作data cache
按照操作,分為以下三類:
- Invalidation:其實就是修改valid bit,讓cache無效。
- Cleaning: 清除cache中的data和TAG,這其實就是我們所說的flush cache,這里會將cache數據回寫到內存,并清除dirty標志
- Zero:將cache中的數據清0.
Points的定義:
其描述的是操作cache的范圍
- Point of Coherency (PoC) : instruction、data、TLB訪問一致性的點
- Point of Unification (PoU) :agents訪問內存一致性的點
- Point of Persistence (PoP) : 和FEAT_DPB、FEAT_DPB2 feature相關
- Point of Deep Persistence (PoDP) :訪問memory一致性的點
3.2、cache一致性指令的使用示例
3.3、 操作系統中軟件維護cache一致性的API
在操作系統中,我們只需要調用相關的API即可,也無需牢記以上的維護cache一致性的命令。
比如在Linux Kernel 操作Cache的API如下所示:
linux/arch/arm64/mm/cache.S linux/arch/arm64/include/asm/cacheflush.hvoid __flush_icache_range(unsigned long start, unsigned long end); int invalidate_icache_range(unsigned long start, unsigned long end); void __flush_dcache_area(void *addr, size_t len); void __inval_dcache_area(void *addr, size_t len); void __clean_dcache_area_poc(void *addr, size_t len); void __clean_dcache_area_pop(void *addr, size_t len); void __clean_dcache_area_pou(void *addr, size_t len); long __flush_cache_user_range(unsigned long start, unsigned long end); void sync_icache_aliases(void *kaddr, unsigned long len); void flush_icache_range(unsigned long start, unsigned long end) void __flush_icache_all(void)總結
以上是生活随笔為你收集整理的01-简述cache的基本概念和使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SMMU学习这一篇就够了
- 下一篇: 02-cache的基本概念原理扫盲