购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3.1 KVM模块初始化

前面提到QEMU通过设备文件/dev/kvm发起ioctl系统调用请求KVM创建虚拟机,该设备文件便是在KVM模块初始化时创建的。kvm-intel.ko模块初始化函数为vmx_init,该函数将会调用kvm_init函数进而调用misc_register函数注册kvm_dev这一misc设备,代码如下。

linux-4.19.0 /arch/x86/kvm/vmx.c

linux-4.19.0/virt/kvm/kvm_main.c

注册成功后会在/dev/目录下产生名为kvm的设备节点,即/dev/kvm。该设备文件对应的fd(文件描述符)的file_operations为kvm_chardev_ops。该设备仅支持ioctl系统调用,其中最重要的便是KVM_CREATE_VM ioctl。KVM模块接收该系统调用时将会创建虚拟机。kvm_chardev_ops定义及具体代码如下。

linux-4.19.0/virt/kvm/kvm_main.c

实际上,KVM模块初始化时,除了创建设备文件,还做了许多与架构相关的初始化工作。如kvm_init接收的第一个参数vmx_x86_ops是一个函数指针集合,封装了Intel VT-x相关虚拟化操作。对于AMD-V而言,KVM则提供了另一个函数指针集合svm_x86_ops。KVM会根据当前所处平台选择将vmx_x86_ops或svm_x86_ops赋给arch/x86/kvm/x86.c中的全局变量kvm_x86_ops,这样后续通用x86虚拟化操作可以通过这一变量的相应成员调用arch/x86/kvm/vmx.c中的相应函数。kvm_x86_ops的设置工作由kvm_arch_init函数完成。此外,kvm_init函数还调用了kvm_hardware_setup函数,该函数最终会调用arch/86/kvm/vmx.c中的hardware_setup函数完成虚拟化硬件的初始化工作,这与2.2节所述的Intel VT-x虚拟化硬件支持密切相关。部分hardware_setup代码如下。

linux-4.19.0/arch/x86/kvm/vmx.c

setup_vmcs_config函数读取物理CPU中与VMX相关的MSR(特殊模块寄存器),检测物理CPU对VMX的支持能力,生成一个vmcs_config结构,后续将根据vmcs_config设置VMCS控制域。而后hardware_setup函数调用cpu_has_vmx_ept等函数判断CPU是否支持EPT,若不支持,则将全局变量enable_ept置0。alloc_kvm_area函数则会调用alloc_vmcs_cpu函数为每一个物理CPU分配一个4KB大小的区域作为VMXON区域。Intel SDM指出执行VMXON指令需要提供一个4KB对齐的内存区间,即VMXON区域。VMXON区域的物理地址后续将作为VMXON指令的操作数。 kuVCkyak1SkDQ7qkzw3KNiL6mWCLAKQ+sQh4/dxMSvICM+bj+heW7XRkr/PAMcnY

点击中间区域
呼出菜单
上一章
目录
下一章
×