分类: LINUX
2017-03-13 15:18:27
原文地址:KVM基本原理及架构六-KVM API 作者:humjb_1983
KVM的API是通过/dev/kvm设备访问的,/dev/kvm是一个标准的字符设备,可以使用常用的open、close、ioctl接口操作,但是kvm的实现中,没有提供read和write接口,所有对KVM的所有操作都是通过ioctl接口操作的。KVM提供给上层的API功能上分,可分为3中类型:
1、 system指令,针对虚拟化系统的全局性参数设置和控制。
2、 VM指令,针对VM虚拟机进行控制,如:内存设置、创建VCPU等。
3、 VCPU指令,针对具体的VCPU进行参数设置。如:相关寄存器的读写、中断控制等。
通常对于KVM的操作都是从open /dev/kvm设备文件开始的,open后,会获得相应的文件描述符(fd),然后通过ioctl系统指令对该fd进行进一步的操作,比如通过KVM_CREATE_VM指令,可以创建一个虚拟机并返回虚拟机对应的文件描述符,然后根据该描述符来进一步控制虚拟机的行为,比如通过KVM_CREATE_VCPU指令来为该虚拟机创建VCPU。
System ioctl指令用于控制KVM运行环境的参数,包括全局性的参数设置和虚拟机创建等工作,主要的指令字包括:
ü KVM_CREATE_VM 创建KVM虚拟机
ü KVM_GET_API_VERSION 查询当前KVM API版本
ü KVM_GET_MSR_INDEX_LIST 获得MSR索引列表
ü KVM_CHECK_EXTENSION 检查扩展支持情况
ü KVM_GET_VCPU_MMAP_SIZE 运行虚拟机和用户态空间共享的一片内存区域的大小
其中,KVM_CREATE_VM比较重要,用于创建虚拟机,并返回一个代表该虚拟机的描述符(fd)。新创建的虚拟机没有VCPU,也没有内存等资源,需要对创建虚拟机时返回的描述符,通过ioctl指令,进行进一步的配置。
VM ioctl指令实现对虚拟机的控制,大多需要从KVM_CREATE_VM中返回的fd来进行操作,具体操作包括:配置内存、配置VCPU、运行虚拟机等,主要指令如下:
ü KVM_CREATE_VCPU 为虚拟机创建VCPU
ü KVM_RUN 根据kvm_run结构体信息,运行VM虚拟机
ü KVM_CREATE_IRQCHIP 创建虚拟APIC,且随后创建的VCPU都关联到此APIC
ü KVM_IRQ_LINE 对某虚拟APIC发出中断信号
ü KVM_GET_IRQCHIP 读取APIC的中断标志信息
ü KVM_SET_IRQCHIP 写入APIC的中断标志信息
ü KVM_GET_DIRTY_LOG 返回脏内存页的位图
KVM_CREATE_VCPU 和KVM_RUN是VM ioctl指令中两种重要的指令字,通过KVM_CREATE_VCPU为虚拟机创建VCPU,并获得对应的fd描述符后,可以对其调用KVM_RUN,以启动该虚拟机(或称为调度VCPU)。
Kvm_run结构体定义在include/linux/kvm.h中,可以通过该结构体了解KVM的内部运行状态。
VCPU ioctl指令主要针对具体的VCPU进行配置,包括寄存器读写、中断设置、内存设置、时钟管理、调试开关等,可以对KVM虚拟机进行运行时配置。主要指令字包括:
l 寄存器控制方面:
ü KVM_GET_REGS 获取通用寄存器信息
ü KVM_SET_REGS 设置通用寄存器信息
ü KVM_GET_SREGS 获取特殊寄存器信息
ü KVM_SET_SREGS设置特殊寄存器信息
ü KVM_GET_MSRS获取MSR寄存器信息
ü KVM_SET_MSRS设置MSR寄存器信息
ü KVM_GET_FPU获取浮点寄存器信息
ü KVM_SET_FPU设置浮点寄存器信息
ü KVM_GET_XSAVE获取VCPU的xsave寄存器信息
ü KVM_SET_XSAVE设置VCPU的xsave寄存器信息
ü KVM_GET_XCRS获取VCPU的xcr寄存器信息
ü KVM_SET_XCRS设置VCPU的xcr寄存器信息
2 中断和事件管理方面
ü KVM_INTERRUPT 在VCPU上产生中断(当APIC无效时)
ü KVM_SET_SIGNAL_MASK 设置某个VCPU的中断信号屏蔽掩码
ü KVM_GET_CPU_EVENTS 获取VCPU中被挂起待延时处理的事件,如中断、NMI或异常
ü KVM_SET_CPU_EVENTS 设置VCPU的事件,如中断、NMI或异常
3 内存管理方面
ü KVM_TRANSLATE 将VCPU的物理地址翻译成HPA
ü KVM_SET_USER_MEMORY_REGION 修改VCPU的内存区域
ü KVM_SET_TSS_ADDR 初始化TSS内存区域(Intel架构专用)
ü KVM_SET_IDENTITY_MAP_ADDR 创建EPT页表(Intel架构专用)
4 其他方面(如:CPUID的设置、调试接口等)