我们知道,Qemu-KVM实际上包括Qemu和KVM两部分,那么在创建以及初始化虚拟机时,实际上也是在这两部分进行的。
KVM实际上就是kvm内核模块,包括kvm.ko、kvm-intel.ko、kvm-amd.ko三部分,后两部分分别对应Intel体系的VMX技术以及AMD体系的SVM技术。
首先,我们需要加载模块,当我们加载kvm-xxx.ko模块时,会调用对应的module_init()函数,然后调用vmx_init()或者svm_init()函数,最后进入到统一的kvm.ko模块中的kvm_init()函数,现在正式开始进行虚拟机的初始化工作。
module_init(vmx_init) //位于vmx.c文件
static int __init vmx_init(void) //位于vmx.c文件
{
..............//省略部分代码
r= kvm_init(&vmx_x86_ops, sizeof(struct vcpu_vmx),
__alignof__(struct vcpu_vmx),THIS_MODULE);
................//省略部分代码
}

Qemu-KVM虚拟机的初始化涉及Qemu和KVM两部分,KVM模块包括kvm.ko及针对Intel和AMD的特定模块。加载模块时,调用module_init()、vmx_init()或svm_init(),最终进入kvm_init()进行初始化。在kvm_arch_init()函数中,结构体vmx_x86_ops作为函数指针集合被注册,用于后续ioctl调用。此外,内部数据结构、定时器和调试信息也进行了初始化。Qemu层的初始化将在后续分析中讨论。
最低0.47元/天 解锁文章
370

被折叠的 条评论
为什么被折叠?



