vt.
Intel VT-d的全称是Intel virtualization Technology for Direct I/O,它是Intel虚拟化技术的一部分,主要针对的是I/O子系统,它的实现主要是通过在硬件上引入重定向单元,该硬件重定向单元用于对I/O子系统的DMA操作和中断传递进行重定向,从而辅助VMM(Virtual Machine monitor)实现I/O子系统的虚拟化。
一般情况下VMM支持I/O虚拟化可以通过以下四种方式实现:
- 纯软件模拟。即VMM的软件模拟一个现有的I/O设备,这种方式具有较好的兼容性,但是纯软件模拟在性能和功能上就表现得比较差了。
- 还是纯软件模拟,但是引入新的I/O操作接口,这些接口针对I/O虚拟化进行一定的优化,这样虽然能够解决一定的性能问题,但是兼容性问题又出现了,因为需要使用新的操作接口。
- 硬件分配,直接将I/O设备分配给某个VM(Virtual Machine),这样只有指定的VM能够使用该I/O设备,并且I/O设备的驱动位于VM中,并且VM能够直接对I/O设备进行操作,这样性能和兼容性都能达到最佳,但是一个I/O设备只能给一个VM使用。
- I/O设备分享,这是硬件分配方式的一种扩展,主要还是需要I/O设备本身需要支持一定的功能,如能够同时提供多个功能接口,比如PCIe设备的SR-IOV功能,即PCIe设备本身能够将一个物理PCIe设备,变成多个逻辑设备,这多个逻辑设备共享该PCIe设备上的物理资源,并且可以独立地分配给不同的VM。
以上I/O虚拟化的一个通用要求就是要求VMM能够将属于不同VM的I/O设备安全地隔离起来,即需要满足以下两方面的要求:
- 属于一个VM的vcpu无法访问到属于另外一个VM的I/O设备,这可以通过VMX(Virtual Machine Extension)中的EPT(Extended Page Table)功能来实现,即VMM可以通过软件配置,将虚拟机物理内存,即Guest Physcial Address映射到不同的主机内存区域,即Host Physical Address。
- 属于一个VM的I/O设备不能访问到属于其他VM的内存或者向属于其他VM的中断控制器发送中断。如果是纯软件模拟的方式,则VMM也可以通过纯软件的方式来控制I/O设备访问内存(如DMA)和发送中断的行为。但是如果采用硬件分配的方式,则就需要在硬件上对I/O设备访问内存和发送中断的行为进行拦截,然后重定向到指定的VM中,这就是VT-d派上用场的时候了。
VT-d是一个位于CPU、内存和I/O设备之间的硬件设备,通常位于PCI设备树的根部,或者类似的位于I/O子系统的根部,当VT-d重定向硬件设备启用的时候,它会拦截位于它下面的所有I/O设备产生的中断请求和通过DMA方式对虚拟机内存访问的请求,然后通过查找中断重定向表或者I/O页表的方式(类似分页机制)来重新定位中断转发的目标LAPIC或者是I/O设备访问的目标主机物理内存地址。如下图所示:
VMM软件负责I/O设备的分配,即将指定I/O设备和相应的VM对应起来,并且负责建立中断重定向关系表和I/O地址转换页表,并将这些转换关系的配置设置到VT-d硬件设备上,而I/O设备发起的中断请求或者DMA内存访问请求中带有相应设备的ID,这样VT-d硬件单元就可以通过硬件查找的方式将不同的I/O设备中断和内存访问请求重定向到相应的VM上,从而达到隔离不同VM的I/O设备的目的。
总的来说,VT-d的主要功能就是将I/O设备的DMA访问请求和中断请求重定向到VMM设定好的VM中。
相关阅读
'Thu May 12 2016 08:00:00 GMT+0800 (中国标准时间)'--此格式日期无法传到java后台,须格式化,方法如下 var d = new Date('Thu M
一、文介绍的是著名的网络结构GoogLeNet及其延伸版本,目的是试图领会其中的思想而不是单纯关注结构。GoogLeNet Incepetion V1Moti
前言:该机器为某个其他培训机构的靶机,说实话在这里没炫耀啥,只是给各位学习Ms17010的同学指一条路,我原先也折腾这玩意儿好久,但是就
declare-styleable是给自定义控件添加自定义属性用的1.首先,先写attrs.xml<?xml version="1.0" encoding="utf-8"?> <resources>
使用git merge --squash,让commit变得优雅
阅读本文需要3分钟 情景模拟 我们有三个分支,master,develop以及feature特性分支,假定我们开发时使用的是feature分支,我们来这里查看