SMMU学习这一篇就够了
引流關鍵詞: SMMU,mmu500,mmu600,mmu700,system mmu,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、SMMU總結
- 1.1、SMMU的timeline
- 1.2、SMMU的簡介
- 1.3、為什么要使用SMMU?
- 2. SMMU原理解讀
- 2.1. SMMU的使用模型
- 2.2. SMMU的硬件原理圖
- 2.3. StreamID
- 2.4 STE Table 和 STE format
- 2.4.1 一個 Linear Stream Table的示例
- 2.4.2 一個 2-level Stream Table 的示例
- 2.4.3 Multi-level Stream and CD tables
- 2.4.4 Translation stages and addresses
- 2.4.5 Configuration and translation lookup sequence
- 2.4 寄存器的介紹
- 2.5 Stream Table Entry
- 2.6 Context Descriptor table
- 3. 總結
前言
最近朋友圈、微信群(ARM-Trustzone-TEE-AT)掀起一陣學習SMMU的熱潮,作為一名安全領域的渣渣 ,勢必要蹭一蹭這個“熱點”,也學習一下吧,反正早晚都要學,因為它和安全的關系還是比較大的。學習是一件長期的過程,本文就先簡單理一下概念吧。
1、SMMU總結
1.1、SMMU的timeline
1.2、SMMU的簡介
SMMU的全稱是System Memory Management Units, 它屬于Arm的System IP, 主要給其他Master來使用,其連頁表格式和Core MMU是一樣的,理論上可以讓Core的MMU和SMMU使用同一套頁表.
那么SMMU都是用在哪些地方呢?*以下展示了一個usecase,來自arm官方博客(February 17, 2014),也是比較早期的一個Sample case
1.3、為什么要使用SMMU?
-
訪問非連續的地址
現在系統中很少再預留連續的memory,如果Master需要很多memory,可以通過SMMU把一些非連續的PA映射到連續的VA,例如給DMA,VPU,DPU使用。 -
32位轉換成64位
現在很多系統是64位的,但是有些Master還是32位的,只能訪問低4GB空間,如果訪問更大的地址空間需要軟硬件參與交換memory,實現起來比較復雜,也可以通過SMMU來解決,Master發出來的32位的地址,通過SMMU轉換成64位,就很容易訪問高地址空間。 -
限制Master的訪問空間
Master理論上可以訪問所有的地址空間,可以通過SMMU來對Master的訪問進行過濾,只讓Master訪問受限的區域,那這個區域也可以通過CPU對SMMU建立頁表時動態控制。 -
用戶態驅動
現在我們也看到很多系統把設備驅動做在用戶態,調用驅動時不需要在切換到內核態,但是存在一些安全隱患,就是用戶態直接控制驅動,有可能訪問到內核空間,這種情況下也可以用SMMU來實現限制設備的訪問空間 -
設備虛擬化
例如設備虛擬化有多種方式,Emulate,Para-virtualized,以及Pass-through,用SMMU可以實現Pass though,這樣無論是性能,還是軟件的改動都是比較小的。 -
一些不支持TrustZone的Master,可以利用SMMU支持Trustzone
2. SMMU原理解讀
2.1. SMMU的使用模型
SMMU全稱System Memory Management Unit,其實SMMU和MMU具有同樣的作用,區別是供給Master使用,同樣提供頁表轉換工作,Master可通過頁表轉換訪問物理地址,達到Master一樣使用虛擬地址
官方給出的示例圖如下所示:
示例圖2:
2.2. SMMU的硬件原理圖
學過MMU的人都知道,MMU是由 TLB + Address Translation, 那么對于SMMU呢?
它是由TBU + TCU組成,其中TBU中含有TLB, TCU緩存地址翻譯。
DTI則是SMMU內部的連接總線的協議。
而一個SMMU中可以放置多個ACE-Lite TBU模塊,也可以放置LTI TBU
TBU原理圖
LTI TBU的原理圖
TCU的原理圖
2.3. StreamID
2.4 STE Table 和 STE format
STE Table 分為Linear Stream Table和mutil-level Stream Table,這是由于STRTAB_BASE_CFG中的比特位配置
2.4.1 一個 Linear Stream Table的示例
這種查詢方式很簡單,根據streamID的數值,直接查詢到對應的STE(streamID entry)
2.4.2 一個 2-level Stream Table 的示例
2.4.3 Multi-level Stream and CD tables
而事實上,一個STE,又可以對應多個Context Descriptor
這里小小總結一下: 這里的一個Context Descriptor 就相當于 MMU系統中的 TTBRx + TCR寄存器。
這里Stage 1 Transslation tables的格式和MMU頁表的格式一致。
2.4.4 Translation stages and addresses
地址翻譯也是份stage1和stage2的,這和MMU也是一致的。
2.4.5 Configuration and translation lookup sequence
SMMU地址翻譯的原理或數據里如下圖所示,這是在學習MMU的時候未曾見過的那么細致的圖。
2.4 寄存器的介紹
SMMU寄存器都是memory-map的
SMMU里有兩套寄存器,一套是給安全master用的,一套是給非安全master用的。
其實就相當于有兩個SMMU了。如下我也列舉了幾個特別的寄存器,帶S的是給安全用的,不帶S的是給非安全用的。所以,硬件僅僅有一塊SMMU,但從軟件的視角來看,有兩塊SMMU
- SMMU_STRTAB_BASE
- SMMU_S_STRTAB_BASE
- SMMU_STRTAB_BASE_CFG
- SMMU_S_STRTAB_BASE_CFG
2.5 Stream Table Entry
2.6 Context Descriptor table
可以看出,這里的Context Descriptor 就有點類似于MMU里的 TTBRx + TCR寄存器的味道
3. 總結
- (1)MMU 只能給 一個core用。而SMMU想給多個master用,多個master又對應不同的表。所以就搞了個STE。每一個STE entry里,都可以指向多個context descriptor (我覺得一般也就只用一個吧),然后每一個context descriptor 就相當于 MMU的TTBRx + TCR寄存器。 context Descriptor之后,就和普通的MMU一樣
- (2)SMMU里有兩套寄存器,一套是給安全master用的,一套是給非安全master用的。從軟件視角來看,其實就相當于有兩個SMMU了。但這不是banked,他們的寄存器名字不一樣,一類帶了S,一類不帶S。而且寄存器memory-map的地址還不一樣。
- (3)SMMU又有Secure STE 和 Non-secure STE的概念, Secure STE 后面的頁表/地址轉換,可以轉secure memory,也可以轉non-secure memory。Non-Secure STE 后面的頁表/地址轉換,只可以轉non-secure memory。 這和MMU里的Descriptor里的NS比特也是一樣的。
總結
以上是生活随笔為你收集整理的SMMU学习这一篇就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARMV8/ARMV9的执行状态的切换
- 下一篇: 01-简述cache的基本概念和使用场景