对IOMMU 和 vIOMMU 的理解

  1. MMU(Memory Management Unit, 内存管理单元): 将虚拟地址转化为物理地址,cpu与主存之间地址转换。

  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操作的硬件称为IOMMU

  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的地址空间。

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);

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.html

以上内容由一些参考总结而来加上了自己的一些理解,不一定正确。
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.txt

转载于:https://blog.51cto.com/11527071/2135933

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值