虚拟机同时支持PCIe虚拟设备和物理设备的方法转让专利

申请号 : CN202310999953.2

文献号 : CN116737322B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 崔建英申利飞张云飞黄磊

申请人 : 麒麟软件有限公司

摘要 :

本发明涉及一种虚拟机同时支持PCIe虚拟设备和物理设备的方法,本发明通过在Linux设备树中添加两个PCIe控制器,一个PCIe控制器节点设置虚拟PCIe的ECAM地址空间,另一个PCIe控制器节点设置和host主机上一致的PCIe ECAM地址空间,使客户机Linux识别到两个PCI域。并在hypervisor中通过模拟MMIO方式,控制客户机通过PCIe ECAM地址访问不同的PCI域,每个PCI域有对应的ECAM地址空间,通ECAM地址空间基地址加上PCIe设备偏移就可以访问不同域的PCIe设备的配置空间。从而实现在armv8架构下,通过分区虚拟化工具,使客户机既支持PCIe虚拟设备,又支持PCIe物理设备。

权利要求 :

1.虚拟机同时支持PCIe虚拟设备和物理设备的方法,该方法应用于armv8硬件平台,其特征在于,包括以下步骤:S1:在Linux系统上安装Jailhouse分区虚拟化工具;

S2:启动Jailhouse分区虚拟化工具,将主机系统分隔为分别运行Linux系统的root客户机和none root客户机;

S3:隔离root客户机,通过主机的Linux系统获取虚拟PCIe控制器的ECAM空间和物理PCIe控制器的ECAM空间,并分别将其基地址录入root客户机配置文件中;

S4:在root客户机配置文件增加PCIe设备描述,并将其填加在虚拟PCIe控制器下的总线上;

S5:启动root客户机,使得root客户机的Linux系统访问虚拟PCIe设备,在root客户机的Linux系统中能够直接访问物理PCIe设备;

S6:隔离none root客户机,修改none root客户机上运行的Linux系统的设备树文件,使得none root客户机的Linux系统启动时按照修改后的设备树文件枚举PCIe设备;

S7:在hypervisor中增加ECAM空间地址转换表,以便将none root客户机Linux访问的第一个PCIe设备的ECAM地址转换成主机上真实的PCIe设备的ECAM地址;

S8:修改网卡驱动,使得网卡工作在INTx中断模式,并将修改后的网卡驱动放入none root客户机Linux系统的文件系统中;

S9:将主机的Linux系统的设备树文件中的INTx中断的INTA中断号配置信息配置到none root客户机配置文件中;

S10:将none root客户机的Linux系统的设备树文件中配置的虚拟PCIe控制器使用的INTx中断的INTA中断号配置信息配置到none root客户机配置文件中;将虚拟PCIe设备中的INTx中断配置信息隔离到none root客户机中;

S11:通过“1:1”的方式将主机预留的物理内存映射到none root客户机,作为none root客户机系统内存;

S12:启动none root客户机将主机上的PCIe网卡隔离到none root客户机上。

2.根据权利要求1所述的虚拟机同时支持PCIe虚拟设备和物理设备的方法,其特征在于,步骤S3是通过以下步骤实现的:

S31:主机的Linux系统上通过cat /proc/iomem命令获取主机内存地址空间,利用内存地址空间中的部分空闲地址空间作为虚拟PCIe控制器的ECAM空间,将虚拟PCIe控制器的ECAM空间的基地址写到root客户机的配置文件中的pci_mmconfig_base配置项中;

S32:在主机的Linux系统上通过cat /proc/iomem命令获取主机的物理PCIe控制器的ECAM地址空间,在root客户机的配置文件中的增加一个配置项pci_mmconfig_base_physical,将物理PCIe控制器的ECAM地址空间的基地址记录其中。

3.根据权利要求2所述的虚拟机同时支持PCIe虚拟设备和物理设备的方法,其特征在于,步骤S4是通过以下方法实现的:在root客户机的配置文件中增加一个类型为JAILHOUSE_PCI_TYPE_IVSHMEM的PCIe设备,用来描述共享内存的PCIe设备。

4.根据权利要求3所述的虚拟机同时支持PCIe虚拟设备和物理设备的方法,其特征在于,步骤S5中还包括以下步骤:

S51:在root客户机的Linux系统驱动中,根据配置的虚拟PCIe控制器的ECAM地址空间,通过Linux设备树添加一个虚拟PCIe控制器,并将配置的共享内存的PCIe设备添加到虚拟PCIe控制器下的总线上;

S52:物理PCIe ECAM地址空间映射到hypervisor中,并通过模拟MMIO的方式控制root客户机访问虚拟PCIe ECAM地址空间。

5.根据权利要求4所述的虚拟机同时支持PCIe虚拟设备和物理设备的方法,其特征在于,步骤S6还包括以下步骤:

S61:在none root客户机上运行的Linux系统的设备树文件上增加两个PCIe控制器节点,其中一个PCIe控制器节点设置虚拟PCIe的ECAM地址空间,另一个PCIe控制器节点设置与host主机上一致的PCIe ECAM地址空间;

S62:通过模拟MMIO方式控制none root客户机访问虚拟PCIe和物理PCIe ECAM地址空间;

S63:在none root客户机配置文件中增加两个设备描述:

类型为JAILHOUSE_PCI_TYPE_IVSHMEM的PCIe设备,用来描述共享内存的PCIe设备;

类型为JAILHOUSE_PCI_TYPE_DEVICE的PCIe设备,来描述要从host主机上隔离的PCIe网卡设备。

说明书 :

虚拟机同时支持PCIe虚拟设备和物理设备的方法

技术领域

[0001] 本发明涉及PCIe设备,具体涉及一种虚拟机同时支持PCIe虚拟设备和物理设备的方法。

背景技术

[0002] 随着集成电路制造工艺的发展,越来越多的计算单元被集成到单一芯片上。如何更有效地使用单芯片上的资源从而获得良好的系统伸缩性成为摆在系统软件设计者面前的重要问题。目前多核系统上部署虚拟机监控器(hypervisor)是解决该问题的一种有效的解决方式。hypervisor的虚拟化和隔离功能可以实现多个客户机操作系统运行在同一个硬件平台之上。根据不同客户机应用需求,给不同客户机配置不同的硬件资源,更加有效的利用硬件资源。
[0003] 但同一客户机上根据不同应用的需求,有些应用需要尽可能的利用外部设备,比如利用PCIe物理网卡向远端传输大量数据;而有些应用同时又需要尽可能少利用外部设备,减少对外部设备产生干扰,比如利用PCIe虚拟设备实现共享内存与其它客户机传输大量数据。这样,就需要客户机既要支持PCIe虚拟设备,又要支持PCIe物理设备,充分利用系统资源,使系统性能最大化。
[0004] 目前分区虚拟化工具jailhouse在armv8架构下,无法实现客户机既支持PCIe虚拟设备,又支持PCIe物理设备。这样就大大限制了分区虚拟化的应用,无法更加有效的利用硬件资源。

发明内容

[0005] 本发明的主要目的是提供一种虚拟机同时支持PCIe虚拟设备和物理设备的方法,在armv8架构下,使用分区虚拟化工具jialhouse实现客户机既支持PCIe虚拟设备,又支持PCIe物理设备。
[0006] 为了完成上述目的,本发明提供了一种虚拟机同时支持PCIe虚拟设备和物理设备的方法,该方法应用于armv8硬件平台,包括以下步骤:
[0007] S1:在Linux系统上安装Jailhouse分区虚拟化工具;
[0008] S2:启动Jailhouse分区虚拟化工具,将主机系统分隔为分别运行Linux系统的root客户机和none root客户机;
[0009] S3:隔离root客户机,通过主机的Linux系统获取虚拟PCIe控制器的ECAM空间和物理PCIe控制器的ECAM空间,并分别将其基地址录入root客户机配置文件中;
[0010] S4:在root客户机配置文件增加PCIe设备描述,并将其填加在虚拟PCIe控制器下的总线上;
[0011] S5:启动root客户机,使得root客户机的Linux系统访问虚拟PCIe设备,在root客户机的Linux系统中能够直接访问物理PCIe设备;
[0012] S6:隔离none root客户机,修改none root客户机上运行的Linux系统的设备树文件,使得none root客户机的Linux系统启动时按照修改后的设备树文件枚举PCIe设备;
[0013] S7:在hypervisor中增加ECAM空间地址转换表,以便将none root客户机Linux访问的第一个PCIe设备的ECAM地址转换成主机上真实的PCIe设备的ECAM地址;
[0014] S8:修改网卡驱动,使得网卡工作在INTx中断模式,并将修改后的网卡驱动放入none root客户机Linux系统的文件系统中;
[0015] S9:将主机的Linux系统的设备树文件中的INTx中断的INTA中断号配置信息配置到none root客户机配置文件中;
[0016] S10:将none root客户机的Linux系统的设备树文件中配置的虚拟PCIe控制器使用的INTx中断的INTA中断号配置信息配置到none root客户机配置文件中;将虚拟PCIe设备中的INTx中断配置信息隔离到none root客户机中;
[0017] S11:通过“1:1”的方式将主机预留的物理内存映射到none root客户机,作为none root客户机系统内存;
[0018] S12:启动none root客户机将主机上的PCIe网卡隔离到none root客户机上。
[0019] 优选的,步骤S3是通过以下步骤实现的:
[0020] S31:主机的Linux系统上通过cat /proc/iomem命令获取主机内存地址空间,利用内存地址空间中的部分空闲地址空间作为虚拟PCIe控制器的ECAM空间,将虚拟PCIe控制器的ECAM空间的基地址写到root客户机的配置文件中的pci_mmconfig_base配置项中;
[0021] S32:在主机的Linux系统上通过cat /proc/iomem命令获取主机的物理PCIe控制器的ECAM地址空间,在root客户机的配置文件中的增加一个配置项pci_mmconfig_base_physical,将物理PCIe控制器的ECAM地址空间的基地址记录其中。
[0022] 更进一步优选的,步骤S4是通过以下方法实现的:
[0023] 在root客户机的配置文件中增加一个类型为JAILHOUSE_PCI_TYPE_IVSHMEM的PCIe设备,用来描述共享内存的PCIe设备。
[0024] 更进一步优选的,步骤S5中还包括以下步骤:
[0025] S51:在root客户机的Linux系统驱动中,根据配置的虚拟PCIe控制器的ECAM地址空间,通过Linux设备树添加一个虚拟PCIe控制器,并将配置的共享内存的PCIe设备添加到虚拟PCIe控制器下的总线上;
[0026] S52:物理PCIe ECAM地址空间映射到hypervisor中,并通过模拟MMIO的方式控制root客户机访问虚拟PCIe ECAM地址空间。
[0027] 更进一步优选的,步骤S6还包括以下步骤:
[0028] S61:在none root客户机上运行的Linux系统的设备树文件上增加两个PCIe控制器节点,其中一个PCIe控制器节点设置虚拟PCIe的ECAM地址空间,另一个PCIe控制器节点设置与host主机上一致的PCIe ECAM地址空间;
[0029] S62:通过模拟MMIO方式控制none root客户机访问虚拟PCIe和物理PCIe ECAM地址空间;
[0030] S63:在none root客户机配置文件中增加两个设备描述:
[0031] 类型为JAILHOUSE_PCI_TYPE_IVSHMEM的PCIe设备,用来描述共享内存的PCIe设备;
[0032] 类型为JAILHOUSE_PCI_TYPE_DEVICE的PCIe设备,来描述要从host主机上隔离的PCIe网卡设备。
[0033] 本发明的有益效果为:
[0034] 本发明通过在Linux设备树中添加两个PCIe控制器,一个PCIe控制器节点设置虚拟PCIe的ECAM地址空间,另一个PCIe控制器节点设置和host 主机上一致的PCIe ECAM地址空间,使客户机Linux识别到两个PCI域。并在hypervisor中通过模拟MMIO方式,控制客户机通过PCIe ECAM地址访问不同的PCI域,每个PCI域有对应的ECAM地址空间,通ECAM地址空间基地址加上PCIe设备偏移就可以访问不同域的PCIe设备的配置空间。从而实现在armv8架构下,通过分区虚拟化工具,使客户机既支持PCIe虚拟设备,又支持PCIe物理设备。
[0035] 本发明实现虚拟客户机既支持PCIe虚拟设备,又支持PCIe物理设备,既可以利用PCIe物理设备与外界交互数据,又可利用PCIe虚拟设备与其它客户机交互数据,充分利用系统资源,使系统性能最大化。

附图说明

[0036] 下面结合附图和具体实施方式对本发明作进一步详细的说明。
[0037] 图1是本发明的PCIe设备的ECAM空间地址转换表;
[0038] 图2是本发明的主机上PCIe拓扑结构。

具体实施方式

[0039] 下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
[0040] 本发明具体实施基于armv8硬件平台,外置intel i210 pcie网卡,Linux内核版本是4.19。
[0041] S1:在Linux系统上安装Jailhouse分区虚拟化工具。
[0042] S2:启动Jailhouse分区虚拟化工具,将主机系统分隔为分别运行Linux系统的root客户机和none root客户机。
[0043] 在本实施例中,通过Jailhouse分区虚拟化工具将主机的Linux系统实现分区虚拟化,从而将主机隔离为两个分区:root客户机和none root客户机。这两个客户机均运行Linux系统,目的是将主机上的PCIe网卡(即PCIe物理设备)隔离到none root客户机上,并且root客户机与none root客户机通过虚拟PCIe设备实现的共享内存传输数据。
[0044] 目前,PCIe采用的是树形拓扑结构,一般由root complex、switch、endpoint等类型的PCIe设备组成。
[0045] 需要说明的是,在操作系统启动之前整个系统的PCIe拓扑结构是未知的,只有root complex内部总线是已知的,其命名为BUS 0,这是硬件编码在芯片当中的。Linux系统为了得到整个系统的PCIe拓扑,Linux系统首先要对PCIe总线进行扫描来枚举该总线下连接的所有设备。所谓枚举,就是从root complex根桥开始进行探测和扫描,逐个“枚举”连接在第一条PCIe总线上的所有设备并记录在案。如果其中的某个设备是PCIe桥,则又进一步再探测和扫描连在这个桥上的次级PCIe总线。就这样递归下去,直到穷尽系统中的所有PCIe设备,即深度优先搜索。枚举结束后得到PCIe树形拓扑结构,以及每个PCIe设备的唯一标识BDF(bus、device、function)。
[0046] 扫描BUS 0下的所有PCIe设备,就需要访问PCIe设备内部的配置空间,配置空间包含设备标识、能力等信息。ARM架构下使用ECAM方式访问PCIe配置空间,可以读取配置空间获取设备的信息,也可以通过配置空间来配置设备,目前每个PCIe设备配置空间大小为4kbytes。通过ECAM地址空间基地址加上PCIe设备偏移就可以访问所有PCIe设备的配置空间。
[0047] 为了让客户机既支持虚拟PCIe设备,又支持物理PCIe设备,就需要在PCIe root complex硬件控制器的基础上,增加一个虚拟PCIe root complex控制器。每个PCIe root complex根桥下都建立一个PCI域(需要说明的是,一个PCIe控制器下所有的PCIe设备称之为PCIe域):一组总线段。一个操作系统可以随意分配每个PCI域的总线号,可以重用总线号或按顺序分配。Linux操作系统对每个PCI域的总线号按重用的方式分配,即PCI域下总线号都从0开始编号(如图1所示)。每个PCI域有对应的ECAM地址空间,通过ECAM地址空间基地址加上PCIe设备偏移就可以访问不同域的PCIe设备的配置空间。
[0048] S3:隔离root客户机,通过主机的Linux系统获取虚拟PCIe控制器的ECAM空间和物理PCIe控制器的ECAM空间,并分别将其基地址录入root客户机配置文件中。
[0049] 具体的,在本步骤中,需要设置root客户机PCIe ECAM空间。首先(即步骤S31),在主机Linux上通过cat /proc/iomem命令获取主机内存地址空间,找一个内存地址空间中的部分空闲地址空间(本实施例采用256Mbytes)空闲地址空间作为虚拟PCIe控制器的ECAM空间,将PCIe ECAM空间基地址写到root客户机的配置文件中的pci_mmconfig_base配置项中。其次(即步骤S32),在主机的Linux系统上再通过cat /proc/iomem命令获取主机物理PCIe控制器的ECAM地址空间,在root客户机的配置文件中增加一个配置项pci_mmconfig_base_physical,并将物理PCIe控制器的ECAM基地址记录其中。
[0050] S4:在root客户机配置文件增加PCIe设备描述,并将其填加在虚拟PCIe控制器下的总线上。在本步骤中,具体的,在root客户机配置文件中增加一个类型为JAILHOUSE_PCI_TYPE_IVSHMEM的PCIe设备,用来描述共享内存的PCIe设备。
[0051] S5:启动root客户机,使得root客户机的Linux系统访问虚拟PCIe设备,在root客户机的Linux系统中能够直接访问物理PCIe设备。具体的,本步骤还包括以下步骤:
[0052] S51:Root客户机启动后,首先在驱动中,根据配置的虚拟PCIe控制器的ECAM地址空间,通过Linux设备树添加一个虚拟PCIe控制器,并将配置的共享内存的PCIe设备添加到虚拟PCIe控制器下的总线上,此时host主机上存在两个PCIe域(如图2所示)。
[0053] S52:将物理PCIe ECAM地址空间映射到hypervisor中,并通过模拟MMIO(Memroy‑mapped Input/Output)的方式控制root客户机访问虚拟PCIe ECAM地址空间。
[0054] 通过上述步骤,当root客户机访问虚拟PCIe ECAM地址空间时,由于虚拟ECAM地址空间没有映射到root客户机,因此会触发同步异常,陷入hypervisor中,访问hypervisor中模拟的虚拟PCIe配置空间。这样root客户机Linux就可以访问了虚拟PCIe设备,而物理PCIe设备在root客户机Linux可以直接访问。
[0055] S6:隔离none root客户机,修改none root客户机上运行的Linux系统的设备树文件,使得none root客户机的Linux系统启动时按照修改后的设备树文件枚举PCIe设备。
[0056] 具体的,本步骤还包括以下步骤:
[0057] S61:修改none root客户机上运行的Linux系统的设备树文件,增加两个PCIe控制器节点。其中一个PCIe控制器节点设置虚拟PCIe的ECAM地址空间,另一个PCIe控制器节点设置和host 主机上一致的PCIe ECAM地址空间。
[0058] S62:通过模拟MMIO方式控制none root客户机访问虚拟PCIe和物理PCIe ECAM地址空间。
[0059] 通过上述步骤的修改, none root客户机启动时,当none root客户机访问虚拟PCIe和物理PCIe ECAM地址空间时,由于虚拟和物理ECAM地址空间都没有映射到none root客户机,因此会触发同步异常,陷入hypervisor中,或者访问hypervisor中模拟的虚拟PCIe配置空间,或者根据hypervisor对物理PCIe ECAM地址空间建立的映射访问host主机上真实的PCIe设备的配置空间。这样,none root客户机Linux启动时按照设备树配置的两个PCIe控制的ECAM地址空间枚举PCIe设备。
[0060] S63:在none root客户机配置文件中首先增加一个类型为JAILHOUSE_PCI_TYPE_IVSHMEM的PCIe设备,用来描述共享内存的PCIe设备。再增加一个类型为JAILHOUSE_PCI_TYPE_DEVICE的PCIe设备,来描述要从host主机上隔离的PCIe网卡设备。其中一个重要的配置项是要隔离的PCIe网卡设备的BDF,可以在host主机Linux上通过lspci命令获取。
[0061] S7:在hypervisor中增加ECAM空间地址转换表,以便将none root客户机Linux访问的第一个PCIe设备的ECAM地址转换成主机上真实的PCIe设备的ECAM地址。
[0062] 在本步骤中,通过host主机上PCIe拓扑结构可以看出(如图2所示),PCIe网卡没有挂接在BUS 0下,而是挂接在PCIe桥下。由于本实施例只隔离PCIe设备,没有隔离PCIe桥,所以在none root客户机Linux在物理PCIe控制器枚举设备时只能从BUS 0上发现设备。这样就需要在hypervisor实现一个物理PCIe设备的ECAM空间地址转换表(如图1所示),将none root客户机Linux访问的第一个物理PCIe设备的ECAM地址转换成host主机上真实的PCIe设备的ECAM地址,主要是PCIe设备ECAM地址偏移不一样。通过配置的隔离设备的BDF就可以得到该偏移。这样在none root客户机Linux就可以扫描到要隔离PCIe网卡设备,得到none root客户机上物理PCIe拓扑结构(如图2 PCI domain 0所示)。
[0063] S8:修改网卡驱动,使得网卡工作在INTx中断模式,并将修改后的网卡驱动放入none root客户机Linux系统的文件系统中。
[0064] 修改i210网卡中断工作模式。PCIe设备通过配置空间的MSI/MSI‑X的Capability寄存器控制是否使能MSI/MSI‑X中断,在i210网卡驱动中关闭MSI/MSI‑X Capability的使能位,则网卡工作在INTx中断模式。重新编译网卡驱动,并放到none root客户机中。
[0065] S9:将主机的Linux系统的设备树文件中的INTx中断的INTA中断号配置信息配置到none root客户机配置文件中。
[0066] 需要说明的是,通过armv8的中断虚拟化机制,armv8使用gic中断控制器,使能中断虚拟化后,所有物理中断被路由到hypervisor中,然后通过注入虚拟中断的方式,将中断转发到相应的CPU,实现将PCIe网卡使用的INTx中断隔离到none root客户机中。通过host主机Linux设备树文件可以看到PCIe设备使用的INTx中断,默认使用INTA中断号,将该中断号配置到none root客户机配置文件中。这样,none root客户机启动时,就可以收到PCIe设备的INTx中断。
[0067] S10:通过none root客户机Linux设备树文件配置的虚拟PCIe控制器,将虚拟PCIe设备使用的INTx中断的INTA中断号配置到none root客户机配置文件中。同样使用armv8的中断虚拟化机制,将虚拟PCIe设备的INTx中断隔离到none root客户机中。
[0068] S11:通过“1:1”的方式将主机预留的物理内存映射到none root客户机,作为none root客户机系统内存。这样none root客户机Linux网卡驱动申请DMA内存的物理地址为host主机物理内存地址,这样PCIe 网卡发起DMA操作就可以直接访问系统物理内存。
[0069] S12:启动none root客户机,Linux首先扫描到PCIe网卡设备,加载使用INTx中断的网卡驱动,这样网卡就可以正常工作,至此成功将主机上的PCIe网卡隔离到none root客户机上。
[0070] 另外,hypervisor中模拟了虚拟PCIe配置空间,当none root客户机Linux在虚拟PCIe控制器枚举设备时,就可以BUS 0上发现配置的共享内存的虚拟PCIe设备(如果图2 PCI domain 1所示)。利用jailhouse的共享内存通信模型(ivshmem),使用虚拟PCIe设备实现不同客户机间使用共享内存通信。
[0071] 这样,在none root客户机上既实现了虚拟PCIe设备,又实现物理PCIe设备。既可以利用PCIe物理网卡向远端传输大量数据,又可利用PCIe虚拟设备实现共享内存与其它客户机传输大量数据。
[0072] 显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。