QEMU-KVM 文章总览

QEMU-KVM 简介

前言

去qemu官网https://www.qemu.org/ 可以看到 QEMU 是一个 A generic and open source machine emulator and virtualizer

当 qemu 不与 KVM 合作的时候, 是一个 emulator 
当 QEMU 与 KVM 合作的时候, 是 virtualizer , 此时不支持异构仿真


另外,可以根据此链接中去查看 QEMU 和 KVM的区别
https://zh.wikipedia.org/wiki/%E8%99%9B%E6%93%AC%E6%A9%9F%E5%99%A8#%E8%99%9B%E6%93%AC%E6%A9%9F%E5%99%A8%E6%AF%94%E8%BC%83

x86_64 linux 下运行的 qemu 实例

虚拟化技术方案

设备虚拟化

[中断虚拟化]

不管怎么样肯定要经过 流程 "对 guest os 中断注入"
	x86的中断注入 是 写 VMCS 中的 "VM-entry interruption-information field"
	arm 呢 ? TODO
但是中断注入前,分为几种
	1. host os 利用 物理设备的功能 完成 "虚拟设备模拟", "虚拟设备模拟" 代码调用  "对 guest os 中断注入"
		对于x86来说 , 有几种中断控制器 , 就会有几种中断模拟
		对于arm也是如此(gicv2,gicv3)
	2. host os 直接调用 	"对 guest os 中断注入" , 将设备直通给 虚拟机// 这个请参考 "设备虚拟化" 中的 VFIO


QEMU 与 KVM 调试平台搭建

ARMv7


ARMv8


TODO
delete cloud_init
  • [ubuntu arm64 server 发行版 仿真]
  • [ubuntu arm64 iot 发行版 raspi3 仿真]
  • [ubuntu arm64 desktop 发行版 仿真]

X86_64

  • [X86_64 虚拟化调试平台搭建]

riscv

  • [riscv 虚拟化调试平台搭建]

各个架构对KVM的支持及代码实现

ARMv7

理论角度

从目前来看,异常分类
	irq 都会进入 host_PL2 ,然后进入 guest_PL1
	二级页错误 会进入 异常,但是怎么进入的,TODO
	trap ???
实际代码分析-kvm侧
多个页目录表 及 页表初始化过程 及 访存异常过程
  • [little-qemu&guest 中的 虚拟机IO角度分析]
架构没定义IO的访问
这块由软件(virtio)定义,慢慢有硬件往virtio靠拢,支持virtio协议
多个 异常向量表
	host 中的 PL2  : __kvm_hyp_vector_ic_inv
	host 中的 PL1  : __vectors_start
	guest 中的 PL1 : __vectors_start
异常发生过程
实际代码分析-qemu侧
  • [基于 armhf-qemu 的 ARMv7 linux-5.6 qemu-KVM 代码分析 qemu与kvm的内存管理]
------qemu内存管理-----
1.在用户地址空间内申请内存 						// 1 对应 RAMBlock,
2.将内存组成 ram1 ram2 rom1 rom2					// 2对应 MemoryRegion,
3.将ram1 rom1分类成memory,将ram2 rom2分类成io	// 3对应AddressSpace
------kvm内存管理-----
1.qemu将MemoryRegion转换成FlatView
2.qemu并维护qemu中的KVMSlot相关的kvm_userspace_memory_region
3.qemu并通过ioctl(KVM_SET_USER_MEMORY_REGION)传递到kvm
4.更新 KVM 中的kvm_memory_slot

ARMv8

  • [ARMv8 的虚拟化支持]
ARMv8的 VHE : http://tinylab.org/kvm-intro-part1

X86_64

riscv




其他

QEMU 代码分析

KVM 代码分析

  • 架构无关部分
https://elixir.bootlin.com/linux/v5.11/source/virt/kvm
用到的技术
	1. 三个fd
		/dev/kvm 的 fd
		虚机 的 fd
		vcpu 的fd
  • 架构相关部分
// 这部分可参考 各个架构对KVM的支持及代码实现
https://elixir.bootlin.com/linux/v5.11/source/arch/x86/kvm
https://elixir.bootlin.com/linux/v5.11/source/arch/arm64/kvm
https://elixir.bootlin.com/linux/v5.6/source/arch/arm/kvm

其他问题

  • ARMv7 和 ARMv8的虚拟化及linux实现一样吗?
有些不一样, 但是整体类似
所以我暂时 以 ARMv7 入手

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/120431923
今日推荐