一种主机与虚拟机共享内存方法、装置、设备及介质转让专利

申请号 : CN202210057387.9

文献号 : CN114077480B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张伟韬傅唯威邹懋陈飞王鲲

申请人 : 维塔科技(北京)有限公司

摘要 :

本发明公开了一种主机与虚拟机共享内存方法、装置、设备及介质。所述方法包括:建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。该方法基于建立的通信通道能够进行共享内存地址的传输和转换,并将宿主机物理地址映射到服务端进程的虚拟地址空间,能够有效避免现有技术中存在的诸多问题。

权利要求 :

1.一种主机与虚拟机共享内存方法,其特征在于,所述方法包括:建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;

在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;

将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间;

其中,所述通信通道为Socket通道,相应的,所述在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换,包括:在所述Socket通道内,通过vhost‑vsock内核模块完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换。

2.根据权利要求1所述的方法,其特征在于,所述虚拟机的客户端进程为客户端程序,所述主机的服务端进程为服务端程序,相应的,建立所述虚拟机的客户端进程与主机的服务端进程之间的通信通道,包括:通过vhost‑vsock内核模块建立所述客户端程序与所述服务端程序之间的Socket通道。

3.根据权利要求2所述的方法,其特征在于,所述通过vhost‑vsock内核模块建立所述客户端程序与所述服务端程序之间的Socket通道,包括:通过所述服务端程序建立vsock服务端;

为所述vsock服务端绑定cid地址;

对绑定cid地址的vsock端口进行监听;

启动所述客户端程序,通过所述vhost‑vsock内核模块连接所述绑定cid地址的vsock端口,以完成所述客户端程序与所述服务端程序之间Socket通道的建立。

4.根据权利要求1所述的方法,其特征在于,所述在所述Socket通道内,通过所述vhost‑vsock内核模块完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换,包括:

通过所述Socket通道传输虚拟内存分配报文至服务端程序,所述报文包括共享内存页面的大小;

通过客户端程序分配多个页对齐的匿名页作为共享内存页面;

通过所述客户端程序的地址转换接口,得到所述共享内存页面的虚拟机物理地址;

通过所述Socket通道按照分配顺序传输所述共享内存页面的虚拟机物理地址;

通过vhost‑vsock内核模块截获包含所述虚拟机物理地址的第一报文;

接收到所述第一报文后,通过所述vhost‑vsock内核模块解析所述第一报文中包含的虚拟机物理地址,并将所述虚拟机物理地址转换为宿主机物理地址。

5.根据权利要求1所述的方法,其特征在于,所述将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间,包括:通过地址映射内核模块将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。

6.根据权利要求5所述的方法,其特征在于,所述通过地址映射内核模块将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间,包括:通过所述服务端进程获取包含宿主机物理地址的第二报文;

通过所述地址映射内核模块将所述第二报文中的宿主机物理地址映射到所述服务端进程的虚拟地址空间。

7.一种主机与虚拟机共享内存装置,其特征在于,所述装置包括:建立模块,用于建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;

转换模块,用于在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;

映射模块,用于将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间;

其中,所述通信通道为Socket通道,相应的,转换模块具体用于:在所述Socket通道内,通过vhost‑vsock内核模块完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换。

8.一种计算机设备,其特征在于,所述计算机设备中的主机上安装有虚拟机,所述虚拟机中包括客户端程序,所述主机中包括服务端程序,所述主机内部署vhost‑vsock内核模块以及地址映射内核模块;

所述计算机设备还包括:

一个或多个处理器;

存储装置,用于存储一个或多个程序;

所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器用于执行权利要求1‑6任一项所述的主机与虚拟机共享内存方法。

9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1‑6任一项所述的主机与虚拟机共享内存方法。

说明书 :

一种主机与虚拟机共享内存方法、装置、设备及介质

技术领域

[0001] 本发明实施例涉及虚拟机技术领域,尤其涉及一种主机与虚拟机共享内存方法、装置、设备及介质。

背景技术

[0002] 目前,高性能分布式计算和存储使用越发广泛,结合云计算的成熟发展,虚拟云主机成为广大服务云服务商的首选。对于大量的客户端/服务器模型的应用,主机上的服务程
序管理真实的物理设备,并为部署在虚拟机中的应用提供虚拟服务,这类服务涉及到虚拟
机与主机间的高性能数据交互,通常使用共享内存来完成。
[0003] 现有技术中,虚拟机和主机之间共享内存的主流的解决方案包括两种:方案一是基于virtio协议的传输通道实现虚拟机和主机之间共享内存,方案二是基于ivshmem,即宿
主机与虚拟机之间或多个虚拟机之间共享内存的特殊设备,实现虚拟机和主机之间共享内
存。
[0004] 在方案一中I/O虚拟化的关键是为主机和虚拟机之间建立I/O请求和数据的传输通道,通过在虚拟机中呈现出一个virtio‑pci设备作为虚拟磁盘或虚拟网卡,而在主机中
使用用户态的virtio、vhost‑user或内核态的vhost模块来提供真实的I/O服务,实现I/O虚
拟化。根据协议,虚拟机和主机之间会共享一段固定大小的内存,称为vring,用于传输I/O
请求和数据。但是,方案一无法直接用于共享内存服务,因为该段内存大小固定,无法灵活
地进行分配和回收。且只能使用固定的协议来传输I/O信息,无法直接给虚拟机或主机任意
访问。
[0005] 方案二中的ivshmem在虚拟机内部表现为PCI设备,共享的内存区域则以PCI BAR的形式存在,在构建宿主机和虚拟机之间共享内存,虽然ivshmem这一技术被广泛的使用,
但是仍然存在诸多缺点。首先,ivshmem消耗宿主机的内存空间来做数据传输,成本计算困
难,在公有云场景中,用户往往按照虚拟机的资源配置进行付费,而ivshmem消耗的宿主机
的内存空间,在虚拟机中无法体现,这样就出现了成本计算的困难;其次,ivshmem的大小受
限,在大数据量场景下,虚拟机需要大块连续的内存,此情况下ivshmem无法满足用户的需
求;此外,ivshmem在虚拟机内部表现为PCI设备,由于PCI插槽数量有限,这就限制了
ivshmem的数量以及可能导致和其他PCI设备之间的竞争。

发明内容

[0006] 本发明实施例提供了一种主机与虚拟机共享内存方法、装置、设备及介质,该方法基于建立的通信通道能够进行共享内存地址的传输和转换,并将宿主机物理地址映射到服
务端进程的虚拟地址空间,能够有效避免现有技术中存在的诸多问题。
[0007] 第一方面,本发明实施例提供了一种主机与虚拟机共享内存方法,包括:
[0008] 建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;
[0009] 在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;
[0010] 将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0011] 第二方面,本发明实施例还提供了一种主机与虚拟机共享内存装置,包括:
[0012] 建立模块,用于建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;
[0013] 转换模块,用于在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;
[0014] 映射模块,用于将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0015] 第三方面,本发明实施例还提供了一种计算机设备,所述计算机设备中的主机上安装有虚拟机,所述虚拟机中包括客户端程序,所述主机中包括服务端程序,所述主机内部
署vhost‑vsock内核模块以及地址映射内核模块;
[0016] 所述计算机设备还包括:
[0017] 一个或多个处理器;
[0018] 存储装置,用于存储一个或多个程序;
[0019] 所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器用于执行本发明任意实施例所述的主机与虚拟机共享内存方法。
[0020] 第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的主机与虚拟机共享内存方
法。
[0021] 本发明实施例提供了一种主机与虚拟机共享内存方法、装置、设备及介质,首先建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿
主机;然后在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的
转换;最后将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。上述方法基于
建立的通信通道能够进行共享内存地址的传输和转换,并将宿主机物理地址映射到服务端
进程的虚拟地址空间,能够有效避免现有技术中共享内存分配、使用、释放不灵活的问题、
由主机分配物理内存共享给虚拟机导致的额外资源占用以及计费困难的问题,以及使用
ivshmem共享内存对虚拟机PCI插槽的占用和大小受限问题。

附图说明

[0022] 图1为本发明实施例一所提供的一种主机与虚拟机共享内存方法的流程示意图;
[0023] 图2为本发明实施例二所提供的一种主机与虚拟机共享内存方法中主机的软件结构示意图;
[0024] 图3为本发明实施例三所提供的一种主机与虚拟机共享内存装置的结构示意图;
[0025] 图4为本发明实施例四所提供的一种计算机设备的结构示意图。

具体实施方式

[0026] 下面将参照附图更详细地描述本发明的实施例。虽然附图中显示了本发明的某些实施例,然而应当理解的是,本发明可以通过各种形式来实现,而且不应该被解释为限于这
里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本发明。应当理解的
是,本发明的附图及实施例仅用于示例性作用,并非用于限制本发明的保护范围。
[0027] 应当理解,本发明的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本发
明的范围在此方面不受限制。
[0028] 本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示
“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定
义将在下文描述中给出。
[0029] 需要注意,本发明中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
[0030] 需要注意,本发明中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
[0031] 本发明实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
[0032] 实施例一
[0033] 图1为本发明实施例一所提供的一种主机与虚拟机共享内存方法的流程示意图,该方法可适用于主机与虚拟机之间进程高性能数据交互的情况,该方法可以由主机与虚拟
机共享内存装置来执行,其中该装置可由软件和/或硬件实现,并一般集成在终端设备上,
在本实施例中终端设备包括但不限于计算机设备。
[0034] 如图1所示,本发明实施例一提供的一种主机与虚拟机共享内存方法,包括如下步骤:
[0035] S110、建立虚拟机的客户端进程与主机的服务端进程之间的通信通道。
[0036] 其中,所述主机为所述虚拟机的宿主机。
[0037] 其中,主机是指计算机除去输入输出设备以外的主要机体部分,也是用于放置主板及其他主要部件的控制箱体,通常包括 CPU、内存、主板、光驱、电源、以及其他输入输出
控制器和接口。其中,虚拟机是安装在主机上的,必须在主机上才能运行,在主机上安装虚
拟机后,相对于虚拟机而言,主机即为虚拟机的宿主机。
[0038] 其中,客户端进程可以为用于服务器端进行接口的程序,客户端可以是任意的一台电脑,只要它和服务器端存在连接,并且得到了服务器端的授权,就可以使用服务器端的
服务。在虚拟机中,存在用户使用共享内存功能的用户态client程序即客户端进程。
[0039] 其中,服务端是一种有针对性的服务程序,服务端是为客户端服务的,服务的内容可以包括向客户端提供资源以及保护客户端数据。
[0040] 其中,通信通道可以理解为客户端进程与服务端进程之间进行数据交互的通道。在本实施例中,可以通过标准的socket API建立客户端进程与服务端进程之间的通信通
道,该通信通道可以用于在虚拟机的客户端进程以及主机的服务端进程之间传输控制信号
以及传输共享内存地址,并完成地址转换。
[0041] 在本实施例中,通信通道的建立方式可以为通过vhost‑vsock内核模块建立。
[0042] 进一步的,所述虚拟机的客户端进程为客户端程序,所述主机的服务端进程为服务端程序,所述通信通道为Socket通道,相应的,建立所述虚拟机的客户端进程与主机的服
务端进程之间的通信通道,包括:通过vhost‑vsock内核模块建立所述客户端程序与所述服
务端程序之间的Socket通道。
[0043] 其中,在客户端/服务器通信模式中,Socket是双方通信通道的抽象封装,用户可通过配置Socket的参数并构建Socket来完成双方的连接,并通过此通道进行网络通信。其
中,vhost‑vsock内核模块可以理解为一个代码模块,Vhost‑vsock是一种虚拟机和主机之
间的socket通信方式,类似于标准的TCP/IP协议。
[0044] 在本实施例中,可以通过标准的Socket API建立Socket连接即Socket通道。具体的,Socket连接可以包括:使用标准的socket API通信接口,主机和每个虚拟机拥有一个全
局唯一的cid作为标识,类似于IP地址;通常由主机的服务端进程绑定cid后进行监听,虚拟
机的客户端进程连接主机的服务端进程,后者接收连接,实现三次握手,之后可以通过
Socket通道进行双向的数据交互。
[0045] 进一步的,所述通过vhost‑vsock内核模块建立所述客户端程序与所述服务端程序之间的Socket通道,包括:通过所述服务端程序建立vsock服务端;为所述vsock服务端绑
定cid地址;对绑定cid地址的vsock端口进行监听;启动所述客户端程序,通过所述vhost‑
vsock内核模块连接所述绑定cid地址的vsock端口,以完成所述客户端程序与所述服务端
程序之间Socket通道的建立。
[0046] 其中,vsock服务端可以理解为vsock的服务端。其中,cid地址可以理解为一种端口地址,cid是一种内容标识符,将vsock服务端的端口绑定cid地址后,可以通过cid地址识
别端口,进而可以对端口进行监听。此时,宿主机内的服务端程序处于等待连接状态,直到
虚拟机内的客户端程序启动后,可以通过vhost‑vsock内核模块连接vsock端口,建立
Socket连接。
[0047] S120、在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换。
[0048] 其中,所述共享内存页面可以理解为能够被所述虚拟机和所述宿主机共享的页面。共享内存页面还可以理解为能够被虚拟机以及宿主机同时访问的内存页面,共享内存
页面内可以包括多个页对齐的匿名页面,多个匿名页的数量此处不做具体限制。其中,可以
由虚拟机的客户端进程发起共享内存页面的创建。
[0049] 其中,虚拟机物理地址可以理解为虚拟机的物理地址,宿主机物理地址可以理解为宿主机的物理地址。
[0050] 具体的,在所述通信通道内完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换的方式可以为:在Socket通道内,通过vhost‑vsock内核模块完成共享内存页面的
虚拟机物理地址到宿主机物理地址的转换。
[0051] 在本实施例中,可以在vhost‑vsock内核模块中截获在Socket通道中传输的报文,以完成虚拟机物理地址到宿主机物理地址的转换。
[0052] 具体的,所述在所述Socket通道内,通过所述vhost‑vsock内核模块完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换,包括:通过所述Socket通道传输虚拟内
存分配报文至所述服务端程序,所述报文包括共享内存页面的大小;通过所述客户端程序
分配多个页对齐的匿名页作为共享内存页面;通过所述客户端程序的地址转换接口,得到
所述共享内存页面的虚拟机物理地址;通过所述Socket通道按照分配顺序传输所述共享内
存页面的的虚拟机物理地址;通过vhost‑vsock内核模块截获包含所述虚拟机物理地址的
第一报文;接收到所述第一报文后,通过所述vhost‑vsock内核模块解析所述第一报文中包
含的虚拟机物理地址,并将所述虚拟机物理地址转换为宿主机物理地址。
[0053] 其中,虚拟机内客户端程序可以通过Socket通道发送报文给宿主机内服务端程序,宿主机内服务端程序接收到该报文后可以知晓虚拟机内客户端程序需要分配的共享内
存页面的内存大小。
[0054] 其中,得到共享内存页面的虚拟机物理地址可以理解为得到共享内存页面内所有匿名页面所对应的虚拟机的物理地址。
[0055] 其中,分配顺序可以为客户端程序分配多个匿名页的顺序,虚拟机内客户端程序可以通过Socket通道按照每个匿名页的分配顺序对应传输所有页面的虚拟机物理地址。
[0056] 其中,第一报文可以理解为包含虚拟机物理地址的报文,vhost‑vsock内核模块可以截获包含虚拟机物理地址的报文,并完成虚拟机物理地址到宿主机物理地址的转换。
[0057] S130、将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0058] 在本实施例中,可以通过主机的服务端进程进行映射共享内存页面。
[0059] 在本实施例中,所述将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间包括:通过地址映射内核模块将所述宿主机物理地址映射到所述服务端进程的虚拟地址
空间。
[0060] 其中,地址映射内核模块可以为宿主机内的一个模块,地址映射内核模块可以用于将宿主机物理地址映射到虚拟地址。此处,对通过地址映射内核模块将宿主机物理地址
映射到服务端进程的虚拟地址空间的具体过程不做赘述,该部分非本发明重点关注的内
容。
[0061] 具体的,所述通过地址映射内核模块将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间,包括:通过所述服务端程序获取包含宿主机物理地址的第二报文;通过
所述地址映射内核模块将所述第二报文中的宿主机物理地址映射到所述服务端进程的虚
拟地址空间。
[0062] 其中,第二报文可以理解为包含宿主机物理地址的报文,主机的服务端进程可以获取第二报文,并通过主机内的地址映射内核模块将宿主机物理地址映射到自身虚拟地址
空间。
[0063] 本发明实施例一提供的一种主机与虚拟机共享内存方法,首先建立虚拟机的客户端进程与主机的服务端进程之间的通信通道;然后基于所述通信通道完成共享内存页面的
虚拟机物理地址到宿主机物理地址的转换;最终将所述宿主机物理地址映射到所述虚拟机
的虚拟地址空间。该方法基于建立的通信通道能够进行共享内存地址的传输;通过vhost‑
vsock内核模块完成共享内存地址的转换;通过地址映射内核模块将宿主机物理地址映射
到服务端进程的虚拟地址空间,能够有效避免现有技术中存在的诸多问题。
[0064] 实施例二
[0065] 本发明实施例在上述各实施例的技术方案的基础上,提供了一种具体的实施方式。
[0066] 图2为本发明实施例二所提供的一种主机与虚拟机共享内存方法中主机的软件结构示意图,如图2所示,主机106上安装有虚拟机100,虚拟机100内包括用户端程序101;主机
106中包括服务端程序102以及Socket通道103,主机内还部署了vhost‑vsock内核模块104
以及地址映射内核模块105。
[0067] 在本实施例中,通过标准的socket API可以建立用户端程序101与服务端程序102之间的Socket通道103,Socket通道103可以用于传输控制信号和共享内存地址,并完成地
址转换,Socket通道103通过vhost‑vsock内核模块104建立;共享内存页面107可以由用户
端程序101分配得到,并通过Socket通道103由vhost‑vsock内核模块104在内核态完成GPA
即虚拟机物理地址到HPA即宿主机物理地址的转换;服务端程序102可以通过地址映射内核
模块105将接收到的HPA映射到服务端程序102的虚拟地址空间。
[0068] 在主机即宿主机内部署vhost‑vsock内核模块104以及地址映射内核模块105以后,可以执行主机与虚拟机共享内存方法,该方法包括如下步骤:
[0069] 步骤1、宿主机内的服务端程序102建立vsock服务端,绑定cid地址后监听vsock端口;
[0070] 步骤2、虚拟机内的客户端程序101启动,通过vhost‑vsock内核模块104连接vsock端口,建立Socket通道103;
[0071] 步骤3、客户端程序101通过Socket通道103发送报文给服务端程序102,告知需要分配的虚拟内存的大小即共享内存页面的大小;
[0072] 步骤4、客户端程序101分配页对齐的匿名页作为共享内存页面107,并通过地址转换API得到共享内存页面107的所有页面的GPA;
[0073] 步骤5、客户端程序101通过Socket通道103按顺序传输每个页面的GPA;
[0074] 步骤6、vhost‑vsock内核模块104截获包含GPA的报文,解析GPA并进行GPA到HPA的转换;
[0075] 步骤7、服务端程序102获取包含HPA的报文,通过地址映射内核模块105将HPA映射到自身虚拟地址空间。
[0076] 至此,共享内存页面107可以由客户端程序101以及服务端程序102共享。
[0077] 本发明实施例二所提供的一种主机与虚拟机共享内存方法,该方法弥补了传统的I/O虚拟化使用共享内存方案的灵活性问题,为虚拟机内client‑宿主机内server模型的高
效数据通信提供支持;共享内存由虚拟机按需分配,不会引入额外的宿主机内存占用以及
导致计费困难;共享内存管理灵活,其数量和大小不受外部限制;共享内存建立后,使用方
法与性能传统共享内存相同,不会引入额外的损耗。
[0078] 实施例三
[0079] 图3为本发明实施例三所提供的一种主机与虚拟机共享内存装置的结构示意图,该装置可适用于主机与虚拟机之间进程高性能数据交互的情况,其中该装置可由软件和/
或硬件实现,并一般集成在计算机设备上。
[0080] 如图3所示,该装置包括:建立模块110、转换模块120以及映射模块130。
[0081] 建立模块110,用于建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;
[0082] 转换模块120,用于在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换,所述共享内存页面被所述虚拟机和所述宿主机共享;
[0083] 映射模块130,用于将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0084] 在本实施例中,该装置首先通过建立模块110建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;然后通过转换模块120在所
述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;最后通过
映射模130块将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0085] 本实施例提供了一种主机与虚拟机共享内存装置,该装置基于建立模块、转换模块以及映射模块,能够有效避免现有技术中共享内存分配、使用、释放不灵活的问题、由主
机分配物理内存共享给虚拟机导致的额外资源占用以及计费困难的问题,以及使用
ivshmem共享内存对虚拟机PCI插槽的占用和大小受限问题。
[0086] 进一步的,所述虚拟机的客户端进程为客户端程序,所述主机的服务端进程为服务端程序,所述通信通道为Socket通道,相应的,建立模块110具体用于:通过vhost‑vsock
内核模块建立所述客户端程序与所述服务端程序之间的Socket通道。
[0087] 在上述优化的基础上,所述通过vhost‑vsock内核模块建立所述客户端程序与所述服务端程序之间的Socket通道,包括:通过所述服务端程序建立vsock服务端;为所述
vsock服务端绑定cid地址;对绑定cid地址的vsock端口进行监听;启动所述客户端程序,通
过所述vhost‑vsock内核模块连接所述绑定cid地址的vsock端口,以完成所述客户端程序
与所述服务端程序之间Socket通道的建立。
[0088] 进一步的,转换模块120具体用于:在所述Socket通道内,通过所述vhost‑vsock内核模块完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换。
[0089] 基于上述技术方案,所述在所述Socket通道内,通过所述vhost‑vsock内核模块完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换,包括:通过所述Socket通道
传输虚拟内存分配报文至所述服务端程序,所述报文包括共享内存页面的大小;通过所述
客户端程序分配多个页对齐的匿名页作为共享内存页面;通过所述客户端程序的地址转换
接口,得到所述共享内存页面的虚拟机物理地址;通过所述Socket通道按照分配顺序传输
所述共享内存页面的虚拟机物理地址;通过vhost‑vsock内核模块截获包含所述虚拟机物
理地址的第一报文;接收到所述第一报文后,通过所述vhost‑vsock内核模块解析所述第一
报文中包含的虚拟机物理地址,并将所述虚拟机物理地址转换为宿主机物理地址。
[0090] 进一步的,映射模块130具体用于:通过地址映射内核模块将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0091] 基于上述技术方案,所述通过地址映射内核模块将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间,包括:通过所述服务端进程获取包含宿主机物理地址的第
二报文;通过所述地址映射内核模块将所述第二报文中的宿主机物理地址映射到所述服务
端进程的虚拟地址空间。
[0092] 上述主机与虚拟机共享内存装置可执行本发明任意实施例所提供的主机与虚拟机共享内存方法,具备执行方法相应的功能模块和有益效果。
[0093] 实施例四
[0094] 图4为本发明实施例四所提供的一种计算机设备的结构示意图。如图4所示,本发明实施例四提供的计算机设备包括:一个或多个处理器41和存储装置42;该计算机设备中
的处理器41可以是一个或多个,图4中以一个处理器41为例;存储装置42用于存储一个或多
个程序;所述一个或多个程序被所述一个或多个处理器41执行,使得所述一个或多个处理
器41实现如本发明实施例中任一项所述的主机与虚拟机共享内存方法。
[0095] 所述计算机设备中的主机45,主机45上安装有虚拟机,所述虚拟机中包括客户端程序,主机45中包括服务端程序,主机45内部署vhost‑vsock内核模块以及地址映射内核模
块。
[0096] 所述计算机设备还可以包括:输入装置43和输出装置44。
[0097] 计算机设备中的处理器41、存储装置42、输入装置43、输出装置44以及主机45可以通过总线或其他方式连接,图4中以通过总线连接为例。
[0098] 该计算机设备中的存储装置42作为一种计算机可读存储介质,可用于存储一个或多个程序,所述程序可以是软件程序、计算机可执行程序以及模块,如本发明实施例一或二
所提供的主机与虚拟机共享内存方法对应的程序指令/模块(例如,附图3所示的主机与虚
拟机共享内存装置中的模块,包括:建立模块110、转换模块120以及映射模块130)。处理器
41通过运行存储在存储装置42中的软件程序、指令以及模块,从而执行计算机设备的各种
功能应用以及数据处理,即实现上述方法实施例中的主机与虚拟机共享内存方法。
[0099] 存储装置42可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据计算机设备的使用所创建的数据
等。此外,存储装置42可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至
少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置
42可进一步包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至
设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0100] 输入装置43可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。输出装置44可包括显示屏等显示设备。
[0101] 并且,当上述计算机设备所包括一个或者多个程序被所述一个或者多个处理器41执行时,程序进行如下操作:
[0102] 建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;
[0103] 在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;
[0104] 将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0105] 实施例五
[0106] 本发明实施例五提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时用于执行主机与虚拟机共享内存方法,该方法包括:
[0107] 建立虚拟机的客户端进程与主机的服务端进程之间的通信通道,所述主机为所述虚拟机的宿主机;
[0108] 在所述通信通道内,完成共享内存页面的虚拟机物理地址到宿主机物理地址的转换;
[0109] 将所述宿主机物理地址映射到所述服务端进程的虚拟地址空间。
[0110] 可选的,该程序被处理器执行时还可以用于执行本发明任意实施例所提供的主机与虚拟机共享内存方法。
[0111] 本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读
存储介质例如可以是,但不限于,电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或
者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个
或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(Random Access Memory,
RAM)、只读存储器(Read Only Memory,ROM)、可擦式可编程只读存储器(Erasable 
Programmable Read Only Memory,EPROM)、闪存、光纤、便携式CD‑ROM、光存储器件、磁存储
器件、或者上述的任意合适的组合。计算机可读存储介质可以是任何包含或存储程序的有
形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0112] 计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限
于:电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可
读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于
由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0113] 计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、无线电频率(Radio Frequency,RF)等等,或者上述的任意合适的组合。
[0114] 可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还
包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全
地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在
用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及
远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网
(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通
过因特网连接)。
[0115] 注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、
重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行
了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还
可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。