ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机

2020-02-03 14:39:55王振洲
  • }         }    

    我们需要根据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之前设置好相关的设备的东西并进行初始化。