kvm user interface

最近准备开始研读KVM的代码实现,先从KVM用户层接口开始看起。

kvm device ioctl interface

KVM内核提供的用户层接口以/dev/kvmioctl 接口为主,可以在文件virt/kvm/kvm_main.c中看到。

核心的函数为kvm_dev_ioctl ,用户层工具如果需要创建虚拟机实例,必须要交互的接口是/dev/kvm

  • KVM_GET_API_VERSION

该接口用于获取KVM的接口版本,用于用户层工具和内核交互时的版本检查,接口返回版本号KVM_API_VERSION

  • KVM_CREATE_VM

该接口用于创建一个虚拟机实例,会返回一个文件描述符fd,所有跟本虚拟机相关的内核接口均需要基于这个fd来进行ioctl操作。

  • KVM_CHECK_EXTENSION

检查KVM的能力支持,由用户传递参数,检查内核是否支持。参数为KVM_CAP_前缀的能力值。能力值列表在include/uapi/linux/kvm.h中。

  • KVM_GET_VCPU_MMAP_SIZE

获取VCPU的上下文大小,创建一个vcpu后,同样会返回一个文件描述符fd,可以mmap该fd,作为和内核层交互数据的接口。

  • 体系结构相关的ioctl接口

这里X86、ARM等处理器均有不同实现,不一一描述。

kvm create vm ioctl接口分析

在创建一个vm实例时,首先需要调用ioctl的KVM_CREATE_VM接口。调用形式如下:

1
kvm->vm_fd = ioctl(kvm->sys_fd, KVM_CREATE_VM, KVM_VM_TYPE);

其中KVM_VM_TYPE是根据体系结构区分设置的整数值,x86为0。

kvm_dev_ioctl_create_vm接口中,先创建kvm数据结构,利用kvm_create_vm,然后创建fd,利用anon_inode_getfd接口。