patch02-04主要实现如下功能:
(0)准备kvm结构体,用于和kvm内核模块沟通。
struct kvm
{
int fd; /* /dev/kvm */
int vmfd;
};
在main函数中创建一个kvm变量,并获取内核kvm设备fd。
struct kvm kvm;
kvm.fd = open("/dev/kvm", O_RDWR);
(1)校验kvm版本信息
ret = ioctl(kvm.fd, KVM_GET_API_VERSION, 0);
if (ret != KVM_API_VERSION) {
die("kvm verison error");
}
(2)通过kvm api函数创建一个虚拟机vm(虽然这边调用kvm api创建了一个vm,但是只是一个空壳子,因为我们还没有为vm准备内存等vm运行所必要的相关资源)
kvm.vmfd = ioctl(kvm.fd, KVM_CREATE_VM, 0);
if (kvm.vmfd < 0) {
die("create vm failed");
}
在上述程序中使用到了ioctl
这个函数,这个函数是kvm为我们提供的api,linux用户态程序主要就是通过ioctl
这个api和kvm内核组件交互。
附:
patch02: Check for KVM_API_VERSION at init
patch03: Create a VM using ioctl(KVM_CREATE_VM)
patch04: Move KVM fds into ‘struct kvm’