QEMU 杂谈

QEMU&KVM
QEMU 是一套源码, 		开源的 ,代码 在 https://github.com/qemu/qemu
KVM 被并入了 Linux 内核, 开源的 ,代码 在 https://github.com/torvalds/linux
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)// JVM不是模拟硬件,而是提供一个虚拟的执行环境,用于执行Java程序。

“虚拟机”这个术语可以用来描述不同类型的虚拟化环境,可以是虚拟化的硬件,也可以是运行在操作系统之上的软件实体,提供一种特定的执行环境。

所以区分 这类东西 到底是虚拟机还是仿真器,没什么意义.
我们判断 这类东西,要看
	1. 是 模拟了 一个 硬件环境 还是一个 进程
	2. 是软件全模拟 还是有硬件支持的
		解码执行支持: vm_exit&vm_enter/loongarch的翻译指令
		中断支持: 虚拟中断注入
		虚拟内存支持 :
		时钟支持 : 
			- [ARMv7 的虚拟化支持 参考手册](https://blog.csdn.net/u011011827/article/details/120432705)
			- [ARMv7 KVM 在 linux中的实现 1 代码静态分析](https://blog.csdn.net/u011011827/article/details/120470296)
			- [ARMv7 KVM 在 linux中的实现 2 cpu角度](https://blog.csdn.net/u011011827/article/details/120473315)
			- [ARMv7 KVM 在 linux中的实现 3 内存角度](https://blog.csdn.net/u011011827/article/details/120471549)
			- [ARMv7 KVM 在 linux中的实现 4 irq角度](https://blog.csdn.net/u011011827/article/details/120471835)
			- [ARMv7 KVM 在 linux中的实现 5 时钟](https://blog.csdn.net/u011011827/article/details/120473006)
			- [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://embeddedinn.xyz/articles/tutorial/exploring_virtualization_in_riscv_machines/

在这里插入图片描述

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进程整体(实体机时和虚拟机时)都是为了 仿真虚拟机

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值