vm ioctl系统调用实现了对虚拟机的控制。vm ioctl控制指令的参数大多需要从KVM_CREATE_VM中返回的fd文件描述符来进行操作,涉及的操作主要针对某一个虚拟机进行控制,如配置内存、配置VCPU等。其主要指令如表5-3所示。
表5-3 vm ioctl指令字
指令字 |
功能说明 |
KVM_CREATE_VCPU |
为已经创建好的VM添加VCPU |
KVM_GET_DIRTY_LOG |
返回经过上次操作之后,改变的内存页的位图 |
KVM_CREATE_IRQCHIP |
创建一个虚拟的APIC,并且随后创 建的VCPU都将连接到该APIC |
KVM_IRQ_LINE |
对某虚拟的APIC引发中断信号 |
KVM_GET_IRQCHIP |
读取APIC的中断标志信息 |
KVM_SET_IRQCHIP |
写入APIC的中断标志信息 |
KVM_RUN |
根据kvm_run结构体的信息,启动VM虚拟机 |
KVM_RUN和KVM_CREATE_VCPU是vm ioctl系统调用的两个重要指令字。在通过KVM_CREATE_VCPU为VM虚拟机创建VCPU,并且获得VCPU对应的fd文件描述符之后,可以进行KVM_RUN启动虚拟机的操作。
KVM_RUN指令字虽然没有任何参数,但是在调用KVM_RUN启动了虚拟机之后,可以通过mmap()系统调用映射VCPU的fd所在的内存空间来获得kvm_run结构体信息。该结构体位于内存偏移量0,结束位置在KVM_GET_ VCPU_MMAP_SIZE指令所返回的大小中。
kvm_run结构体的定义在include/linux/kvm.h中,通过读取该结构体可以了解KVM内部的运行状态,可以类比为计算机芯片中的寄存器组。其中主要的字段及说明如表5-4所示。
表5-4 kvm_run结构体的重要字段
字段名 |
功能说明 |
request_interrupt_window |
往VCPU中发出一个中断插入请求, 让VCPU做好相关的准备工作 |
ready_for_interrupt_injection |
响应request_interrupt_windows中的中 断请求,当此位有效时,说明可以进行中断 |
if_flag |
中断标识,如果使用了APIC,则不起作用 |
hardware_exit_reason |
当VCPU因为各种不明原因退出时, 该字段保存了失败的描述信息(硬件失效) |
io |
该字段为一个结构体。当KVM产 生硬件出错的原因是因为I/O输出时 (KVM_EXIT_IO),该结构体将保存导致 出错的I/O请求的原因 |
mmio |
该字段为一个结构体。当KVM产生出 错的原因是因为内存I/O映射导致的 (KVM_ EXIT_MMIO),该结构体中将 保存导致出错的内存I/O映射请求的数据 |