博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对IOMMU 和 vIOMMU 的理解
阅读量:5941 次
发布时间:2019-06-19

本文共 2587 字,大约阅读时间需要 8 分钟。

  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上的影响的讨论

以上内容由一些参考总结而来加上了自己的一些理解,不一定正确。

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

你可能感兴趣的文章
分布式系统唯一ID生成方案汇总【转】
查看>>
Cross-compilation using Clang
查看>>
营销系统--手动补偿
查看>>
图标字体设计
查看>>
【转】Principles of training multi-layer neural network using backpropagation
查看>>
并查集hdu1232
查看>>
改动Androidproject的名称(非Eclipse重命名)
查看>>
tomcat work目录的作用就是编译每个项目里的jsp文件为java文件如果项目没有jsp页面则这个项目文件夹为空...
查看>>
dedecms后台左侧菜单500错误怎么处理
查看>>
Maven配置将war包部署到Tomcat(tomcat7-maven-plugin)
查看>>
Spring MVC学习-------------訪问到静态的文件
查看>>
Unity应用架构设计(11)——一个网络层的构建
查看>>
运行自己的shell脚本
查看>>
内存错误的类别
查看>>
Authentication 方案优化探索(JWT, Session, Refresh Token, etc.)
查看>>
Struts2 关于返回type="chain"的用法.
查看>>
Maven私服安装及配置——(十二)
查看>>
设计模式 - 迭代器模式(iterator pattern) 具体解释
查看>>
Codeforces554B:Ohana Cleans Up
查看>>
【java】jvm查看当前虚拟机堆大小限制
查看>>