QEMU-KVM 简介
前言
去qemu官网https:
当 qemu 不与 KVM 合作的时候, 是一个 emulator
当 QEMU 与 KVM 合作的时候, 是 virtualizer , 此时不支持异构仿真
另外,可以根据此链接中去查看 QEMU 和 KVM的区别
https:
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 中断注入" , 将设备直通给 虚拟机
QEMU 与 KVM 调试平台搭建
ARMv7
- ubuntu armhf cloud 发行版 仿真
- [ubuntu armhf server 发行版 仿真 NULL
- [ubuntu armhf iot 发行版 raspi2 仿真]
- [ubuntu armhf desktop 发行版 仿真 NULL
ARMv8
TODO
delete cloud_init
- [ubuntu arm64 server 发行版 仿真]
- [ubuntu arm64 iot 发行版 raspi3 仿真]
- [ubuntu arm64 desktop 发行版 仿真]
X86_64
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.在用户地址空间内申请内存
2.将内存组成 ram1 ram2 rom1 rom2
3.将ram1 rom1分类成memory,将ram2 rom2分类成io
------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的 VHE : http:
X86_64
riscv
其他
QEMU 代码分析
KVM 代码分析
https:
用到的技术
1. 三个fd
/dev/kvm 的 fd
虚机 的 fd
vcpu 的fd
https:
https:
https:
其他问题
- ARMv7 和 ARMv8的虚拟化及linux实现一样吗?
有些不一样, 但是整体类似
所以我暂时 以 ARMv7 入手