
최근에 나는 또는 /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;
:
}