最近我发现似乎/dev/kvm
没有实现read()
or的功能write()
,并且任何调用它们的尝试总是会导致错误 22(无效参数)。
我试图避免使用 ioctl 调用,并且想知道如果我要从内核中完全删除 ioctl 支持,是否可以使用 kvm。
在没有 ioctl 的情况下如何调用对 kvm 的访问?
答案1
您无法对 /dev/kvm 执行 read(2)/write(2),因为它不支持这些操作。如果您查看内核的 kvm 驱动程序源代码或这里例如,您会看到它仅支持 IOCTL。
由于read
和write
操作在 fops 中设置为 NULL,read(2)/write(2) 将失败-EINVAL
(参数无效)(参考:LDD3,第 3 章,文件操作)。
我在下面列出了源 virt/kvm/kvm_main.c 的相关部分。
这里是 file_operations 和杂项设备:
static struct file_operations kvm_chardev_ops = {
.unlocked_ioctl = kvm_dev_ioctl,
.llseek = noop_llseek,
KVM_COMPAT(kvm_dev_ioctl),
};
static struct miscdevice kvm_dev = {
KVM_MINOR,
"kvm",
&kvm_chardev_ops,
};
驱动程序 init 注册杂项设备,将 /dev/kvm 暴露给用户空间:
int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module)
{
:
/*
* Registration _must_ be the very last thing done, as this exposes
* /dev/kvm to userspace, i.e. all infrastructure must be setup!
*/
r = misc_register(&kvm_dev);
if (r) {
pr_err("kvm: misc device register failed\n");
goto err_register;
}
return 0;
:
}