页眉内容
KVM
虚拟机源代码分析
1
ï¼?/p>
KVM
结构及工作原ç�?/p>
1.1
K
VM
结构
KVM
基本结构有两部分组成。一个是
KVM Driver
,已经成ä¸?/p>
Linux
内核的一个模块ã€?/p>
负责虚拟机的创建,虚拟内存的分配,虚æ‹?/p>
CPU
寄存器的读写以及虚拟
CPU
的运行等。另
外一个是稍微修改过的
Qemu
,用于模æ‹?/p>
PC
硬件的用户空间组件,提供
I/O
设备模型以及
访问外设的途径ã€?/p>
å›?/p>
1 KVM
基本结构
KVM
基本结构如图
1
所示ã€?/p>
其中
KVM
加入到标准的
Linux
内核中,
被组织成
Linux
中标准的
字符设备
(/dev/kvm)
�/p>
Qemu
�/p>
KVM
提供çš?/p>
LibKvm
应用程序接口,通过
ioctl
系统调用创建
和运行虚拟机ã€?/p>
KVM Driver
使得整个
Linux
成为一个虚拟机监控器。并且在原有çš?/p>
Linux
�/p>
种执行模å¼?/p>
(
内核模式和用户模å¼?/p>
)
的基础上,新增加了客户模式,客户模式拥有自己的内核
模式和用户模式。在虚拟机运行下,三种模式的分工如下ï¼?/p>
客户模式:执行非
I/O
的客户代码。虚拟机运行在客户模式下ã€?/p>
内核模式:实现到客户模式的切换。处理因ä¸?/p>
I/O
或者其它指令引起的从客户模式的退出ã€?/p>
KVM Driver
工作在这种模式下ã€?/p>
用户模式:代表客户执è¡?/p>
I/O
指令
Qemu
运行在这种模式下ã€?/p>
�/p>
KVM
模型中,每一ä¸?/p>
Guest OS
都作为一个标准的
Linux
进程,可以使ç”?/p>
Linux
的进程管
理指令管理ã€?/p>
在图
1
�/p>
./dev/kvm
在内核中创建的标准字符设备,
通过
ioctl
系统调用来访问内核虚æ‹?/p>
机,进行虚拟机的创建和初始化ï¼?/p>
kvm_vm fd
是创建的指向特定虚拟机实例的文件描述符,
通过这个文件描述符对特定虚拟机进行访问控制;
kvm_vcpu fd
指向为虚拟机创建的虚拟处
理器的文件描述符,通过该描述符使用
ioctl
系统调用设置和调度虚拟处理器的运行ã€?/p>
1.2
K
VM
工作原理
KVM
的基本工作原理:用户模式çš?/p>
Qemu
利用接口
libkvm
通过
ioctl
系统调用进入内核
模式ã€?/p>
KVM Driver
为虚拟机创建虚拟内存和虚æ‹?/p>
CPU
后执è¡?/p>
VMLAUCH
指令进入客户模式ã€?/p>
装载
Guest OS
执行ã€?/p>
如果
Guest OS
发生外部中断或者影子页表缺页之类的事件ï¼?/p>
暂停
Guest
OS
的执行,退出客户模式进行一些必要的处理。然后重新进入客户模式,执行客户代码ã€?/p>
如果发生
I/O
事件或者信号队列中有信号到达,
就会进入用户模式处理ã€?/p>
KVM
采用全虚拟化
技术。客户机不用修改就可以运行ã€?/p>
å›?/p>
2 KVM
工作基本原理