DevicePass-through及网卡的直接分配在Xen里面的实现
来源:互联网 发布:淘宝哪里有卖高仿耐克 编辑:程序博客网 时间:2024/05/06 22:58
《系统虚拟化原理》这本书看了大半年了,里面的内容反复看过之后,会不断的有收获,之前关于Passthough的概念很直很模糊,Passthough的具体实现也不清楚,今天看完书之后,终于有了一个初步的理解,特记录下来。
首先需要理解passthough这个概念,Passthough是指在虚拟化平台下,将物理设备直接分配给某个客户机使用。为实现设备的直接分配,VMM需要提供以下三种功能:
提到IO设备,我们就会想到三件事:
1、操作系统访问设备的IO地址空间(PortIO或MMIO);
2、设备的DMA操作直接访问内存空间;
3、中断
VMM为实现第一件事,也就是客户机操作系统访问到直接分配设备的IO地址空间,采用了转换表(这期间有多种考虑,最终选择了转换表,感兴趣的童鞋可以自己查资料普及)。所谓转换表,就是将客户机对设备虚拟PortIO地址空间或虚拟MMIO地址空间的访问进行转换。对于PortIO,可以通过设置VMCS中的IO bitmap,使得客户机访问设备的虚拟PortIO空间时陷出到VMM,VMM通过查询转换表,找到设备的真实PortIO地址空间,将客户机的请求转发给真实设备。对于MMIO,可以通过内存虚拟化技术实现,比如EPT页表,客户机在第一次访问设备虚拟MMIO地址空间时会陷入到VMM,此时修改EPT页表建立虚拟MMIO与设备物理MMIO的映射,在以后的访问中就不会再陷入到VMM。
VMM为实现第二件事,引入了DMA重映射硬件(通常很难通过软件截获设备的DMA操作),Intel的VT-D技术和AMD的IOMMU技术。以VT-d为例,客户机驱动程序提供GPA给设备进行DMA读写数据,DMA重映射硬件实现将GPA映射为MPA。首先硬件通过BDF设备标识符中的bus字段获得设备对应的根条目,根据根条目中的CTP字段获得设备的上下文条目,根据DF{dev:func}字段寻址到该设备对应的IO页表。VT-d也使用硬件查页表机制,获得设备DMA映射的物理地址。每个客户机有一个IO页表,同时VT-d硬件中也含有IO页表的缓存,叫做IOTLB。对于VT-D硬件,和所有硬件一样,在使用之前需要对它进行探测。
VMM为实现第三件事,引入中断虚拟化机制。中断虚拟化的实现主要通过实现虚拟PIC,虚拟IOAPIC,虚拟LAPIC实现,其中虚拟LAPIC在VCPU中。对于直接分配设备,发生中断时,首先设备驱动程序将中断请求发送给物理IOAPIC,物理IOAPIC将请求传递给物理LAPIC,物理LAPIC将请求传递给VMM,VMM通过查看IDT表,发现该设备直接分配给了客户机,则将中断请求通过中断注入的方式发送给LAPIC,再由客户机查找相应的中断处理函数实现。
以上为DevicePassthrough的具体实现。
接下来以网卡为例,分析网卡如何直接分配给Xen客户机:
1、用户通过lspci获得PCI设备的BDF号
2、隐藏设备,用户增加Dom0的grub启动项,pciback.hide=(03:00.0),这样Dom0就不会为该设备加载驱动了
3、用户在客户机的配置文件中指定BDF号,告诉VMM要将该设备直接分配。在Xen里面用户可以在HVM配置文件中增加pci =['03:00.1']
4、Xen获得直接分配请求后,通过在设备模型里虚拟一个PCI网卡来实现,这个虚拟PCI网卡相当于物理网卡在客户机中代言,客户机操作系统对虚拟网卡的请求都会转交的到物理网卡上,物理网卡处理完请求将结果通过虚拟网卡返回给客户机操作系。
5、Xen负责虚拟PCI网卡和物理网卡之间的交互。具体包括进行虚拟BDF与物理BDF直接的转换,进行虚拟IO地址空间与物理IO地址空间的转换。还有为物理网卡设置VT-d的IO页表。
以上为网卡在Xen里面的直接分配。
1 0
- DevicePass-through及网卡的直接分配在Xen里面的实现
- DevicePass-through及网卡的直接分配在Xen里面的实现
- xen虚拟机的资源分配
- CentOS 5.2 Xen内核,双网卡绑定的问题及处理
- 在网卡的直接模式下进行抓包
- DLL分配的内存如何在EXE里面释放
- DLL分配的内存如何在EXE里面释放
- 如何在WebBrowser1控件直接显示memo1里面的代码
- 如何在WebBrowser1控件直接显示memo1里面的代码
- 在rails 里面 不通过simple_form 直接在一个view里面生成select 下拉框的方法
- 在rails 里面 不通过simple_form 直接在一个view里面生成select 下拉框的方法
- dll里面分配的空间一定要在dll里面释放吗
- 在MFC里面实现线程的实例
- 在MFC里面实现线程的实例
- Xen环境下的内存与CPU分配
- 带xen的linux下直接安装虚拟系统
- 网卡与网卡直接连接的双绞线的做法
- Ipv4AddressHelper向网卡分配地址的方法
- JAVA中的泛型
- Android美女拼图游戏
- Eclipse生成javadoc帮助文档及基础知识
- SVM 详解4
- 缺失值的查找与替换
- DevicePass-through及网卡的直接分配在Xen里面的实现
- 搜狗校招笔试题编程之一
- SVM 详解5
- HDU 4333 Revolving Digits【EXKMP求LCP&&KMP求最小循环节(串旋转)】
- javascritp学习
- x264惹得祸
- zkClient的打包及使用
- C#控制台基础 File.WriteAllLines,以覆盖的方式将一个一维string数组写入txt
- 比特币区块链相关视频