為了適應(yīng)大規(guī)模的SoC設(shè)計,GIC-600被設(shè)計成分布式IP。所謂分布式,GIC-600由幾種組件構(gòu)成,每個組件可以跟其它相關(guān)模塊在物理設(shè)計上擺放在一起,并與其擁有共同的電源域;組件之間通過片上網(wǎng)絡(luò)(network on chip,簡稱NoC)通信,從而達(dá)到更好的時序。
SMMU即system memory management unit,在其他體系結(jié)構(gòu)中對應(yīng)的是IOMMU。先上圖,此圖節(jié)選自SMMU spec文檔,從圖中可以直觀看到SMMU的基本功能,其被放置在device的DMA master的前端,device與其采用AXI相連,SMMU直接連接片上總線。
MMU與SMMU位置相似,只不過MMU后邊的master是CPU。SMMU在此主要作用是將device發(fā)起的DMA請求中的IOVA虛擬地址轉(zhuǎn)換為系統(tǒng)物理地址進(jìn)行訪存。而MMU是將CPU看到的VA值轉(zhuǎn)換為系統(tǒng)物理地址,IOVA的值與CPU看到的VA可以相同也可以不同,如果說IOVA值的類型有一萬種選擇,那么使用SMMU的方法就有一萬種。
在ARM體系結(jié)構(gòu)中,SMMU可以承載很多東西,包括:安全,虛擬化,pcie相關(guān)功能,SVA等等。
現(xiàn)在捋一下SMMU的基本使用場景:
1)擴(kuò)大設(shè)備DMA尋址范圍,一些legacy設(shè)備DMA尋址是32bit,無法訪問高32bit地址,通過SMMU的轉(zhuǎn)換可以解決這個問題。同樣的,當(dāng)系統(tǒng)無法提供大塊連續(xù)物理內(nèi)存時,也可以通過SMMU轉(zhuǎn)換讓設(shè)備可以訪問分散物理內(nèi)存
2)一個SMMU可以有多個master設(shè)備,每個設(shè)備所看到的物理地址范圍可通過SMMU進(jìn)行隔離和劃定,硬件提供了這種應(yīng)用的靈活性,具體策略需要軟件來實現(xiàn)。
3)ARM體系結(jié)構(gòu)中的安全域分為secure和normal域,secure具有更高的權(quán)限,理論上normal域的設(shè)備DMA無法訪問劃分為secure的物理地址,但是這種訪問控制機(jī)制是如何實現(xiàn)的呢?就是通過SMMU,它可以使設(shè)備DMA master發(fā)出的請求帶有secure域或Normal域的安全屬性。
SMMU之所以能完成上述功能,是因為其內(nèi)部硬件結(jié)構(gòu)。
如上圖,SMMU大部分功能數(shù)據(jù)均存在于主存儲器中,在硬件上有基地址寄存器分別指向相應(yīng)的內(nèi)存區(qū)域,command queue提供了軟件配置SMMU的命令隊列,event queue用來存放SMMU工作產(chǎn)生的事件或錯誤。STE基址寄存器指向了內(nèi)存中的一系列STE表,該表是用smmu設(shè)備master的streamid來索引的,位寬16位,steamid是deviceIP在設(shè)計時硬件設(shè)定好的,一個streamid唯一對應(yīng)一個STE表,理論上一個設(shè)備可以有多個streamid,因此一個設(shè)備可能有多個STE表,在不同的場景下,軟件可以靈活應(yīng)用,硬件提供了這種靈活性。
每個STE表存在一個指針指向CD表,CD表可以有多個,是通過substreamid來索引的,substreamid位寬20位。CD表中有指針直接指向了SMMU進(jìn)行地址轉(zhuǎn)換用的頁表,這個頁表記錄了IOVA到PA的映射。CD表所指的頁表只提供了一級頁表轉(zhuǎn)換,STE表的其他域提供了二級頁表轉(zhuǎn)換,這個在后續(xù)章節(jié)遇到再詳細(xì)介紹。
以上是SMMU內(nèi)部結(jié)構(gòu)的靜態(tài)描述,那么它實際工作的過程是怎樣的?設(shè)備master發(fā)起一筆DMA請求,請求的總線信息中帶有streamid、subtreamid、iova等參數(shù),smmu硬件收到該請求會自動通過streamid檢索到STE表,再通過substreamid檢索到這個STE表指向的CD表,從CD表中找到頁表基地址,開始頁表查找過程,找到IOVA對應(yīng)的物理地址,再對這個物理地址發(fā)起一次DMA請求。
從這個過程可以看出SMMU在做地址轉(zhuǎn)換時有一定的overhead,因此SMMU硬件也提供了bypass模式,可以不進(jìn)行任何地址轉(zhuǎn)換,事實上目前linux kernel在默認(rèn)情況下的SMMU就是采用這種工作模式的。STE和CD表以及SMMU硬件工作過程中涉及到的參數(shù)較多,這里不一一說明,抓大放小,我們期望能夠以最簡捷的方式理解SMMU的工作機(jī)理。
為了提高頁表查找效率,SMMU與MMU相同,在其內(nèi)部設(shè)計有TLB緩存,用于緩存頁表項,同時硬件提供了DVM 接口,接收從互聯(lián)總線上的TLBI廣播,當(dāng)CPU對頁表進(jìn)行更改后,同時需要清除MMU本地的相應(yīng)的頁表項緩存,該TLBI指令會通過DVM接口進(jìn)行廣播,ARM架構(gòu)要求SMMU接收到廣播的前置條件是MMU與SMMU同處于一個Inner shareable domain中,在接受到廣播后,SMMU硬件會自動清除其內(nèi)部的TLB緩存對應(yīng)項,達(dá)到與MMU同步的作用。該機(jī)制是ARM系統(tǒng)結(jié)構(gòu)下SVA(shared virtual addressing)的基礎(chǔ),即SMMU與MMU共享頁表,設(shè)備可以看到和CPU相同的VA,設(shè)備也就能“理解”各種進(jìn)程虛擬內(nèi)存的語義。
下面分享一個SMMU的實際使用場景的有趣例子。
上圖中engine是一個硬件運(yùn)算模塊,硬件設(shè)定其與SMMU之間的streamid有2個,一個是read steam,另一個是write stream,因此SMMU對應(yīng)的STE表就有2個,即DMA讀操作對應(yīng)一份頁表,該頁表與MMU對應(yīng)頁表相同,通過DVM接口進(jìn)行硬件同步,DMA寫對應(yīng)另一份頁表,該頁表指向的物理地址為ARM的secure域內(nèi)存。Crypto engine通過對normal域的操作系統(tǒng)內(nèi)存數(shù)據(jù)進(jìn)行某種操作后輸出結(jié)果到secure域,這種機(jī)制既增強(qiáng)了安全性,又增加了系統(tǒng)的效率。步驟如下:
1)normal域軟件發(fā)起SMC指令傳遞虛擬內(nèi)存地址VA和頁表基地址等參數(shù)到secure域軟件
2)secure域軟件用上述參數(shù)配置engine硬件,啟動DMA
3)DMA通過SMMU read stream抓取normal域地址VA內(nèi)存數(shù)據(jù)進(jìn)行運(yùn)算
4)結(jié)果通過DMA write stream輸出到secure域內(nèi)存
5)Secure 域軟件返回此次操作狀態(tài)信息給normal域軟件
細(xì)心的讀者可能會發(fā)現(xiàn)上述過程存在一些問題,比如該虛擬地址對應(yīng)頁面不在內(nèi)存中,被換出了,這時SMMU在查找相應(yīng)頁面時就無法進(jìn)行DMA操作,遇到這樣的頁表整個地址轉(zhuǎn)換過程會停下,相應(yīng)的錯誤event會被SMMU硬件寫到event queue中,此時需要secure域軟件處理該event,向normal域軟件請求處理,與處理Page fault過程類似,完成后再重復(fù)上述步驟。
審核編輯:劉清
-
ARM
+關(guān)注
關(guān)注
134文章
9057瀏覽量
366877 -
SoC設(shè)計
+關(guān)注
關(guān)注
1文章
148瀏覽量
18764 -
dma
+關(guān)注
關(guān)注
3文章
559瀏覽量
100446 -
SVA
+關(guān)注
關(guān)注
1文章
19瀏覽量
10119
原文標(biāo)題:技術(shù)分享 | ARM系列 -- SMMU(一)
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論