IOMMU

IOMMU主要功能包括DMA Remapping和Interrupt Remapping

在虛擬化環(huán)境下,guest VM使用的物理地址是GPA(參考這篇文章),如果直接用guest OS中的驅(qū)動程序去操作I/O設(shè)備的話(這里的I/O限定于和內(nèi)存統(tǒng)一編址的MMIO),那么設(shè)備使用的地址也是GPA。這倒不難辦,使用CPU的EPT/NPT MMU查詢對應(yīng)guest VM的nPT頁表,進(jìn)行一下GPA->HPA的轉(zhuǎn)換就可以了。

可是別忘了,有一些I/O設(shè)備是具備DMA(Direct Memory Access)功能的。由于DMA是直接在設(shè)備和物理內(nèi)存之間傳輸數(shù)據(jù),必須使用實(shí)際的物理地址(也就是HPA),但DMA本身是為了減輕CPU的處理負(fù)擔(dān)而存在的,其傳輸過程并不經(jīng)過CPU。對于一個支持DMA傳輸?shù)脑O(shè)備,當(dāng)它拿著GPA去發(fā)起DMA操作時,由于沒有真實(shí)的物理內(nèi)存地址,傳輸勢必會失敗。

那如何實(shí)現(xiàn)對進(jìn)行DMA傳輸?shù)脑O(shè)備的GPA->HPA轉(zhuǎn)換呢?再來一個類似于EPT/NPT的MMU?沒錯,這種專門轉(zhuǎn)換I/O地址的MMU在x86的陣營里就是IOMMU

然而,不和AMD使用相同的名字是Intel一貫的路數(shù),所以Intel通常更愿意把這種硬件輔助的I/O虛擬化技術(shù)叫做VT-d(Virtualization Technology for Direct I/O)。作為后起之秀的ARM自然也不甘示弱,推出了對應(yīng)的SMMU(System MMU)。

以Intel的VT-d為例,它規(guī)定了一個domain對應(yīng)一個IO頁表。在具體的實(shí)現(xiàn)中,通常是一個guest VM作為一個domain,因此分配給同一個guest VM的設(shè)備將共享同一個IO頁表。

IOMMU能將device使用的虛擬地址(也稱為設(shè)備地址或者IO地址)轉(zhuǎn)化為物理地址,如果沒有IOMMU,DMA也能直接訪問RAM中的內(nèi)容,但是讓DMA沒有限制地訪問RAM是一件很危險(xiǎn)的事情,而IOMMU能夠?qū)@個過程加以限制,當(dāng)DMA訪問的地址合法時,IOMMU才返回正確的數(shù)據(jù).

硬件中斷重映射
除了翻譯地址的功能,IOMMU還能對硬件中斷進(jìn)行重映射,達(dá)到屏蔽部分中斷,或自定義中斷處理函數(shù)的目的.

設(shè)備隔離
基于地址翻譯和硬件中斷重映射兩大功能,IOMMU就具有了隔離設(shè)備的能力,這提高了設(shè)備訪問RAM時和設(shè)備發(fā)出中斷時的安全性.

除了將單個設(shè)備隔離的功能外,IOMMU還能隔離一組設(shè)備,如隔離PCI橋上的幾個設(shè)備,所以IOMMU還有一個概念,叫做IOMMU_GROUP, 代表一組被隔離的設(shè)備的集合.

Iommu 的主要功能為設(shè)備dma時刻能夠訪問機(jī)器的物理內(nèi)存區(qū),同時保證安全性。

在沒有Iommu的時候,設(shè)備通過dma可以訪問到機(jī)器的全部的地址空間。

1、這種機(jī)制下如果將設(shè)備的驅(qū)動放在用戶態(tài),那么如何保護(hù)機(jī)器物理內(nèi)存區(qū)對于用戶態(tài)驅(qū)動框架設(shè)計(jì)帶來挑戰(zhàn)。當(dāng)出現(xiàn)了iommu以后,iommu通過控制每個設(shè)備dma地址到實(shí)際物理地址的映射轉(zhuǎn)換,使得在一定的內(nèi)核驅(qū)動框架下,用戶態(tài)驅(qū)動能能夠完全操作某個設(shè)備dma和中斷成為可能。

2、如果將這個物理設(shè)備通過透傳的方式進(jìn)入到虛擬化虛擬機(jī)里,虛擬機(jī)的設(shè)備驅(qū)動配置設(shè)備的dma后,hypervisor必須在透傳設(shè)備dma訪問時刻,對dma訪問進(jìn)行截獲,將其中dma訪問的虛擬機(jī)物理地址,轉(zhuǎn)換為hypervisor為虛擬機(jī)分配的物理地址,也就是需要將虛擬機(jī)透傳設(shè)備dma訪問做vpaddr(虛擬機(jī)物理地址)---->ppaddr(物理機(jī)物理地址)。這部分截獲對虛擬機(jī)dma來說帶來切換到hypervisor開銷,hypervisor轉(zhuǎn)換地址開銷。

當(dāng)引入了iommu以后,這部分開銷由iommu硬件承擔(dān),所有hypervisor工作就更加簡單,只需要將透傳設(shè)備Iommu dma地址映射表使用vpaddr--->ppaddr地址轉(zhuǎn)換表即可(這部分表在hypervisor里配置在ept中)

3、方便了老式32位pci硬件在64位機(jī)器上的使用。只需要在iommu地址映射表上配置32bitpci設(shè)備dma地址-->64位機(jī)器物理地址即可。

4、方便了主機(jī)os配置設(shè)備dma工作,因?yàn)閐ma要求使用連續(xù)的地址空間進(jìn)行讀寫,有了iommu的存在os就可以為設(shè)備配置連續(xù)的dma地址而真正對應(yīng)的非連續(xù)的物理地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容