對IOMMU 和 vIOMMU 的理解

  1. MMU(Memory Management Unit, 內存管理單元): 將虛擬地址轉化爲物理地址,cpu與主存之間地址轉換。html

  2. DMA(Direct Memory Access,直接內存存取): 是一種快速傳送數據的機制。DMA 傳輸將數據從一個地址空間複製到另一個地址空間。包括如下幾
    當CPU 初始化這個傳輸動做,傳輸動做自己是由 DMA 控制器來實行和完成。最初的DMA地址是物理地址,後來dmar就出現了。 dmar意爲DMA remapping,是Intel爲支持虛擬機而設計的I/O虛擬化技術,I/O設備訪問的DMA地址再也不是物理內存地址,而要經過DMA remapping硬件進行轉譯,DMA remapping硬件會把DMA地址翻譯成物理內存地址,並檢查訪問權限等等。負責DMA remapping操做的硬件稱爲IOMMUlinux

  3. IOMMU設備訪問的虛擬地址轉化爲物理地址,鏈接DMA-capable 總線和主存。爲了防止設備錯誤地訪問內存,有些IOMMU還提供了訪問內存保護機制(檢查訪問權限)。IOMMU不只將DMA地址虛擬化,還起到隔離,保護等做用。安全

  4. vIOMMU: Host 的 iommu 能夠保證 host 的關鍵區域內存不被惡意訪問。3種主要的使用場景:
    (1) 對PCI assignment,設備分配到 guest 之後,guest 的內存區域是不受 host iommu 的保護的。若是設備對 guest 的某些地址進行惡意寫,可能會致使guest crash(第1和第2種風險)。因此引入vIOMMU,它對guest的做用,至關於IOMMU對host的做用。它會致使guest的performance降低。
    (2) For nested virtualization, an IOMMU is required for device assignment to work, just like assign device from host to L1 guest. (第1和第2種風險)Here, to assign a L1 guest device to a L2 guest, we also need a vIOMMU inside L1 guest to build up the page mappings required for device assignment work. 因此若是L1的guest想要作pci assign給L2 guest, L1 的guest須要enable vIOMMU,即添加一個iommu的設備(DMA remapping),並設置中斷重定向(可選)。
    (3) guest 使用DPDK, DPDK是用戶空間的driver,host iommu不能防止它對host的內存空間惡意寫(下面的第3種風險);
      對於徹底emulated的設備如網卡,rtl8139, e1000, 能夠跟vIOMMU兼容。不須要作別的設置。只需添加一個iommu的設備(DMA remapping),並設置中斷重定向(可選);
      對於pci assgin的設備,還必須打開caching_mode=on;
      對於virtio設備,由於virtio驅動默認繞開了DMA remapping,因此須要設置<driver iommu='on' ats='on'>在virtio設備中,而且在iommu設備中添加iotlb='on';

Q: 按照上面的解釋,默認VT-d在物理機上是disable的狀態,也就是沒有啓用IOMMU,對嗎?這樣會致使物理設備直接訪問的是真實的物理地址,沒有翻譯的過程,沒有檢查和隔離的過程,那這樣是否會對物理機帶來安全隱患?
A: 是的。在虛擬化的環境中,狀況更加惡劣,由於若是沒有IOMMU, 設備能夠看到並使用全部的內存,致使可能一個VM 能夠訪問別的VM以及host的地址空間。app

Q: 設備如何發起一個DMA過程?
A: OS 中的設備驅動建立一個DMA descriptors 包含如下信息: 要操做的內存地址,區域長度以及這個設備的狀態信息。若是沒有IOMMU,這個地址是實際的物理內存地址。設備驅動建立完這個descriptor後將它交給設備,設備將使用這個descriptor來對它所指的內存區域進行異步操做(讀/寫)。當讀/寫操做完成後,設備對設備驅動發出中斷。異步

Q: DMA 是用實際的物理地址有哪些種類的風險?
1) 設備驅動建立一個錯誤的DMA descriptor 指向某個它不應訪問的區域(bad-address);
2) DMA descriptor建立之後,OS 對它所指向的區域作了修改,致使設備讀寫到它不應訪問的內容(invalid-use);
3) 設備本身使用了一個非法地址(bad-device);ide

Q: 在kernel cmdline 中加的iommu=pt intel_iommu=on 中, iommu=pt是什麼意思?有什麼做用?
A: In addition it is recommended to use iommu=pt option which improves IO performance for devices in the host. To get the best performance, add iommu=pt (pass-through) to the grub file when using SR-IOV. When in pass-through mode, the adapter does not need to use DMA translation to the memory, and this improves the performance. iommu=pt is needed mainly with hypervisor performance is needed. 不太理解。。。這個是iommupt用在dpdk上的影響的討論 http://mails.dpdk.org/archives/dev/2014-October/007180.htmlui

以上內容由一些參考總結而來加上了本身的一些理解,不必定正確。
https://www.ece.rice.edu/~willmann/pubs/cdna_usenix.pdf
https://nanxiao.me/iommu-introduction/
http://linuxperf.com/?p=67
https://wiki.qemu.org/Features/VT-d
https://www.kernel.org/doc/Documentation/Intel-IOMMU.txtthis

相關文章
相關標籤/搜索