IOMMU(i/o memory management unit)。iommu有兩大功能:控制設備dma地址映射到機器物理地址(dmar),中斷重映射(intremap)(可選)
1.1 dma地址空間映射
Iommu 的主要功能為設備dma時刻能夠訪問機器的物理內存區,同時保證安全性。
在沒有Iommu的時候,設備通過dma可以訪問到機器的全部的地址空間。
1、這種機制下如果將設備的驅動放在用戶態,那么如何保護機器物理內存區對於用戶態驅動框架設計帶來挑戰。當出現了iommu以后,iommu通過控制每個設備dma地址到實際物理地址的映射轉換,使得在一定的內核驅動框架下,用戶態驅動能能夠完全操作某個設備dma和中斷成為可能。
2、如果將這個物理設備通過透傳的方式進入到虛擬化虛擬機里,虛擬機的設備驅動配置設備的dma后,hypervisor必須在透傳設備dma訪問時刻,對dma訪問進行截獲,將其中dma訪問的虛擬機物理地址,轉換為hypervisor為虛擬機分配的物理地址,也就是需要將虛擬機透傳設備dma訪問做vpaddr(虛擬機物理地址)---->ppaddr(物理機物理地址)。這部分截獲對虛擬機dma來說帶來切換到hypervisor開銷,hypervisor轉換地址開銷。
當引入了iommu以后,這部分開銷由iommu硬件承擔,所有hypervisor工作就更加簡單,只需要將透傳設備Iommu dma地址映射表使用vpaddr--->ppaddr地址轉換表即可(這部分表在hypervisor里配置在ept中)
3、方便了老式32位pci硬件在64位機器上的使用。只需要在iommu地址映射表上配置32bitpci設備dma地址-->64位機器物理地址即可。
4、方便了主機os配置設備dma工作,因為dma要求使用連續的地址空間進行讀寫,有了iommu的存在os就可以為設備配置連續的dma地址而真正對應的非連續的物理地址
1.2 中斷重映射(可選)
在虛擬化透傳設備使用中,或者主機側用戶態驅動框架中還有一個問題就是msi中斷的安全保護。msi的特點就是只要發起特定的pci write 消息,機器(在x86上是LAPIC)就能夠將此pci write消息翻譯為一次中斷信號。在msi中斷信息里,含有中斷源信息,中斷vector信息以及中斷發往哪里,中斷模式等等信息。
如果設備透傳到虛擬機,而虛擬機里有惡意驅動,那么惡意驅動完全可以操作一個透傳設備發起dma write訪問,帶有msi中斷信息,導致hypervisor被攻擊。
在用戶態驅動層面也是相同的,用戶態驅動可以觸發dma 帶有msi中斷導致主機系統被攻擊。
為了防止這種情況發生,Intel的iommu技術(vt-d)里實現了中斷重映射技術(intremap)。設備發起的msi中斷先進入iommu的intremap模塊進行映射得到真正的msi中斷信息。主機os會在這個中斷重映射表里限定,某個設備只能發起哪種中斷向量,同時會驗證msi中的信息位(如此提升了惡意軟件觸發真實msi的難度)。
以下是大神的文章
