QEMU&KVM
QEMU 是一套源码, 开源的 ,代码 在 https:
KVM 被并入了 Linux 内核, 开源的 ,代码 在 https:
QEMU 可以运行在 ARMv7-linux/ARMv8-linux/x86_64-linux 上
QEMU 之上 可以运行(仿真) ARMv7-linux/ARMv8-linux/x86_64-linux/riscv64-linux/risc32-linux
QEMU 可以 不利用 KVM 来 完成 仿真,可以利用KVM 来完成仿真
KVM 可以 和 QEMU 这个 APP 来完成仿真, 可以用其他APP 来完成仿真
不过现实是 QEMU和KVM互相兼容,且搭配很好
术语“仿真器”可能更常用于描述模拟硬件环境的工具.
而“虚拟机”更专注于提供一个虚拟的执行环境。“虚拟的执行环境”
可以是一个 "硬件环境" , 即同仿真器
类似 kvm , vmware
也可以是一个进程
Java虚拟机(JVM)
“虚拟机”这个术语可以用来描述不同类型的虚拟化环境,可以是虚拟化的硬件,也可以是运行在操作系统之上的软件实体,提供一种特定的执行环境。
所以区分 这类东西 到底是虚拟机还是仿真器,没什么意义.
我们判断 这类东西,要看
1. 是 模拟了 一个 硬件环境 还是一个 进程
2. 是软件全模拟 还是有硬件支持的
解码执行支持: vm_exit&vm_enter/loongarch的翻译指令
中断支持: 虚拟中断注入
虚拟内存支持 :
时钟支持 :
- [ARMv7 的虚拟化支持 参考手册](https:
- [ARMv7 KVM 在 linux中的实现 1 代码静态分析](https:
- [ARMv7 KVM 在 linux中的实现 2 cpu角度](https:
- [ARMv7 KVM 在 linux中的实现 3 内存角度](https:
- [ARMv7 KVM 在 linux中的实现 4 irq角度](https:
- [ARMv7 KVM 在 linux中的实现 5 时钟](https:
- [ARMv7 KVM 在 linux中的实现 6 IO]
VMM
VMM是一个虚拟化平台 ,分类为 type1 和type2
VMM 有很多实现
QEMU+KVM+linux 是一种 VMM 的实现 ,属于 type2
我之前 认为 linux 本身就是 一个OS , 那么肯定不是 hyp
现在释然了, 为什么 hyp 就不能是一个OS
其实 对于 QEMU+KVM+linux 这种实现来说 , VMM 其实是一个进程 , 就是 qemu进程(内核态qemu代码和用户态kvm代码)
但是 kvm 用到了 内核的很多实现 , 例如 file_operations 结构体
可以这么说 kvm 代码 其实就是 半个内核,因为他用到了 很多内核的实现,而不是kvm自己实现的
虚拟化方案扩展阅读
https:
QEMU+KVM+linux 的仿真流程
QEMU/KVM 源码解析与应用 P136
现在我们只以 x86-linux 上 运行qemu 仿真 qemu-linux 为例,且此时 虚拟机的代码占用cpu
1. 虚拟机执行敏感指令退出,此时做一个 vm exit
2. 内核中kvm 如果能处理,则kvm做以下事情(A.处理(仿真) B.做一个vm entry)
3. 虚拟机开始执行指令
4. 虚拟机执行敏感指令退出,此时做一个 vm exit
5. 内核中kvm 如果不能处理, 则 返回用户空间,qemu接管 ,则qemu 做以下事情 (A.处理(仿真) B做一个 ioctl(KVM_RUN))
6. 内核中kvm 接收到 KVM_RUN , 则kvm 做以下事情(A.做一个vm entry)
7. 虚拟机开始执行指令
A. vm entry 和 vm exit
B. kvm 仿真
C. qemu 仿真
QEMU+KVM+linux 的仿真流程 的 架构支持(vm entry 和 vm exit)
A. vm entry 和 vm exit
B. kvm 仿真
C. qemu 仿真
其中 B C 和 架构 无关 , A 架构相关
A 处理的其实就是 vm entry 和 vm exit
在 x86_64 叫做 VMX root 和 VMX non-root 的切换 , 仿真平台 运行在 VMX root , 被仿真对象(内核态和用户态) 运行在 VMX non-root
在 armv8 叫做 EL2 和 EL1 的切换 , 仿真平台运行在 EL1 , 被仿真对象内核态运行在 EL1,切换时会用到EL2
在 armv7 叫做 PL2 和 PL1 的切换 , 仿真平台运行在 PL1 , 仿真平台内核态运行在 PL1,切换时用到PL2
我们梳理了 armv7 armv8 和 x86_64 的 vm entry 和 vm exit
但还是不知道 vm entry 和 vm exit 到底是什么
vm entry 和 vm exit 都是在一个 进程(qemu进程) 中 ,qemu进程是用户进程,分为 用户态(qemu代码)和内核态(kvm代码)
vm entry 是为了 调度 虚拟机(虚拟机的代码) 到 cpu , 是为了 执行虚拟机的指令
vm exit 是 为了 调度 实体机(kvm和qemu代码) 到 cpu, 是为了 仿真(执行)虚拟机 无法执行的指令
qemu进程整体(实体机时和虚拟机时)都是为了 仿真虚拟机