我可以在没有 ioctl 的情况下使用 KVM 吗?

我可以在没有 ioctl 的情况下使用 KVM 吗?

最近我发现似乎/dev/kvm没有实现read()or的功能write(),并且任何调用它们的尝试总是会导致错误 22(无效参数)。

我试图避免使用 ioctl 调用,并且想知道如果我要从内核中完全删除 ioctl 支持,是否可以使用 kvm。

在没有 ioctl 的情况下如何调用对 kvm 的访问?

答案1

您无法对 /dev/kvm 执行 read(2)/write(2),因为它不支持这些操作。如果您查看内核的 kvm 驱动程序源代码或这里例如,您会看到它仅支持 IOCTL。

由于readwrite操作在 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;
    :
}

相关内容