最近私は、または/dev/kvm
実装された機能がないようで、それを呼び出そうとすると常にエラー22(無効な引数)が発生することがわかりました。read()
write()
私はioctl呼び出しを使用しないようにしていますが、カーネルからioctlサポートを完全に削除するにはkvmを使用できるかどうか疑問に思います。
ioctlなしでkvmへのアクセスを呼び出す方法は?
答え1
これらの操作をサポートしていないため、read(2)/write(2) /dev/kvm は使用できません。カーネルのkvmドライバのソースコードを見ると、ここたとえば、IOCTLのみをサポートしていることがわかります。
read
fopsで合計操作がNULLに設定されているため、write
read(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;
:
}