CN106970821B - 一种kvm虚拟化下处理i/o请求的方法和装置 - Google Patents
一种kvm虚拟化下处理i/o请求的方法和装置 Download PDFInfo
- Publication number
- CN106970821B CN106970821B CN201610019289.0A CN201610019289A CN106970821B CN 106970821 B CN106970821 B CN 106970821B CN 201610019289 A CN201610019289 A CN 201610019289A CN 106970821 B CN106970821 B CN 106970821B
- Authority
- CN
- China
- Prior art keywords
- channel
- request
- virtual machine
- simulation
- eventfd
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/01—Input arrangements or combined input and output arrangements for interaction between user and computer
- G06F3/03—Arrangements for converting the position or the displacement of a member into a coded form
- G06F3/033—Pointing devices displaced or positioned by the user, e.g. mice, trackballs, pens or joysticks; Accessories therefor
- G06F3/038—Control and interface arrangements therefor, e.g. drivers or device-embedded control circuitry
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45579—I/O management, e.g. providing access to device drivers or storage
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例提供了一种KVM虚拟化下处理I/O请求的方法和装置,其中所述方法包括:通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;将所述I/O请求写入对应的I/O通道的缓冲区中;采用所述eventfd通知所述I/O通道对应的用户态进程;在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟,其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。本申请可以在内核态中实现I/O请求的分发,针对单个虚拟机可以支持多个设备模拟进程,提高了I/O模拟的效率。
Description
技术领域
本申请涉及KVM虚拟化的技术领域,特别是涉及一种KVM虚拟化下处理I/O请求的方法和一种KVM虚拟化下处理I/O请求的装置。
背景技术
虚拟机(Virtual Machine)是指通过软件模拟的、具有完整硬件系统功能的,运行在一个完全隔离环境中的完整计算机系统。通过虚拟机软件,可以在一台物理计算机上模拟出一台或多台虚拟的计算机。虚拟机可以像真正的计算机那样进行工作,例如可以安装操作系统、安装应用程序、访问网络资源等等。通常,虚拟机所在的物理计算机称为宿主机(Host),虚拟机自身称为虚拟机(Guest)。
KVM(Kernel-based Virtual Machine)即内核模式的虚拟机的简称,是一个开源的系统虚拟化模块,它使用Linux自身的调度器进行管理,KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD VT技术)。
在现有技术中,在KVM虚拟化中,当虚拟机发生I/O操作时,支持VMX(VirtualMachine eXtensions,是intel实现的x86指令集虚拟化扩展)或者SVM(Secure VirtualMachine,是amd实现的x86指令集的虚拟化扩展)扩展的CPU就会停止执行,退出非根模式,进入根模式执行KVM代码。KVM根据退出的原因得知虚拟机需要进行I/O操作,于是从内核态退出至用户态的QEMU进程。
QEMU进程在初始化的时候映射了一块KVM的空间,KVM在退出前把I/O请求放在其中,QEMU从中拿到I/O请求之后将其分发给相应的I/O模拟设备,I/O模拟设备执行I/O模拟以后,QEMU重新调用IOCTL进入KVM内核态,KVM稍作处理后进入非根模式继续运行vCPU(虚拟处理器)。
然而,发明人在实施上述I/O请求的模拟过程中,发现如下问题:
1、模拟vCPU的时候QEMU通过一个vCPU的IOCTL进入到KVM内核态,发生I/O请求的时候要退出内核态回到QEMU用户态的VCPU线程进行模拟,因此,I/O模拟必须和CPU模拟在同一个进程中,无法支持多个设备模拟进程。
2、KVM已有的基于eventfd的I/O通知机制只能应用于写请求,且对所写数据不关心,只关心所写地址的场景,例如Virtio设备的队列通知寄存器写访问。这种机制不能传递I/O请求访问的实际地址和长度,也无法将读操作得到的数据传递给KVM。
3、如果要在不同线程中实现CPU模拟和设备I/O模拟,现在缺乏一种机制来同步IO模拟线程和VCPU线程。
发明内容
鉴于上述问题,提出了本申请实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种KVM虚拟化下处理I/O请求的方法和相应的一种KVM虚拟化下处理I/O请求的装置。
为了解决上述问题,本申请公开了一种KVM虚拟化下处理I/O请求的方法,所述的方法包括:
通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;
将所述I/O请求写入对应的I/O通道的缓冲区中;
采用所述eventfd通知所述I/O通道对应的用户态进程;
在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟,其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。
优选地,所述在所述通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息的步骤之前,还包括:
采用所述第一设备模拟进程创建虚拟机,获得所述虚拟机的文件描述符;
采用所述第一设备模拟进程,基于所述虚拟机的文件描述符,创建虚拟处理器vCPU,获得所述vCPU的文件描述符;
采用所述第二设备模拟进程,创建eventfd文件描述符;
采用所述第二设备模拟进程,基于所述虚拟机的文件描述符,创建I/O通道,并将所述I/O通道与所述eventfd文件描述符绑定,获得所述I/O通道的文件描述符;
采用所述第二设备模拟进程,对所述eventfd文件描述符进行监听;
采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述用户态进程映射所述I/O通道的缓冲区;
采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述I/O通道绑定I/O地址区间。
优选地,所述I/O请求包括I/O地址,所述通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息的步骤包括:
通过内核虚拟机KVM及Intel VT-d硬件技术拦截虚拟机的vCPU线程发出的I/O请求;
从所述I/O请求中提取对应的I/O地址;
确定所述I/O地址所属的I/O地址区间;
通过所述I/O地址区间确定对应的I/O通道,并获取所述I/O通道对应的I/O通道的信息。
优选地,所述I/O通道的地址区间包括多个I/O模拟设备的地址子区间;
所述在所述用户态进程中,根据所述eventfd确定对应的I/O通道,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟的步骤包括:
在所述用户态进程中,根据所述eventfd确定对应的I/O通道;
从所述对应的I/O通道的缓冲区中获取I/O请求;
依据所述I/O请求中的I/O地址确定对应的I/O模拟设备;
将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟。
优选地,在所述在所述用户态进程中,根据所述eventfd确定对应的I/O通道,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟的步骤之前,还包括:
挂起所述vCPU线程。
优选地,在所述在所述用户态进程中,根据所述eventfd确定对应的I/O通道,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟的步骤之后,还包括:
唤醒所述挂起的vCPU线程。
优选地,所述I/O请求包括读请求,所述将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟的步骤为:
将所述读请求分发至所述I/O模拟设备中,通过所述I/O模拟设备将所述读请求对应的数据写入所述I/O通道的缓冲区中。
优选地,所述方法还包括:
若所述I/O请求为读请求,将所述读请求对应的数据从缓冲区中读出,读入到vCPU结构体中相应的成员变量中;
对所述数据进行对应的模拟处理。
本申请还公开了一种KVM虚拟化下处理I/O请求的装置,其特征在于,所述的装置包括:
I/O通道确定模块,用于通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;
缓冲区写入模块,用于将所述I/O请求写入对应的I/O通道的缓冲区中;
事件通知模块,用于采用所述eventfd通知所述I/O通道对应的用户态进程;
I/O模拟模块,用于在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟,其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。
优选地,所述装置还包括:
虚拟机创建模块,用于采用所述第一设备模拟进程创建虚拟机,获得所述虚拟机的文件描述符;
vCPU创建模块,用于采用所述第一设备模拟进程,基于所述虚拟机的文件描述符,创建虚拟处理器vCPU,获得所述vCPU的文件描述符;
eventfd创建模块,用于采用所述第二设备模拟进程,创建eventfd文件描述符;
I/O通道创建模块,用于采用所述第二设备模拟进程,基于所述虚拟机的文件描述符,创建I/O通道,并将所述I/O通道与所述eventfd文件描述符绑定,获得所述I/O通道的文件描述符;
监听模块,用于采用所述第二设备模拟进程,对所述eventfd文件描述符进行监听;
缓冲区映射模块,用于采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述用户态进程映射所述I/O通道的缓冲区;
地址区间绑定模块,用于采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述I/O通道绑定I/O地址区间。
优选地,所述I/O请求包括I/O地址,所述I/O通道确定模块包括:
I/O请求拦截子模块,用于通过内核虚拟机KVM及Intel VT-d硬件技术拦截虚拟机的vCPU线程发出的I/O请求;
I/O地址提取子模块,用于从所述I/O请求中提取对应的I/O地址;
第一I/O通道确定子模块,用于确定所述I/O地址所属的I/O地址区间,并通过所述I/O地址区间确定对应的I/O通道,并获取所述I/O通道对应的I/O通道的信息。
优选地,所述I/O通道的地址区间包括多个I/O模拟设备的地址子区间;
所述I/O模拟模块包括:
第二I/O通道确定子模块,用于在所述用户态进程中,根据所述eventfd确定对应的I/O通道;
I/O请求读取子模块,用于从所述对应的I/O通道的缓冲区中获取I/O请求;
I/O模拟设备确定子模块,用于依据所述I/O请求中的I/O地址确定对应的I/O模拟设备;
分发子模块,用于将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟。
优选地,所述装置还包括:
挂起模块,用于在采用所述eventfd通知所述I/O通道对应的用户态进程以后,挂起所述vCPU线程。
优选地,所述装置还包括:
唤醒模块,用于在对所述I/O请求执行I/O模拟以后,唤醒所述挂起的vCPU线程。
优选地,所述I/O请求包括读请求,所述分发子模块还用于:
将所述读请求分发至所述I/O模拟设备中,通过所述I/O模拟设备将所述读请求对应的数据写入所述I/O通道的缓冲区中。
优选地,所述装置还包括:
数据读出模块,用于在所述I/O请求为读请求时,将所述读请求对应的数据从缓冲区中读出,读入到vCPU结构体中相应的成员变量中,对所述数据进行对应的模拟处理。
本申请实施例包括以下优点:
在本申请实施例中,可以通过I/O通道来传递I/O请求,当KVM拦截虚拟机发出的I/O请求以后,可以确定该I/O请求对应的I/O通道,并将I/O请求写入对应的I/O通道的缓冲区中,随后通过eventfd通知I/O通道对应的用户态进程,用户态进程监听到eventfd事件通知以后,从该eventfd对应的I/O通道的缓冲区中获取I/O请求,并对该I/O请求执行I/O模拟。本申请可以在内核态中实现I/O请求的分发,针对单个虚拟机可以支持多个设备模拟进程,提高了I/O模拟的效率。
附图说明
图1是本申请的一种KVM虚拟化下分发I/O请求的方法实施例一的步骤流程图;
图2是本申请的一种KVM虚拟化下分发I/O请求的方法实施例二的步骤流程图;
图3是本申请的一种KVM虚拟化下分发I/O请求的方法实施例二中的KVM初始化流程的步骤流程图;
图4是本申请的种KVM虚拟化下处理I/O请求的装置实施例的结构框图。
具体实施方式
为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。
参照图1,示出了本申请的一种KVM虚拟化下分发I/O请求的方法实施例一的步骤流程图,具体可以包括如下步骤:
步骤101,通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;
步骤102,将所述I/O请求写入对应的I/O通道的缓冲区中;
步骤103,采用所述eventfd通知所述I/O通道对应的用户态进程;
步骤104,在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟。
其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。
在本申请实施例中,可以通过I/O通道来传递I/O请求,当KVM拦截虚拟机发出的I/O请求以后,可以确定该I/O请求对应的I/O通道,并将I/O请求写入对应的I/O通道的缓冲区中,随后通过eventfd通知I/O通道对应的用户态进程,用户态进程监听到eventfd事件通知以后,从该eventfd对应的I/O通道的缓冲区中读取I/O请求,并对该I/O请求执行I/O模拟。本申请可以在内核态中实现I/O请求的分发,针对单个虚拟机可以支持多个设备模拟进程,提高了I/O模拟的效率。
参照图2,示出了本申请的一种KVM虚拟化下处理I/O请求的方法实施例二的步骤流程图。其中,KVM(Kernel-based Virtual Machine,内核模式的虚拟机)是一个基于Linux环境的开源虚拟化解决方案。KVM的思想是在Linux内核的基础上添加虚拟机管理模块,重用Linux内核中已经完善的进程调度、内存管理、I/O管理等部分,使之成为一个可以支持运行虚拟机的超级管理程序Hypervisor。
KVM是基于硬件辅助虚拟化技术(例如:Intel的VT-x或者AMD-V)的全虚拟化解决方案,虚拟机操作系统能够不经过修改直接在KVM的虚拟机中运行,每一台虚拟机能够享有独立的虚拟硬件资源:网卡、磁盘、图形适配器等。
KVM可以作为单独的模块编译进内核中,也可以作为内核模块在Linux系统启动完成之后加载。
KVM的API是通过/dev/kvm设备进行访问的。/dev/kvm是一个字符型设备,其可以使用常见的系统调用如open、close、IOCTL等指令进行操作。因为KVM的字符型设备的实现函数中,没有包含write、read等操作,所以所有对KVM的操作都是通过IOCTL发送相应的控制字实现的。
KVM所提供的用户空间API从功能上划分,可以分为三种类型,分别为system指令、VM指令以及vCPU指令。其中,system指令针对虚拟化系统的全局性参数设置和用于虚拟机创建等控制操作;VM指令针对具体的VM虚拟机进行控制,如进行内存设置、创建vCPU等;vCPU指令针对具体的vCPU进行参数设置(MRU寄存器读写、中断控制等)。
在发明实施例中,可以通过不同的用户态模拟器来控制用户空间,从而可以在不同的用户态进程中模拟同一台虚拟机的设备I/O,支持针对单个虚拟机的多个设备模拟进程。该不同的用户态进程可以包括第一设备模拟进程以及第二设备模拟进程,作为本申请实施例的一种优选示例,第一设备模拟进程可以为QEMU(全称Quick Emulator)进程,所述第二设备模拟进程可以为独立于QEMU进程的I/O设备模拟进程,为方便后续的描述,可以将该第二设备模拟进程称为DEMU(Dedicated Emulator)进程或DEMU。
其中,QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor,VMM),用户可以通过不同Linux发行版所带有的软件包管理器来安装QEMU。QEMU在主机用户态模拟虚拟机的硬件设备,QEMU作为系统模拟器时,可以模拟出一台能够独立运行操作系统的虚拟机,每个虚拟机对应主机(Host)中的一个QEMU进程,而虚拟机的vCPU对应QEMU进程的一个线程。
在具体实现中,可以通过执行QEMU和DEMU的二进制可执行文件来创建QEMU进程与DEMU进程,并可以通过脚本或者libvirt工具启动这两个进程。
应用于本申请实施例,在对I/O请求进行处理之前,首先执行初始化流程。在平台相关的KVM模块中通过module_init宏正式进入KVM的初始化阶段,并且执行相关的硬件初始化准备。进入kvm_main.c中的kvm_init函数进行正式的初始化工作。
参考图3的KVM初始化流程的步骤流程图,所述初始化流程至少可以包括如下步骤:
子步骤S1,采用所述第一设备模拟进程创建虚拟机,获得所述虚拟机的文件描述符;
具体的,KVM同用户空间进程的交互接口为/dev/kvm,对于KVM API的操作是从打开/dev/kvm设备文件开始的,通过使用系统调用open方法之后,可以获得针对kvmsubsystem的一个fd文件描述符。然后通过IOCTL系统指令针对该文件描述符进行进一步的操作。
IOCTL系统指令可以包括KVM_CREATE_VM指令,通过KVM_CREATE_VM指令,即可创建一个虚拟机VM。通过调用anon_inode_getfd可以获得一fd文件描述符,作为虚拟机的文件描述符,即vm_fd,该vm_fd指向内核空间中该新创建的虚拟机,然后根据该描述符来控制虚拟机的行为。
vm IOCTL系统调用实现了对虚拟机的控制。vm IOCTL控制指令的参数大多需要从KVM_CREATE_VM中返回的vm_fd来进行操作,涉及的操作主要针对该虚拟机进行控制,如配置内存、配置vCPU等。
针对VM的文件操作中,提供了IOCTL和mmap两个操作函数,其中mmap对应着客户操作系统GUEST OS的物理地址,可以直接对GUEST OS的地址空间进行读/写,IOCTL则用于发送KVM的控制字。
应用于本申请实施例,还可以对该创建的虚拟机设置对应的通用唯一识别码UUID,以通过该UUID识别虚拟机。
虚拟机的创建过程实质为kvm结构体的创建和初始化过程,在创建虚拟机时,kvm_dev_IOCTL_create_vm函数通过调用kvm_create_vm函数对KVM结构体进行创建。
KVM结构体保存了虚拟机运行的上下文及其他相关状态,例如,可以包括vCPU(虚拟处理器,虚拟机内的CPU)、内存、APIC(Advanced Programmable Interrupt Controller,高级可编程中断控制器)、IRQ(Interrupt Request,中断请求)、MMU(Memory ManagementUnit,内存管理单元)、Event事件管理等信息,应用于本申请实施例,该KVM结构体还可以包括虚拟机的UUID。
KVM结构体的初始化过程,可以包括:初始化KVM的memslot结构体、Bus总线结构体信息、scru读/写锁信息、eventfd事件通知信息、mmu内存管理结构体信息等。
虚拟机的KVM结构体创建完成以后,可以将其加入到全局链表vm_list中。
在本申请实施例中,可以使用QEMU进程完成虚拟机的创建。
步骤S2,采用所述第一设备模拟进程,基于所述虚拟机的文件描述符,创建虚拟处理器vCPU,获得所述vCPU的文件描述符;
具体的,全新创建的虚拟机没有vCPU,需要通过后续的IOCTL指令进行配置。在获得vm_fd之后,通过IOCTL调用KVM_CREATE_vCPU指令,可以对该vm_fd对应的虚拟机创建vCPU,其入口函数地址在kvm_vm_IOCTL函数中,通过switch之后,程序流程将选择进入kvm_vm_IOCTL_create_vCPU函数中进行处理,返回该vCPU对应的文件描述符fd,即vCPU_fd,在KVM虚拟化环境中,硬件虚拟化使用vCPU_fd来描述vCPU。
在KVM中,vCPU对应的数据结构体为kvm_vCPU,vCPU的创建过程实质为kvm_vCPU结构体的创建和初始化过程,可以包括如下过程:调用kvm_arch_vCPU_create函数创建一个kvm_vCPU结构体;调用kvm_arch_vCPU_setup函数对kvm_vCPU中的数据结构进行初始化;创建当前vCPU对应的文件描述符vCPU_fd,并且将kvm_vCPU添加入KVM的vCPU数组中。
在本申请实施例中,可以使用QEMU进程完成vCPU的创建,每个vCPU对应一个vCPU线程。
步骤S3,采用所述第二设备模拟进程,创建eventfd文件描述符;
应用于本申请实施例,可以采用DEMU进程调用标准的Linux系统API eventfd()来创建eventfd文件描述符。具体来说,eventfd()是Linux系统提供的系统接口,函数原型是int eventfd(unsigned int initval,int flags),调用这个函数用户态进程可以获取一个eventfd文件描述符,同时在内核中创建一个eventfd对象用于实现等待和通知的机制,主要用于用户态互相通知,和内核态向用户态的通知。
eventfd对象中可以包含一个64位的整形变量作为计数器,函数原型中传入的参数initval用于初始化这个计数器。eventfd文件描述符用于用户态引用eventfd对象,用户态进程可以对eventfd文件描述符进行read,write,poll,select操作。
步骤S4,采用所述第二设备模拟进程,基于所述虚拟机文件描述符,创建I/O通道,并将所述I/O通道与所述eventfd文件描述符绑定,获得所述I/O通道的文件描述符;
应用于本申请实施例,还可以采用DEMU进程来创建虚拟机的一个或多个I/O通道。
具体来说,DEMU进程可以获得当前虚拟机的UUID,然后在全局链表vm_list中查找该虚拟机的UUID,若查找成功,则获得对应的KVM结构体,从而获得虚拟机的文件描述符vm_fd,之后,可以通过vm_fd新增的IOCTL指令(例如,KVM_CREATE_IOCH指令)对该vm_fd对应的虚拟机创建I/O通道。创建I/O通道的时候,会生成I/O通道与eventfd的绑定关系,随后返回I/O通道的文件描述符,即I/O_fd,I/O通道的文件描述符提供IOCLT指令给用户态进程,每个vm_fd可挂载多个I/O_fd。
在KVM中,I/O通道的创建过程实质为I/O通道的结构体的创建和初始化过程,I/O通道的结构体可以包括:一个eventfd,用于内核态向用户态的通知;一组存放I/O请求的缓冲区及其保护锁;一个保存所有此通道负责传递的I/O地址空间的链表。
应用于本申请实施例,在虚拟环境中,每个虚拟机对应的KVM结构体还可以新增一个链表,用于保存所有注册在该虚拟机上的I/O通道。
需要说明的是,每个I/O模拟进程仅需要且对应一个I/O通道。
子步骤S5,采用所述第二设备模拟进程,对所述eventfd文件描述符进行监听。
在具体实现中,可以在进程主循环中对eventfd文件描述符使用poll或者select方法,一旦发现该eventfd文件描述符有待处理的I/O,就调用相关的处理函数,以实现对eventfd的监听。
步骤S6,采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述用户态进程映射所述I/O通道的缓冲区;
在具体实现中,KVM会在内核态为全新创建的I/O通道分配一段缓冲区,随后,用户态程序可以对I/O通道的文件描述符使用mmap()系统调用,映射该I/O通道的缓冲区,则用户态进程可以访问该缓冲区。
所述缓冲区还具有保护锁,以保证对该缓冲区读写访问互斥性。
步骤S7,采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述I/O通道绑定I/O地址区间。
应用本申请实施例,还可以采用DEMU进程通过I/O通道的文件描述符为需要监听的I/O通道绑定I/O地址区间,不同的I/O通道具有不同的I/O地址区间,例如,针对I/O地址区间1~1000,可以将1~300绑定给I/O通道A,将301~1000绑定给I/O通道B。
在具体实现中,该I/O通道的地址区间还可以包括多个地址子区间,每个地址子区间对应一个I/O模拟设备(一个IO模拟进程可以模拟多个IO模拟设备),每个I/O模拟设备只模拟落在其地址区间范围内的请求。例如,I/O通道A的地址区间为1~300,其中,1~100可以对应I/O模拟设备1,101~200可以对应I/O模拟设备2,201~300可以对应I/O模拟设备3。
在本申请实施例中,在原有的QEMU进程的基础上,新增独立的DEMU进程,两者作为用户态模拟器,能够共享虚拟机的一部分底层数据结构。
在完成初始化流程以后,如图2所示,本申请实施例具体可以包括如下步骤:
步骤201,通过内核虚拟机KVM拦截虚拟机的vCPU线程发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息;
KVM可以拦截虚拟机的I/O操作,并根据拦截的I/O操作确定对应的I/O通道的信息。
在本申请实施例的一种优选实施例中,步骤201可以包括如下子步骤:
子步骤S11,通过内核虚拟机KVM及Intel VT-d硬件技术拦截虚拟机的vCPU线程发出的I/O请求;
在具体实现中,KVM在内核空间非根模式下运行vCPU线程,当vCPU线程发起I/O请求时,该敏感指令将会触发Intel VT-d硬件技术的VM exit操作,进入根模式下KVM相应的处理函数。
具体的,当虚拟机运行时(虚拟机的运行通过/dev/kvm设备IOCTL vCPU接口的KVM_RUN指令实现),触发VM Entry,使虚拟机进入客户Guest模式,即non root模式。而当在虚拟机中(Guest模式)执行特权指令或者外部事件,比如I/O访问,对控制寄存器的操作,MSR的读写数据包到达等时,可以触发(由硬件触发)VM Exit,使当前CPU从Guest模式(非根non-root模式)退出,切换到根root模式,当前CPU的控制权随之转交给KVM,由KVM进行相应的处理。
KVM取得控制权以后,通过读取VMCS中VM_EXIT_REASON字段得到引起VM Exit的原因,KVM根据退出的原因得知虚拟机需要进行I/O操作。
子步骤S12,从所述I/O请求中提取对应的I/O地址;
I/O请求中可以携带发出I/O请求的虚拟机的地址信息,当获得I/O请求以后,可以从该I/O请求中提取对应的I/O地址。
子步骤S13,确定所述I/O地址所属的I/O地址区间;
子步骤S14,通过所述I/O地址区间确定对应的I/O通道,并获取所述I/O通道对应的I/O通道的信息。
由于I/O通道具有I/O地址区间,因此可以首先判断该I/O请求的I/O地址属于哪个地址区间,然后根据匹配的地址区间确定对应的I/O通道,并确定该I/O通道对应的缓冲区、eventfd文件描述符等信息。
步骤202,将所述I/O请求写入对应的I/O通道的缓冲区中;
确定该I/O请求对应的I/O通道通道以后,KVM可以将该I/O请求写入该对应的I/O通道的缓冲区中,从而在KVM中完成I/O请求的分发。
步骤203,采用所述eventfd通知所述I/O通道对应的用户态进程;
在具体实现中,在内核空间中将I/O请求写入对应的I/O通道的缓冲区时,用户空间对此并不知情,因此需要内核空间通过eventfd向用户空间发出通知,用户态进程通过监听该eventfd从而获知其对应的I/O通道的缓冲区中写入了I/O请求。
步骤204,挂起所述vCPU线程;
应用于本申请实施例,由于I/O请求通过I/O通道上传到I/O通道的缓冲区中,由I/O模拟线程进行I/O模拟,而I/O模拟线程与vCPU线程可以处于不同的进程中,因此发生I/O请求的时候无需退出vCPU线程,此时只需要挂起vCPU线程,并等待用户态进程的完成I/O请求后再将其唤醒。
步骤205,在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟;
当内核态向用户态发出eventfd事件通知时,用户态进程可以监听到eventfd事件通知,相应的处理函数被调用,通过用户态进程进行I/O模拟,其中,I/O模拟主要指的是针对虚拟机进行的I/O操作,通过软件的模拟行为使其获得一个对应的处理结果。
在本申请实施例的一种优选实施例中,步骤205可以包括如下子步骤:
子步骤S21,在所述用户态进程中,根据所述eventfd确定对应的I/O通道;
由于eventfd与I/O通道是绑定的,当用户态进程监听到eventfd进程注册的函数被调用以后,可以根据eventfd与I/O通道的对应关系,确定与eventfd对应的I/O通道。
子步骤S22,从所述对应的I/O通道的缓冲区中获取I/O请求;
当确定I/O通道以后,可以进一步从已经映射的该I/O通道的缓冲区中读出I/O请求。
子步骤S23,依据所述I/O请求中的I/O地址确定对应的I/O模拟设备;
子步骤S24,将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟。
由于I/O通道的地址空间中包含一个或多个I/O模拟设备的地址子区间,当用户态进程获得I/O请求以后,可以根据该I/O请求中携带的I/O地址,确定该I/O地址所属的地址子区间,并根据该地址子区间确定对应的I/O模拟设备,以及将该I/O请求分发至该对应的I/O模拟设备中,以完成I/O请求的进一步二次分发。
I/O模拟设备获得I/O请求以后,对该I/O请求进行I/O模拟。
在一种实施方式中,若该I/O请求为读请求,则该请求对应的I/O模拟设备可以将该读请求对应的数据写入I/O通道的缓冲区中,从而完成用户空间中的I/O模拟。
在另一种实施方式中,若该I/O请求为写请求,则该请求对应的I/O模拟设备可以将该写请求对应的数据写入对应的位置中,例如写入到了主机中的一个镜像文件中,从而完成用户空间中的I/O模拟。
步骤206,唤醒所述挂起的vCPU线程。
I/O模拟完成后,用户态进程调用I/O通道的文件描述符中的新增IOCTL指令进入KVM内核态,唤醒该挂起的vCPU线程,以继续运行vCPU线程,达到vCPU线程与I/O模拟线程的同步,也就是说,用户态向内核态的通知是通过对vCPU线程的挂起与唤醒来实现的。
在一种实施方式中,若该I/O请求为读请求,在唤醒vCPU线程之后,还可以将该读请求对应的数据从缓冲区中读出,读入到vCPU结构体中相应的成员变量中,并通过原有的I/O模拟代码进行后续的模拟处理。
eventfd的使用结合缓冲区的使用,可以在缓冲区中传递I/O请求访问的实际地址和长度,并将读操作得到的数据通过缓冲区传递给KVM,克服现有技术的缺陷。
在对I/O请求处理完成以后,可以通过硬件指令(如VMLAUNCH),触发VM Enter,重新进入到Guest模式,从而进入虚拟机运行环境中继续运行。
为了使本领域技术人员能够更好地理解本申请实施例,以下通过一个具体实例对本申请实施例加以示例性说明,但应该理解的是,本申请实施例并不限于此。
虚拟机在运行时,设备驱动会访问虚拟VGA设备的MMIO控制寄存器来读取模拟设备的状态。该寄存器映射的地址访问触发EPT页错误,CPU退出非根模式进入根模式,执行KVM代码。
KVM判断退出原因得知是I/O请求,根据I/O请求查找对应的I/O通道,将I/O请求拷贝到I/O通道相应的缓冲区中,然后用eventfd发出通知后vCPU线程进入睡眠。
QEMU主循环发现eventfd中的事件通知,找到相应的I/O通道并从相应的缓冲区中读出I/O请求,发现该请求地址处于客户机物理地址布局中虚拟VGA设备的BAR1区间,于是调用VGA设备相应的处理函数对I/O请求进行模拟,把该寄存器的值写回到缓冲区中,然后通过IOCTL指令唤醒睡眠的vCPU线程。
vCPU线程被唤醒后从缓冲区中读出寄存器值数据,并将其更新到vCPU上下文的相应位置,然后进入非根模式继续执行vCPU上下文。
驱动代码处的读寄存器操作全部完成模拟。
本申请实施例在KVM虚拟化下实现独立于QEMU的设备模拟程序提供了基础,解决了一些厂商特有的设备模拟需求。
另外,本申请实施例在KVM内核模块中实现I/O请求的分发,并向用户态提供控制接口,从而可以在不同的进程中模拟同一台虚拟机的设备I/O。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。
参照图4,示出了本申请的一种KVM虚拟化下处理I/O请求的装置实施例的结构框图,具体可以包括如下模块:
I/O通道确定模块401,用于通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;
缓冲区写入模块402,用于将所述I/O请求写入对应的I/O通道的缓冲区中;
事件通知模块403,用于采用所述eventfd通知所述I/O通道对应的用户态进程;
I/O模拟模块404,用于在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟。
其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。
在本申请实施例的一种优选实施例中,所述装置还可以包括:
虚拟机创建模块,用于采用所述第一设备模拟进程创建虚拟机,获得所述虚拟机的文件描述符;
vCPU创建模块,用于采用所述第一设备模拟进程,基于所述虚拟机的文件描述符,创建虚拟处理器vCPU,获得所述vCPU的文件描述符;
eventfd创建模块,用于采用所述第二设备模拟进程,创建eventfd文件描述符;
I/O通道创建模块,用于采用所述第二设备模拟进程,基于所述虚拟机的文件描述符,创建I/O通道,并将所述I/O通道与所述eventfd文件描述符绑定,获得所述I/O通道的文件描述符;
监听模块,用于对所述eventfd文件描述符进行监听;
缓冲区映射模块,用于采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述用户态进程映射所述I/O通道的缓冲区;
地址区间绑定模块,用于采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述I/O通道绑定I/O地址区间。
在本申请实施例的一种优选实施例中,所述I/O请求包括I/O地址,所述I/O通道确定模块401可以包括如下子模块:
I/O请求拦截子模块,用于通过内核虚拟机KVM及Intel VT-d硬件技术拦截虚拟机的vCPU线程发出的I/O请求;
I/O地址提取子模块,用于从所述I/O请求中提取对应的I/O地址;
第一I/O通道确定子模块,用于确定所述I/O地址所属的I/O地址区间,并通过所述I/O地址区间确定对应的I/O通道,并获取所述I/O通道对应的I/O通道的信息。
在本申请实施例的一种优选实施例中,所述I/O通道的地址区间包括多个I/O模拟设备的地址子区间;
所述I/O模拟模块404可以包括如下子模块:
第二I/O通道确定子模块,用于在所述用户态进程中,根据所述eventfd确定对应的I/O通道;
I/O请求读取子模块,用于从所述对应的I/O通道的缓冲区中获取I/O请求;
I/O模拟设备确定子模块,用于依据所述I/O请求中的I/O地址确定对应的I/O模拟设备;
分发子模块,用于将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟。
在本申请实施例的一种优选实施例中,所述装置还包括:
挂起模块,用于在采用所述eventfd通知所述I/O通道对应的用户态进程以后,挂起所述vCPU线程。
在本申请实施例的一种优选实施例中,所述装置还包括:
唤醒模块,用于在对所述I/O请求执行I/O模拟以后,唤醒所述挂起的vCPU线程。
在本申请实施例的一种优选实施例中,所述I/O请求包括读请求,所述分发子模块还用于:
将所述读请求分发至所述I/O模拟设备中,通过所述I/O模拟设备将所述读请求对应的数据写入所述I/O通道的缓冲区中。
在本申请实施例的一种优选实施例中,所述装置还包括:
数据读出模块,用于在所述I/O请求为读请求时,将所述读请求对应的数据从缓冲区中读出,读入到vCPU结构体中相应的成员变量中,对所述数据进行对应的模拟处理。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
在一个典型的配置中,所述计算机设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非持续性的电脑可读媒体(transitory media),如调制的数据信号和载波。
本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本申请所提供的一种KVM虚拟化下处理I/O请求的方法和一种KVM虚拟化下处理I/O请求的装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (16)
1.一种KVM虚拟化下处理I/O请求的方法,其特征在于,所述的方法包括:
通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;
将所述I/O请求写入对应的I/O通道的缓冲区中;
采用所述eventfd通知所述I/O通道对应的用户态进程;
在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟,其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。
2.根据权利要求1所述的方法,其特征在于,所述在所述通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息的步骤之前,还包括:
采用所述第一设备模拟进程创建虚拟机,获得所述虚拟机的文件描述符;
采用所述第一设备模拟进程,基于所述虚拟机的文件描述符,创建虚拟处理器vCPU,获得所述vCPU的文件描述符;
采用所述第二设备模拟进程,创建eventfd文件描述符;
采用所述第二设备模拟进程,基于所述虚拟机的文件描述符,创建I/O通道,并将所述I/O通道与所述eventfd文件描述符绑定,获得所述I/O通道的文件描述符;
采用所述第二设备模拟进程,对所述eventfd文件描述符进行监听;
采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述用户态进程映射所述I/O通道的缓冲区;
采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述I/O通道绑定I/O地址区间。
3.根据权利要求2所述的方法,其特征在于,所述I/O请求包括I/O地址,所述通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息的步骤包括:
通过内核虚拟机KVM及Intel VT-d硬件技术拦截虚拟机的vCPU线程发出的I/O请求;
从所述I/O请求中提取对应的I/O地址;
确定所述I/O地址所属的I/O地址区间;
通过所述I/O地址区间确定对应的I/O通道,并获取所述I/O通道对应的I/O通道的信息。
4.根据权利要求3所述的方法,其特征在于,所述I/O通道的地址区间包括多个I/O模拟设备的地址子区间;
所述在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟的步骤包括:
在所述用户态进程中,根据所述eventfd确定对应的I/O通道;
从所述对应的I/O通道的缓冲区中获取I/O请求;
依据所述I/O请求中的I/O地址确定对应的I/O模拟设备;
将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟。
5.根据权利要求3或4所述的方法,其特征在于,在所述在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟的步骤之前,还包括:
挂起所述vCPU线程。
6.根据权利要求5所述的方法,其特征在于,在所述在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟的步骤之后,还包括:
唤醒所述挂起的vCPU线程。
7.根据权利要求4所述的方法,其特征在于,所述I/O请求包括读请求,所述将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟的步骤为:
将所述读请求分发至所述I/O模拟设备中,通过所述I/O模拟设备将所述读请求对应的数据写入所述I/O通道的缓冲区中。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
若所述I/O请求为读请求,将所述读请求对应的数据从缓冲区中读出,读入到vCPU结构体中相应的成员变量中;
对所述数据进行对应的模拟处理。
9.一种KVM虚拟化下处理I/O请求的装置,其特征在于,所述的装置包括:
I/O通道确定模块,用于通过内核虚拟机KVM拦截虚拟机发出的I/O请求,确定与所述I/O请求对应的I/O通道的信息,其中,所述I/O通道具有对应的缓冲区,所述I/O通道的信息包括eventfd文件描述符;
缓冲区写入模块,用于将所述I/O请求写入对应的I/O通道的缓冲区中;
事件通知模块,用于采用所述eventfd通知所述I/O通道对应的用户态进程;
I/O模拟模块,用于在所述用户态进程中,根据所述eventfd监听对应的I/O通道的事件,并从所述对应的I/O通道的缓冲区中获取I/O请求,对所述I/O请求执行I/O模拟,其中,所述用户态进程包括第一设备模拟进程以及与所述第一设备模拟进程独立的第二设备模拟进程。
10.根据权利要求9所述的装置,其特征在于,还包括:
虚拟机创建模块,用于采用所述第一设备模拟进程创建虚拟机,获得所述虚拟机的文件描述符;
vCPU创建模块,用于采用所述第一设备模拟进程,基于所述虚拟机的文件描述符,创建虚拟处理器vCPU,获得所述vCPU的文件描述符;
eventfd创建模块,用于采用所述第二设备模拟进程,创建eventfd文件描述符;
I/O通道创建模块,用于采用所述第二设备模拟进程,基于所述虚拟机的文件描述符,创建I/O通道,并将所述I/O通道与所述eventfd文件描述符绑定,获得所述I/O通道的文件描述符;
监听模块,用于采用所述第二设备模拟进程,对所述eventfd文件描述符进行监听;
缓冲区映射模块,用于采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述用户态进程映射所述I/O通道的缓冲区;
地址区间绑定模块,用于采用所述第二设备模拟进程,基于所述I/O通道的文件描述符,为所述I/O通道绑定I/O地址区间。
11.根据权利要求10所述的装置,其特征在于,所述I/O请求包括I/O地址,所述I/O通道确定模块包括:
I/O请求拦截子模块,用于通过内核虚拟机KVM及Intel VT-d硬件技术拦截虚拟机的vCPU线程发出的I/O请求;
I/O地址提取子模块,用于从所述I/O请求中提取对应的I/O地址;
第一I/O通道确定子模块,用于确定所述I/O地址所属的I/O地址区间,并通过所述I/O地址区间确定对应的I/O通道,并获取所述I/O通道对应的I/O通道的信息。
12.根据权利要求11所述的装置,其特征在于,所述I/O通道的地址区间包括多个I/O模拟设备的地址子区间;
所述I/O模拟模块包括:
第二I/O通道确定子模块,用于在所述用户态进程中,根据所述eventfd确定对应的I/O通道;
I/O请求读取子模块,用于从所述对应的I/O通道的缓冲区中获取I/O请求;
I/O模拟设备确定子模块,用于依据所述I/O请求中的I/O地址确定对应的I/O模拟设备;
分发子模块,用于将所述I/O请求分发至所述I/O模拟设备中,通过所述I/O模拟设备对所述I/O请求进行I/O模拟。
13.根据权利要求11或12所述的装置,其特征在于,还包括:
挂起模块,用于在采用所述eventfd通知所述I/O通道对应的用户态进程以后,挂起所述vCPU线程。
14.根据权利要求13所述的装置,其特征在于,还包括:
唤醒模块,用于在对所述I/O请求执行I/O模拟以后,唤醒所述挂起的vCPU线程。
15.根据权利要求12所述的装置,其特征在于,所述I/O请求包括读请求,所述分发子模块还用于:
将所述读请求分发至所述I/O模拟设备中,通过所述I/O模拟设备将所述读请求对应的数据写入所述I/O通道的缓冲区中。
16.根据权利要求15所述的装置,其特征在于,所述装置还包括:数据读出模块,用于在所述I/O请求为读请求时,将所述读请求对应的数据从缓冲区中读出,读入到vCPU结构体中相应的成员变量中,对所述数据进行对应的模拟处理。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610019289.0A CN106970821B (zh) | 2016-01-12 | 2016-01-12 | 一种kvm虚拟化下处理i/o请求的方法和装置 |
PCT/CN2017/070151 WO2017121273A1 (zh) | 2016-01-12 | 2017-01-04 | 一种kvm虚拟化下处理i/o请求的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610019289.0A CN106970821B (zh) | 2016-01-12 | 2016-01-12 | 一种kvm虚拟化下处理i/o请求的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106970821A CN106970821A (zh) | 2017-07-21 |
CN106970821B true CN106970821B (zh) | 2021-02-02 |
Family
ID=59310750
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610019289.0A Active CN106970821B (zh) | 2016-01-12 | 2016-01-12 | 一种kvm虚拟化下处理i/o请求的方法和装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN106970821B (zh) |
WO (1) | WO2017121273A1 (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107807843B (zh) * | 2017-10-26 | 2019-05-24 | 北京百度网讯科技有限公司 | 虚拟机中的i/o请求处理方法、设备及计算机可读介质 |
CN109002363A (zh) * | 2018-06-21 | 2018-12-14 | 郑州云海信息技术有限公司 | 一种事件处理方法、装置、设备及可读存储介质 |
CN109033328B (zh) * | 2018-07-19 | 2022-08-02 | 郑州云海信息技术有限公司 | 一种访问请求处理方法、装置、设备及可读存储介质 |
CN109271244A (zh) * | 2018-09-11 | 2019-01-25 | 郑州云海信息技术有限公司 | 一种非易失性内存储器的进程管理方法与装置 |
CN110955631B (zh) * | 2018-09-26 | 2023-01-03 | 上海瑾盛通信科技有限公司 | 文件访问追踪方法、装置、存储介质及终端 |
CN109976877B (zh) * | 2019-03-22 | 2021-05-04 | 优刻得科技股份有限公司 | 利用virtio驱动实现请求的方法、装置和存储介质 |
CN111428240B (zh) * | 2020-03-20 | 2021-10-15 | 安芯网盾(北京)科技有限公司 | 一种用于检测软件的内存违规访问的方法及装置 |
CN112162830B (zh) * | 2020-10-30 | 2021-11-09 | 北京易捷思达科技发展有限公司 | 虚拟机快速启动方法、存储介质及终端 |
CN113342554B (zh) * | 2021-08-02 | 2022-01-04 | 阿里云计算有限公司 | Io多路复用方法、介质、设备和操作系统 |
CN114791854B (zh) * | 2022-05-11 | 2023-03-24 | 科东(广州)软件科技有限公司 | 用户态虚拟机任务的调度方法、装置、设备及存储介质 |
CN115460470B (zh) * | 2022-08-19 | 2024-03-26 | 烽火通信科技股份有限公司 | 组播数据转发方法、装置、设备及可读存储介质 |
CN116361033B (zh) * | 2023-04-04 | 2023-12-29 | 亿咖通(湖北)技术有限公司 | 通信方法、电子设备及存储介质 |
CN116401020B (zh) * | 2023-06-07 | 2023-08-11 | 四川大学 | Kvm虚拟机i/o过滤框架实现方法、系统及存储介质 |
CN116841697B (zh) * | 2023-07-21 | 2024-05-07 | 芯华章智能科技(上海)有限公司 | 处理mmio请求的方法、电子装置和存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101706757A (zh) * | 2009-09-21 | 2010-05-12 | 中国科学院计算技术研究所 | 面向多核平台和分布式虚拟化环境的i/o系统及工作方法 |
CN101968746A (zh) * | 2010-09-02 | 2011-02-09 | 北京航空航天大学 | 一种内核虚拟机组织架构模式的实现方法 |
CN102073535A (zh) * | 2011-01-11 | 2011-05-25 | 华中科技大学 | 基于硬件计数器虚拟化的多虚拟机性能分析方法 |
CN104104705A (zh) * | 2013-04-11 | 2014-10-15 | 阿里巴巴集团控股有限公司 | 分布式存储系统的接入方法和设备 |
CN104503825A (zh) * | 2014-12-29 | 2015-04-08 | 西安电子科技大学 | 一种基于kvm混合式设备虚拟化方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080104589A1 (en) * | 2006-11-01 | 2008-05-01 | Mccrory Dave Dennis | Adaptive, Scalable I/O Request Handling Architecture in Virtualized Computer Systems and Networks |
-
2016
- 2016-01-12 CN CN201610019289.0A patent/CN106970821B/zh active Active
-
2017
- 2017-01-04 WO PCT/CN2017/070151 patent/WO2017121273A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101706757A (zh) * | 2009-09-21 | 2010-05-12 | 中国科学院计算技术研究所 | 面向多核平台和分布式虚拟化环境的i/o系统及工作方法 |
CN101968746A (zh) * | 2010-09-02 | 2011-02-09 | 北京航空航天大学 | 一种内核虚拟机组织架构模式的实现方法 |
CN102073535A (zh) * | 2011-01-11 | 2011-05-25 | 华中科技大学 | 基于硬件计数器虚拟化的多虚拟机性能分析方法 |
CN104104705A (zh) * | 2013-04-11 | 2014-10-15 | 阿里巴巴集团控股有限公司 | 分布式存储系统的接入方法和设备 |
CN104503825A (zh) * | 2014-12-29 | 2015-04-08 | 西安电子科技大学 | 一种基于kvm混合式设备虚拟化方法 |
Non-Patent Citations (1)
Title |
---|
刘年超.重磅:虚拟化交换机性能优化探讨实录.《https://mp.weixin.qq.com/s?__biz=MzU0NDEyODkzMQ==|=2247495253&idx=1&sn=35bac434e954089603832acf5b6fb301&source=41#wechat_redirect》.2016,第1-9页. * |
Also Published As
Publication number | Publication date |
---|---|
CN106970821A (zh) | 2017-07-21 |
WO2017121273A1 (zh) | 2017-07-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106970821B (zh) | 一种kvm虚拟化下处理i/o请求的方法和装置 | |
US11868792B2 (en) | Dynamic device virtualization for use by guest user processes based on observed behaviors of native device drivers | |
US20230289305A1 (en) | Direct access to a hardware device for virtual machines of a virtualized computer system | |
Suzuki et al. | {GPUvm}: Why Not Virtualizing {GPUs} at the Hypervisor? | |
US7209994B1 (en) | Processor that maintains virtual interrupt state and injects virtual interrupts into virtual machine guests | |
US8966477B2 (en) | Combined virtual graphics device | |
US7707341B1 (en) | Virtualizing an interrupt controller | |
US9507727B2 (en) | Page fault injection in virtual machines | |
US11487523B2 (en) | Updating machine emulator | |
JP2013516021A (ja) | プロセッサコアのハイパーバイザ離隔 | |
EP3392774A1 (en) | Multinode hubs for trusted computing | |
US10963280B2 (en) | Hypervisor post-write notification of control and debug register updates | |
US9898307B2 (en) | Starting application processors of a virtual machine | |
JP6920286B2 (ja) | 例外処理 | |
Chang et al. | Assessment of hypervisor and shared storage for cloud computing server | |
JP2018531462A6 (ja) | 例外処理 | |
CN108196945B (zh) | 一种核间通信方法、装置和虚拟化设备 | |
Im et al. | On-demand virtualization for live migration in bare metal cloud | |
Im et al. | On-Demand Virtualization for Post-Copy OS Migration in Bare-Metal Cloud | |
TWI733745B (zh) | 核心模式的虛擬機器(kvm)虛擬化下處理i/o請求的方法和裝置 | |
Tan et al. | How Low Can You Go? Practical cold-start performance limits in FaaS | |
US20240184612A1 (en) | Virtual machine live migration with direct-attached non-volatile memory express device | |
Kawakami et al. | Generalize IoT device's client application with virtual machine | |
Ambika et al. | A Novel Framework for Hypervisor Design | |
表祐志 | Computer Systems Management with a Para Pass-through Virtual Machine Monitor |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20230519 Address after: Room 1-2-A06, Yungu Park, No. 1008 Dengcai Street, Sandun Town, Xihu District, Hangzhou City, Zhejiang Province Patentee after: Aliyun Computing Co.,Ltd. Address before: Box 847, four, Grand Cayman capital, Cayman Islands, UK Patentee before: ALIBABA GROUP HOLDING Ltd. |
|
TR01 | Transfer of patent right |