最近准备开始研读KVM的代码实现,先从KVM用户层接口开始看起。
kvm device ioctl interface
KVM内核提供的用户层接口以/dev/kvm 的ioctl 接口为主,可以在文件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接口。调用形式如下:
|
|
其中KVM_VM_TYPE是根据体系结构区分设置的整数值,x86为0。
在kvm_dev_ioctl_create_vm接口中,先创建kvm数据结构,利用kvm_create_vm,然后创建fd,利用anon_inode_getfd接口。