我们需要根据run->exit_reason来处理kvm的退出状态,比如guest 关机:
case KVM_EXIT_HLT:
puts("KVM_EXIT_HLT");
return 0;
初始化失败:
case KVM_EXIT_FAIL_ENTRY:
errx(1, "KVM_EXIT_FAIL_ENTRY: hardware_entry_failure_reason = 0x%llx",
(unsigned long long)run->fail_entry.hardware_entry_failure_reason);
case KVM_EXIT_INTERNAL_ERROR:
errx(1, "KVM_EXIT_INTERNAL_ERROR: suberror = 0x%x",
run->internal.suberror);
以及需要进行设备的模拟器,在这里,只有一个端口为0x3f8的串口设备。模拟设备的效果就是把字符打印出来:
case KVM_EXIT_IO:
if (run->io.direction == KVM_EXIT_IO_OUT &&
run->io.size == 1 &&
run->io.port == 0x3f8 &&
run->io.count == 1)
putchar(*(((char *)run) + run->io.data_offset));
else
errx(1, "unhandled KVM_EXIT_IO");
break;
测试结果:
tree@tree-OptiPlex-7010:~/Desktop$ gcc -o kvmtest kvmtest.c
tree@tree-OptiPlex-7010:~/Desktop$ ./kvmtest
KVM_EXIT_HLT
qemu-kvm中,qemu的主要任务就是KVM_EXIT_IO, KVM_EXIT_MMIO之后的虚拟设备的模拟,以及KVM_RUN之前设置好相关的设备的东西并进行初始化。










