一种虚拟化方法和装置与流程

文档序号:21407549发布日期:2020-07-07 14:41阅读:347来源:国知局
一种虚拟化方法和装置与流程

本发明实施例涉及但不限于计算机领域,尤指一种虚拟化方法和装置。



背景技术:

固态盘(ssd,solidstatedrives)是用固态电子存储芯片阵列而制成的硬盘,目前大部分基于flash芯片作为存储介质。与常规机械硬盘相比,ssd具有快速读写、质量轻、能耗低、防震抗摔以及体积小等优点。已经在服务器、个人计算等领域得到了越来乐队的应用。

非易失内存主机控制器接口规范(nvme,non-volatilememoryexpress)是一种存储设备接口规范,可以充分利用外部设备高速互连标准(pci-e,peripheralcomponentinterconnectexpress)通道的低延时以及并行性的特点,简化了固态盘的输入输出(io,inputoutput)访问路径。相比串行连接小型计算机系统接口(scsi,smallcomputersysteminterface)(sas,serialattachedscsi)或串行高级连接技术(sata,serialadvancedtechnologyattachment)接口规范,nvme可以提供更低的延时,更高的传输性能,以及更低的功耗控制。nvme适配了ssd的高速io特点,极大提升了固态盘的读写性能,在高端ssd设备中得到广泛应用。

目前许多云主机都基于nvmessd提供虚拟机存储支持,nvmessd的普通虚拟化方法如图1所示。虚拟机通过前端驱动,与在快速模拟器(qemu,quickemulator)中的后端驱动进行读写请求,后端驱动运行在主机上下文环境中,并通过虚拟文件系统(vfs,virtualfilesystem)接口,向主机中的nvme驱动进行读写请求。在nvme接口规范中,nvme设备提供管理和io两类队列,管理队列只有一组,io队列有多组。每组队列由提交和回应两个循环列表组成,用于nvme设备接收命令和放置执行信息。

如图1所示,在虚拟机进行io读写时,前端驱动会将读写请求发送到后端驱动;后端驱动接收到读写请求后,将读写请求转换为主机(host)(也称为物理机)的vfs读写操作;host的操作系统(os,operatingsystem)内核根据vfs读写操作调用nvmessd驱动的读写命令,使得nvme驱动产生io读写指令放入nvme设备的io队列的提交队列中;nvme设备执行io读写指令后,将结果放入io队列的回应队列,并产生消息中断(msi,messagesignaledinterrupts)通知主机;主机再通过nvme驱动处理,通过vfs的封装,将结果返回给后端驱动,在通过虚拟化机制,返回前端去的,完成虚拟机或客户机(guest)的io读写操作。

可以看出,普通的nvme虚拟化方法中,一次io操作需要涉及到两次前后端交互,并涉及到数据在前后端中的多次拷贝,以及host中的vfs到nvme的长io栈,效率较低,不利于geust充分利用nvmessd设备的高io特性。



技术实现要素:

本发明实施例提供了一种虚拟化方法和装置,能够提升io效率。

本发明实施例提供了一种虚拟化方法,包括:

当虚拟机的应用发出预定请求时,虚拟机的非易失内存主机控制器接口规范—块nvme-blk驱动从虚拟nvme直接内存存取dma内存管理区中分配第一dma内存;其中,第一dma内存包括输入输出io队列的提交队列的第二dma内存和完成队列的第三dma内存;

nvme-blk驱动根据第二dma内存的hpa构建提交队列项,通知主机的nvme设备处理所述预定请求;

nvme-blk驱动读取完成队列中的回应信息。

本发明实施例提供了一种虚拟化方法,包括:

主机的非易失内存主机控制器接口规范nvme设备获知有预定请求需要处理时,进行预定请求对应的操作,将回应信息放入完成队列中。

本发明实施例提供了一种虚拟化装置,包括:

非易失内存主机控制器接口规范—块nvme-blk驱动,用于当虚拟机的应用发出预定请求时,从虚拟nvmedma内存管理区中分配第一dma内存;其中,第一dma内存包括输入输出io队列的提交队列的第二dma内存和完成队列的第三dma内存;根据第二dma内存的hpa构建提交队列项,通知nvme设备处理所述预定请求;读取完成队列中的回应信息。

本发明实施例提供了一种虚拟化装置,包括:

非易失内存主机控制器接口规范nvme设备,用于获知有预定请求需要处理时,进行预定请求对应的操作,将回应信息放入完成队列中。

本发明实施例提供了一种虚拟化装置,包括处理器和计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令被所述处理器执行时,实现上述任一种虚拟化方法的步骤。

本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一种虚拟化方法的步骤。

本发明实施例包括:当虚拟机的应用发出预定请求时,虚拟机的nvme-blk驱动从虚拟nvme直接内存存取(dma,directmemoryaccess)内存管理区中分配第一dma内存;其中,第一dma内存包括输入输出io队列的提交队列的第二dma内存和完成队列的第三dma内存;nvme-blk驱动根据第二dma内存的hpa构建提交队列项,通知主机的nvme设备处理所述预定请求;nvme-blk驱动读取完成队列中的回应信息。本发明实施例通过nvme-blk驱动实现对nvme设备的直接访问,减少了主机的参与,从而实现虚拟机的高效io操作,并且不需要占用cpu,降低了虚拟化的损耗,且无需支持特定的nvme设备硬件,具有较好的通用性。

本发明实施例的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明实施例而了解。本发明实施例的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

附图用来提供对本发明实施例技术方案的进一步理解,并且构成说明书的一部分,与本发明实施例的实施例一起用于解释本发明实施例的技术方案,并不构成对本发明实施例技术方案的限制。

图1为相关技术nvmessd的普通虚拟化方法的示意图;

图2为本发明一个实施例提出的虚拟化方法的流程图;

图3为本发明实施例门铃(doorbell)区域与io队列映射示意图;

图4为本发明实施例虚拟化方法的示意图;

图5为本发明另一个实施例提出的虚拟化方法的流程图;

图6为本发明实施例虚拟化装置的结构组成示意图。

具体实施方式

下文中将结合附图对本发明实施例进行详细说明。需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互任意组合。

在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

参见图2,本发明一个实施例提出了一种虚拟化方法,包括:

步骤200、当虚拟机的应用发出预定请求时,虚拟机的nvme-块(blk,block)驱动从虚拟nvmedma内存管理区中分配第一dma内存;其中,第一dma内存包括输入输出(io,inputoutput)队列的提交队列(sq,summitqueue)的第二dma内存和完成队列(cq,completequeue)的第三dma内存。

步骤201、nvme-blk驱动根据第二dma内存的hpa构建sq项,通知主机的nvme设备处理所述预定请求。

在本发明实施例中,sq项还包括:nvme设备的扇区号和优先级等信息。

其中,第二dma内存为源地址,扇区号为目的地址,也就是说,通过sq项告知nvme设备将数据从第二dma内存写入到扇区号内。

在本发明实施例中,nvme设备可以是ssd。

在本发明实施例中可以采用以下任一种方法通知主机的nvme设备处理预定请求。

方法一、nvme-blk驱动向所述主机发送写门铃(doorbell)请求;其中,所述写doorbell请求包括提交队列项信息,即提交队列项下标;所述主机将所述提交队列项信息写入所述nvme设备的寄存器的doorbell区域中,所述io队列标识对应的字段中。

该方法中,nvme-blk驱动可以基于通用的虚拟化的内存地址陷入机制,或者cpu的hypercall指令向主机的hypervisor发送写doorbell请求。

该方法中,doorbell区域是按照io队列标识进行排列的,主机基于io队列标识和doorbell区域的起始地址,即可获知io队列标识对应的字段。

方法二、nvme-blk驱动预先保存所述io队列标识和所述nvme设备的寄存器中的门铃doorbell区域的字段之间的第二对应关系;nvme-blk驱动将提交队列项信息写入所述nvme设备的寄存器的门铃doorbell区域中,所述io队列标识对应的字段中。

该方法中,如图3所示,nvme设备的doorbell区域是连续区域,可以映射到虚拟机中,每个io队列对应其中的一个16比特(比特)的字段,可以通过在nvme-blk驱动初始化时完成对doorbell区域的映射操作,即保存第二对应关系。

采用第二种方式通过nvme-blk驱动直接将提交队列项信息写入nvme设备的寄存器的doorbell区域中io队列标识对应的字段中,而不需要通过主机来写入,进一步提高了io效率。

步骤202、nvme-blk驱动读取完成队列中的回应信息。

在本发明实施例中,nvme-blk驱动可以采用以下任一种方法读取cq中的回应信息。

方法一、nvme-blk驱动轮询所述完成队列得到回应信息。

方法二、主机将io队列标识和所述第一物理虚拟机内存的hpa之间的第一对应关系发送给nvme-blk驱动之前,主机为所述io队列分配消息中断(msi,messagesignalinterrupts)中断号,将所述msi中断号设置成所述虚拟机直接处理;主机将io队列标识和所述第一物理虚拟机内存的hpa之间的第一对应关系发送给nvme-blk驱动时,还将所述msi中断号发送给所述nvme-blk驱动;主机进行预定请求对应的操作后,主机根据所述msi中断号触发中断;nvme-blk驱动在msi中断号对应中断触发时读取所述完成队列中的回应信息。

该方法中,nvme-blk驱动可以在虚拟机中设置对应的中断处理程序,在中断触发时,中断顶部处理程序读取完成队列信息,并释放cq队列,触发中断底部处理程序;当预定请求为读请求时,中断底部处理程序从完成队列信息中获取出第三dma内存的位置,完成读数据拷贝,以及dma内存释放。

在linux中,中断底部处理程序将触发虚拟机os的io协议栈完成动作,将对应的操作返回信息返回给读写请求者。

该方法中,将msi中断号设置成虚拟机直接处理在x86处理器中可以基于直接io虚拟化技术(vt-d,virtualizationtechnologyfordirectedi/o)postinterrupt的机制实现,即将msi中断号设置到虚拟机的x86处理器的vt-dpostinterrupt虚拟通用中断控制器(vmcs,virtualgenericinterrupt)特性区中;在arm处理器中可以基于vgsi机制完成;当虚拟机独占主机的cpu时,可以基于x86处理器在虚拟机控制结构(vmcs,virtual-machinecontrolstructure)中设置中断(interrupt)非退出方式实现。

在本发明实施例中,预定请求包括以下至少之一:读请求、写请求。

当预定请求为写请求时,步骤200和步骤201之间还包括:nvme-blk驱动将所写的数据拷贝到所述第二dma内存中。

当预定请求为读请求时,回应信息包括第三dma内存的hpa,nvme-blk驱动根据回应信息从第三dma内存中读取数据,将读取的数据拷贝到应用的读缓存中,释放第三dma内存。

在本发明另一个实施例中,该方法之前还包括:

所述nvme-blk驱动向所述虚拟机申请连续的第一物理虚拟机内存,将所述第一物理虚拟机内存的虚拟机物理地址(gpa,guestphysicaladdress)传输给主机;其中,可以将第一物理虚拟机内存的起始位置的gpa传输给主机;可以将第一物理虚拟机内存的gpa传输给主机的qemu;

nvme-blk驱动接收到io队列标识和第一物理虚拟机内存的hpa之间的第一对应关系;

所述nvme-blk驱动向所述虚拟机申请连续的第二物理虚拟机内存,将所述第二物理虚拟机内存设置成dma访问方法,将所述第二物理虚拟机内存的虚拟机物理地址gpa传输给主机;其中,可以将第二物理虚拟机内存的起始位置的gpa传输给主机;可以将第二物理虚拟机内存的gpa传输给主机的qemu;

所述nvme-blk驱动根据接收到的第二物理虚拟机内存的hpa创建所述虚拟nvmedma内存管理区。

在本发明实施例中,如图4所示,可以在nvme-blk驱动创建时,向虚拟机申请连续的第一物理虚拟机内存和第二物理虚拟机内存。

其中,nvme-blk驱动可以在虚拟机操作系统(os,operatingsystem)初始化时创建,它注册为虚拟机的块(blk,block)驱动,完成基于blk的随机读写操作。

在本发明实施例中,gpa地址从虚拟机到主机的传递方式包括以下任一种:

在内核虚拟机(kvm,kernel-basedvirtualmachine)下可以基于虚拟输入输出(virtio)通道传递;

基于qemu的共享内存区传递;

基于x86vt技术的hypercall指令参数传递。

其中,virtio通道可以是virtio控制通道,该virtio通道可以在创建nvme-blk驱动时,由nvme-blk驱动与主机的qemu建立。

本发明实施例通过nvme-blk驱动实现对nvme设备的直接访问,减少了主机的参与,从而实现虚拟机的高效io操作,并且不需要占用cpu,降低了虚拟化的损耗,且无需支持特定的nvme设备硬件,具有较好的通用性。

参见图5,本发明另一个实施例提出了一种虚拟化方法,包括:

步骤500、主机的nvme设备获知有预定请求需要处理时,进行预定请求对应的操作,将回应信息放入完成队列中。

在本发明实施例中,当nvme设备的寄存器的doorbell区域中,所述io队列标识对应的字段有提交队列项信息写入时,nvme设备获知有预定请求需要处理。

其中,可以由主机或nvme-blk驱动将提交队列项信息写入nvme设备的寄存器的doorbell区域中,所述io队列标识对应的字段中。

其中,当由nvme-blk驱动将提交队列项信息写入nvme设备的寄存器的doorbell区域中,所述io队列标识对应的字段中时,nvme-blk驱动需要预先保存io队列标识和nvme设备的寄存器中doorbell区域的字段之间的第二对应关系。

其中,当由主机将提交队列项信息写入nvme设备的寄存器的doorbell区域中,所述io队列标识对应的字段中时,nvme-blk驱动向主机发送写doorbell请求;其中,写doorbell请求包括提交队列信息;主机将提交队列项信息写入所述nvme设备的寄存器的doorbell区域中,所述io队列标识对应的字段中。

在本发明实施例中,预定请求为写请求或读请求;

当预定请求为写请求时,进行预定请求对应的操作包括:

nvme设备根据提交队列项信息将第二dma内存中的数据写入到nvme设备的对应扇区中。

当预定请求为读请求时,进行预定请求对应的操作包括:

nvme设备根据所述提交队列项信息从nvme设备的对应扇区中读取数据,将读取的数据拷贝到第三dma内存中。

在本发明另一个实施例中,该方法之前还包括:

所述主机将接收到的第一物理虚拟机内存的gpa转换成物理机物理地址(hpa,hostphysicaladdress),其中,所述设备命令包括所述第一物理虚拟机内存的hpa;其中,主机的qemu调用linux内核接口将gpa转换成hpa,并设置nocache属性,qemu将hpa发送给主机,主机将hpa发送给nvme-blk驱动;

所述主机根据所述第一物理虚拟机内存的hpa创建io队列,将io队列标识和所述第一物理虚拟机内存的hpa之间的第一对应关系发送给nvme-blk驱动;其中,主机的qemu通过调用nvme设备控制命令的方式来创建io队列;

所述主机将接收到的第二物理虚拟机内存的gpa转换成物理机物理地址hpa,将所述第二物理虚拟机内存设置成主机dma访问模式,将所述第二物理虚拟机内存的hpa发送给所述nvme-blk驱动;其中,主机的qemu调用linux内核接口将gpa转换成hpa,并设置nocache属性,qemu将hpa发送给主机,主机将hpa发送给nvme-blk驱动。

在本发明另一个实施例中,主机将io队列标识和所述第一物理虚拟机内存的hpa之间的第一对应关系发送给nvme-blk驱动之前,该方法还包括:所述主机为所述io队列分配消息中断msi中断号,将所述msi中断号设置成所述虚拟机直接处理;

所述主机将io队列标识和所述第一物理虚拟机内存的hpa之间的第一对应关系发送给nvme-blk驱动时,还将所述msi中断号发送给所述nvme-blk驱动;

所述主机进行预定请求对应的操作后,该方法还包括:

所述主机根据所述msi中断号触发中断。

在本发明实施例中,主机可以基于qemu的共享内存区,或virtio通道向虚拟机传递hpa或io队列标识(id)或msi中断号。

其中,virtio通道可以是virtio控制通道,该virtio通道可以在创建nvme-blk驱动时,由nvme-blk驱动与主机的qemu建立。

参见图6,本发明另一个实施例提出了一种虚拟化装置,包括:

nvme-blk驱动601,用于当虚拟机的应用发出预定请求时,从虚拟nvmedma内存管理区中分配第一dma内存;其中,第一dma内存包括输入输出io队列的提交队列的第二dma内存和完成队列的第三dma内存;根据第二dma内存的hpa构建提交队列项,通知主机的nvme设备处理所述预定请求;读取完成队列中的回应信息。

在本发明实施例中,所述预定请求为写请求;所述nvme-blk驱动601还用于:将所写的数据拷贝到所述第二dma内存中。

在本发明实施例中,所述预定请求为读请求;所述nvme-blk驱动601还用于:根据所述完成队列信息从第三dma内存中读取所读取的数据,将读取的数据拷贝到应用的读缓存中,释放第三dma内存。

在本发明实施例中,所述nvme-blk驱动601还用于:

向所述虚拟机申请连续的第一物理虚拟机内存,将所述第一物理虚拟机内存的虚拟机物理地址gpa传输给主机;接收到io队列标识和第一物理虚拟机内存的hpa之间的第一对应关系;向所述虚拟机申请连续的第二物理虚拟机内存,将所述第二物理虚拟机内存设置成dma访问方法,将所述第二物理虚拟机内存的虚拟机物理地址gpa传输给主机;根据接收到的第二物理虚拟机内存的hpa创建所述虚拟nvmedma内存管理区。

在本发明实施例中,所述nvme-blk驱动601还用于:保存所述io队列标识和所述nvme设备的寄存器中的门铃doorbell区域的字段之间的第二对应关系;将提交队列项信息写入所述nvme设备的寄存器的门铃doorbell区域中,所述io队列标识对应字段中。

在本发明实施例中,nvme-blk驱动601具体用于采用以下方式实现通知主机的nvme设备处理预定请求:

向所述主机发送写门铃doorbell请求;其中,所述写doorbell请求包括提交队列项信息,即提交队列项下标。

在本发明实施例中,nvme-blk驱动601还用于:

接收msi中断号;在msi中断号对应的中断触发时读取所述完成队列中的回应信息。

在本发明实施例中,所述nvme-blk驱动501具体用于采用以下方式实现读取完成队列中的回应信息:轮询所述完成队列得到回应信息。

上述虚拟化装置的具体实现方式与前述实施例的虚拟化方法相同,这里不再赘述。

本发明另一个实施例提出了一种虚拟化装置(如主机),包括:

nvme设备602,用于获知有预定请求需要处理时,进行预定请求对应的操作,将回应信息放入完成队列中。

在本发明实施例中,预定请求为写请求,nvme设备602具体用于采用以下方式实现进行预定请求对应的操作:

根据提交队列项信息将第二dma内存中的数据写入到nvme设备的对应扇区中。

在本发明实施例中,预定请求为读请求,nvme设备602具体用于采用以下方式实现进行预定请求对应的操作:

根据提交队列项信息从nvme设备的对应扇区中读取数据,将读取的数据拷贝到第三dma内存中。

在本发明实施例中,还包括:控制器603,用于将接收到的第一物理虚拟机内存的gpa转换成物理机物理地址hpa;根据所述第一物理虚拟机内存的hpa创建io队列,将io队列标识和所述第一物理虚拟机内存的hpa之间的第一对应关系发送给nvme-blk驱动;

将接收到的第二物理虚拟机内存的gpa转换成物理机物理地址hpa,将所述第二物理虚拟机内存设置成主机dma访问模式,将所述第二物理虚拟机内存的hpa发送给所述nvme-blk驱动。

在本发明实施例中,还包括:控制器603,用于为所述io队列分配消息中断msi中断号,将所述msi中断号设置成所述虚拟机直接处理;将所述msi中断号发送给所述nvme-blk驱动;进行预定请求对应的操作后,根据所述msi中断号触发中断;

在本发明实施例中,还包括:控制器603,用于将所述提交队列项信息写入所述nvme设备的寄存器的doorbell区域中,io队列标识对应的字段中。

上述虚拟化装置的具体实现方式与前述实施例的虚拟化方法相同,这里不再赘述。

本发明另一个实施例提出了一种虚拟化装置,包括处理器和计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令被所述处理器执行时,实现上述任一种虚拟化方法的步骤。

本发明另一个实施例提出了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一种虚拟化方法的步骤。

本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。

虽然本发明实施例所揭露的实施方式如上,但所述的内容仅为便于理解本发明实施例而采用的实施方式,并非用以限定本发明实施例。任何本发明实施例所属领域内的技术人员,在不脱离本发明实施例所揭露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本发明实施例的专利保护范围,仍须以所附的权利要求书所界定的范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1