1.概述
SMMU(System Memory Management Unit,系統內存管理單元)是ARM架構中用于管理設備訪問系統內存的硬件模塊。SMMU和MMU的功能類似,都是將虛擬地址轉換成物理地址,不同的是MMU轉換的虛擬地址來自CPU,SMMU轉換的虛擬地址來自Device(比如DMA、PCIe等)。SMMU有以下特點:
- 起到地址隔離作用。DMA只能訪問頁表中的地址,非法地址將會被攔截。
- 支持設備使用連續虛擬地址訪問離散物理地址,消除了傳統DMA直接訪問物理內存要求地址連續的限制,以及32位DMA訪問4GB地址空間的限制。
- 支持設備共享CPU虛擬地址(IOVA=VA)空間。
- 在虛擬化環境中,SMMU可以為虛擬機中的設備提供地址轉換和隔離,確保虛擬機之間的內存安全。
如下所示,在支持虛擬化的環境中,SMMU支持2階段地址轉換,第一階段把IOVA轉換成IPA,第二階段把IPA轉換成PA,兩階段都可以設置成Bypass,即不做地址轉換。若不支持虛擬化,則SMMU只做第一階段地址轉換,即把IOVA直接轉換成PA。
2.內部結構
- 兩個SMMU的功能相互獨立。下圖中一個SMMU負責轉換普通設備的DMA請求地址,另一個SMMU負責轉換PCIe設備的DMA請求地址。
- SMMU位于設備請求端和設備互聯組件之間,多個SMMU通常都是并行放置,一個SMMU到內存的路徑不經過另外一個SMMU。
- 由于SMMU負責地址轉換和權限檢查等,因此設置SMMU的軟件必須運行再特權級別下,如EL1、EL2。
- SMMU與I/O設備緩存一致性:
- SMMU與總線的接口支持I/O一致性協議(如ACE或CHI),確保設備訪問內存時自動處理緩存一致性。
- 設備發起的請求(如DMA寫)不需要額外的一致性支持,SMMU會自動處理。
- SMMU不轉換系統到設備方向的請求地址,因此窺探流量不能從系統轉發到SMMU后面的設備,因此不能將完全一致性設備緩存放置在SMMU后面(這類設備緩存必須直接連接一致性總線)。
3.布局形式
- SMMU A嵌入到一個復雜設備中,屬于設備的一部分,只為該設備提供地址轉換和權限檢查服務。通常情況下,這種SMMU的實現形式,有無競爭且專用的地址轉換模塊和TLB。
- SMMU B是一個的完整的模塊,其集成了地址轉換、編程接口及頁表遍歷功能。兩個客戶端設備將SMMU B作為DMA訪問系統的路徑。
- SMMU C 采用分布式設計,為多個不同的設備提供地址轉換及訪問權限檢查等功能,從而實現更高帶寬。其包括:
- 一個中央頁表遍歷器( central translation table walker),該模塊擁有獨立的請求端接口,用于獲取頁表結構、配置結構及隊列;同時配備完成端接口,用于接收編程訪問。此單元可能包含一個macro-TLB及配置緩存。
- 遠端TLB單元在發生miss時,會向中央頁表遍歷器發起轉換請求,并將結果緩存于本地。圖中所示的兩個TLB單元,第一個通過一個端口支持一組(三個)設備;第二個連接PCIe Root Complex,同時還向RC提供了ATS(用于處理EP發起地址轉換的請求)接口。
- 智能設備中嵌入了一個TLB單元,但復用SMMU C的頁表遍歷器,這樣可以減少設備的復雜度。
4.地址轉換流程
設備發起一次DMA請求,會把StreamID、SubstreamID和VA信息輸入到SMMU,SMMU利用這些信息將IOVA轉換成PA。
- 首先使用StreamID查找Stream Table,獲取設備對應的Stream Table Entry (STE),STE里面保存了設備頁表的配置信息、VMID及下一級Context Descriptor (CD)的基地址。
- 接著使用SubstreamID查找CD表。CD里面保存了SMMU頁表的基地址、ASID等信息。
- 若頁表TLB命中,則直接使用緩存的頁表轉換地址,否則從內存中查找頁表,并填充TLB。
- 利用SMMU的頁表,將IOVA轉換成PA。
- 若是虛擬化環境,此時轉換后的地址是IPA,需要利用StreamID進行第二級地址轉換,最終得到PA。
參考資料
- Arm ? System Memory Management Unit Architecture Specification version 3.