Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46542
  • 博文数量: 11
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-19 20:34
个人简介

这家伙很懒,什么都没留下!

文章分类

全部博文(11)

文章存档

2016年(11)

我的朋友
最近访客

分类: LINUX

2016-06-04 12:19:58


6 KVM API

KVMAPI是通过/dev/kvm设备访问的,/dev/kvm是一个标准的字符设备,可以使用常用的opencloseioctl接口操作,但是kvm的实现中,没有提供readwrite接口,所有对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

6.1 System指令

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指令,进行进一步的配置。

6.2 VM指令

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_RUNVM ioctl指令中两种重要的指令字,通过KVM_CREATE_VCPU为虚拟机创建VCPU,并获得对应的fd描述符后,可以对其调用KVM_RUN,以启动该虚拟机(或称为调度VCPU)。 

Kvm_run结构体定义在include/linux/kvm.h中,可以通过该结构体了解KVM的内部运行状态。

6.3 VCPU指令

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获取VCPUxsave寄存器信息

ü  KVM_SET_XSAVE设置VCPUxsave寄存器信息

ü  KVM_GET_XCRS获取VCPUxcr寄存器信息

ü  KVM_SET_XCRS设置VCPUxcr寄存器信息

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的设置、调试接口等)

阅读(2199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~