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ù)空凸,必須使用實際的物理地址(也就是HPA)嚎花,但DMA本身是為了減輕CPU的處理負(fù)擔(dān)而存在的,其傳輸過程并不經(jīng)過CPU劫恒。對于一個支持DMA傳輸?shù)脑O(shè)備贩幻,當(dāng)它拿著GPA去發(fā)起DMA操作時,由于沒有真實的物理內(nèi)存地址两嘴,傳輸勢必會失敗。
那如何實現(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頁表杠园。在具體的實現(xiàn)中,通常是一個guest VM作為一個domain舔庶,因此分配給同一個guest VM的設(shè)備將共享同一個IO頁表抛蚁。
IOMMU能將device使用的虛擬地址(也稱為設(shè)備地址或者IO地址)轉(zhuǎn)化為物理地址,如果沒有IOMMU,DMA也能直接訪問RAM中的內(nèi)容,但是讓DMA沒有限制地訪問RAM是一件很危險的事情,而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è)計帶來挑戰(zhàn)。當(dāng)出現(xiàn)了iommu以后朦促,iommu通過控制每個設(shè)備dma地址到實際物理地址的映射轉(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工作蘑拯,因為dma要求使用連續(xù)的地址空間進(jìn)行讀寫钝满,有了iommu的存在os就可以為設(shè)備配置連續(xù)的dma地址而真正對應(yīng)的非連續(xù)的物理地址