一种虚拟机pci设备透传方法和系统的制作方法

文档序号:8942901阅读:931来源:国知局
一种虚拟机pci设备透传方法和系统的制作方法
【技术领域】
[0001]本发明涉及媒体通信技术领域,尤其涉及一种虚拟机PCI设备透传方法和系统。
【背景技术】
[0002]随着QEMU/KVM虚拟化技术应用越来越广泛,在许多场合,模拟的USB、显卡、网卡等外设不管在性能还是功能上都已经不能满足日益增长的需求。比如图形工作站对显卡的性能要求很高,而QEMU(Quick Emulator)模拟的显卡不能做硬件加速,根本无法满足要求。解决这个问题常用的一种办法是把宿主机上的PCI设备(比如显卡)直接分配给某个虚拟机使用,这种技术叫PCI设备透传,它很好地解决了虚拟环境下外设的性能问题。
[0003]现有PCI (Peripheral Component Interconnect)外设互联设备透传方案都是基于英特尔 VT_d(Intel Virtualizat1n Technology for Directed 1/0)或者1MMU (input/output memory management unit)来实现。支持 VT_d 或 1MMU 的 CPU 和主板成本普遍较高,而且相当一部分CPU和主板并不支持这项技术,给硬件选型带来较大困难。在 QEMU(Quick Emulator)/KVM(Kernel Virtual Machine)虚拟机中实现 PCI 设备透传,需要处理好以下四个方面的问题:
[0004]1.PCI配置空间映射;
[0005]2.PCI内存及1/0资源映射;
[0006]3.PCI IRQ 中断映射;
[0007]4.DMA (直接内存访问)操作。
[0008]对前两个问题,可以直接将宿主机中该PCI设备对应的资源文件用_ap方式直接映射到虚拟机地址空间中即可。对于第3个问题,可以在内核中使用一个内核线程来截获中断,然后将中断注入到虚拟机中。已有的各种实现在这三点上也已经比较成熟。
[0009]但是对于PCI透传设备的DMA操作是PCI设备透传的一个难点。
[0010]从附图1可以看到QEMU/KVM中,从虚拟机物理内存GPA到宿主机物理内存HPA需要经过两层转换:一次线性映射和一次MMU映射,才能找到对应的宿主机物理内存ΗΡΑ。这造成的结果是GPA和HPA几乎不可能是1:1对应的。
[0011]虚拟机vCPU在访问内存时,一样存在这个地址转换的问题,它通过扩展页表(EPT)技术从硬件层面上透明的将GPA转换到ΗΡΑ。
[0012]而PCI透传设备的直接内存存取DMA (Direct Memory Access)操作没有EPT的支持。虚拟机的设备驱动申请到的DMA内存是虚拟机的物理内存GPA,它通过写该设备的特定寄存器将这段内存的起始地址和大小告知该设备,然后该设备就会用这个地址GPA直接去访问宿主机的物理内存,只有GPA和HPA是1:1对应的情况下,透传的PCI设备才能访问到正确的地址,否则就会产生错误。现有的PCI设备透传方案都是基于VT-d/10MMU技术来解决这个问题,如附图2所示。
[0013]VT-d和1MMU是类似的10硬件虚拟化技术,VT_d属于Intel,1MMU则属于AMD。这项技术的作用和EPT类似,都是用来将GPA转换为HPA,但服务对象是外设,而不是vCPU。
[0014]VT-d/1MMU技术的原理是在外设和宿主机物理内存中间插入了一个1MMU硬件单元,在虚拟化环境中,透传的PCI设备发起DMA操作时,GPA经过1MMU转换后,变成正确的HPA。1MMU的地址转换表由QEMU/KVM在虚拟机初始化时建立。
[0015]上述现有技术中的的缺点为:
[0016]1.虚拟化成本高。支持VT-d或1MMU的CPU或主板普遍成本较高。
[0017]2.硬件选型比较困难。相当一部分CPU和主板并不支持VT-d或10MMU。
[0018]3.虽然1MMU硬件地址转换效率很高,但因为多了一次内存地址转换,对性能不可避免会有一定的影响。

【发明内容】

[0019]本发明的实施例提供了一种虚拟机PCI设备透传方法和系统,本发明提供了如下方案:
[0020]宿主机为虚拟机分配预留内存;
[0021]将虚拟机的待映射内存和宿主机的预留内存按照1:1建立映射关系;
[0022]虚拟机中安装驱动申请虚拟机中固定内存中的空闲内存;
[0023]加载PCI设备驱动,PCI设备根据所述映射关系发起DMA操作,直接访问宿主机内存。
[0024]根据本发明的上述方法,所述宿主机为虚拟机分配预留内存包括:
[0025]宿主机在QEMU中通过_ap/dev/mem为虚拟机分配所述预留内存;或,
[0026]宿主机创建内核模块为虚拟机分配所述预留内存。
[0027]根据本发明的上述方法,所述宿主机在QEMU中通过_ap/dev/mem为虚拟机分配所述预留内存,包括:
[0028]宿主机使用open函数打开/dev/mem文件,获取文件句柄;
[0029]将包括所述文件句柄的映射信息传给mmap函数,获取预留内存的虚拟地址;
[0030]通过所述虚拟地址访问为虚拟机分配的预留内存。
[0031]根据本发明的上述方法,所述宿主机创建内核模块为虚拟机分配所述预留内存,包括:
[0032]宿主机创建内核模块,为所述内核模块建立_ap操作调用内核的remap_pfn_range函数来做内存映射;
[0033]用mknod命令为所述内核模块生成对应的字符设备文件;
[0034]使用open函数打开/dev/mem文件,获取文件句柄;
[0035]将包括所述文件句柄的映射信息传给mmap函数,获取预留内存的虚拟地址;
[0036]通过所述虚拟地址访问为虚拟机分配的预留内存。
[0037]根据本发明的上述方法,所述虚拟机中安装驱动申请虚拟机中固定内存中的空闲内存包括,根据所述虚拟机的操作系统创建一个空的驱动,在所述驱动中加载的驱动函数里循环调用用于申请指定地址区间内的物理内存的函数,直至将指定地址区间内的物理内存都申请完,结束循环。
[0038]根据本发明的上述方法,还包括,在PCI设备驱动加载之前加载虚拟机中安装的所述驱动。
[0039]根据本发明的上述方法,建立所述映射关系之前,包括:调整虚拟机内存布局,使所述待映射内存在虚拟中的物理内存GPA和宿主机的物理内存HPA保持一致。
[0040]根据本发明的另一方面,还提供一种虚拟机PCI设备透传系统,包括:
[0041]预留模块:其用于宿主机为虚拟机分配预留内存;
[0042]映射模块:其用于将虚拟机的待映射内存和宿主机的预留内存按照1:1建立映射关系;
[0043]驱动模块:其用于在虚拟机中安装驱动申请虚拟机中固定内存中的空闲内存;
[0044]透传模块:其用于加载PCI设备驱动,PCI设备根据所述映射关系发起DMA操作,直接访问宿主机内存。
[0045]根据本发明的另一方面,所述预留模块,包括:
[0046]第一预留模块:其用于使宿主机在QEMU中通过_ap/dev/mem为虚拟机分配所述预留内存;或,
[0047]第二预留模块:其用于使宿主机创建内核模块为虚拟机分配所述预留内存。
[0048]根据本发明的另一方面,所述第一预留模块,包括:
[0049]第一获取组件:其用于使宿主机使用open函数打开/dev/mem文件,获取文件句柄;
[0050]第一传递组件:其用于将包括所述文件句柄的映射信息传给_ap函数,获取预留内存的虚拟地址;
[0051]第一分配组件:其用于通过所述虚拟地址访问为虚拟机分配的预留内存。
[0052]根据本发明的另一方面,所述第二预留模块,包括:
[0053]创建组件:其用于使宿主机创建内核模块,为所述内核模块建立mmap操作调用内核的remap_pfn_range函数来做内存映射;
[0054]生成组件:其用于用mknod命令为所述内核模块生成对应的字符设备文件;
[0055]第二获取组件:其用于使用open函数打开/dev/mem文件,获取文件句柄;
[0056]第二传递组件:其用于将包括所述文件句柄的映射信息传给_ap函数,获取预留内存的虚拟地址;
[0057]第二分配组件:其用于通过所述虚拟地址访问为虚拟机分配的预留内存。
[0058]根据本发明的另一方面,所述驱动模块,包括:
[0059]驱动组件:其用于根据所述虚拟机的操作系统创建一个空的驱动,在所述驱动中加载的驱动函数里循环调用用于申请指定地址区间内的物理内存的函数,直至将指定地址区间内的物理内存都申请完,结束循环。
[0060]根据本发明的另一方面,还包括:加载组件:其用于在PCI设备驱动加载之前加载虚拟机中安装的所述驱动。
[0061]根据本发明的另一方面,还包括:调整组件:其用于建立所述映射关系之前,调整虚拟机内存布局,使所述待映射内存在虚拟中的物理内存GPA和宿主机的物理内存HPA保持一致。
[0062]由上述本发明的
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1