ioctlなしでKVMを使用できますか?

ioctlなしでKVMを使用できますか?

最近私は、または/dev/kvm実装された機能がないようで、それを呼び出そうとすると常にエラー22(無効な引数)が発生することがわかりました。read()write()

私はioctl呼び出しを使用しないようにしていますが、カーネルからioctlサポートを完全に削除するにはkvmを使用できるかどうか疑問に思います。

ioctlなしでkvmへのアクセスを呼び出す方法は?

答え1

これらの操作をサポートしていないため、read(2)/write(2) /dev/kvm は使用できません。カーネルのkvmドライバのソースコードを見ると、ここたとえば、IOCTLのみをサポートしていることがわかります。

readfopsで合計操作がNULLに設定されているため、writeread(2)/ write(2)は失敗します-EINVAL(無効な引数)(参照:LDD3、第3章、ファイル操作)。

以下のソースvirt/kvm/kvm_main.cの関連部分をリストしました。

file_options およびその他のデバイスは次のとおりです。

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,
};

ドライバの初期化では、他のデバイスを登録して/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;
    :
}

関連情報