虚拟化(5):kvm+kernel kvm注册流程 VHE mode
1.dmesg | grep kvm
可以看到KVM以VHE mode启动
https://elixir.bootlin.com/linux/v6.6/source/arch/arm64/kvm/arm.c#L2458
VHE: 令Linux kernel 运行在EL2(Hypervisor模式), 减少EL1->EL2切换开销, 是一种armv8的硬件特性
VHE架构图:
对于KVM在arm64下的运行模式
这里默认使用的是KVM_MODE_DEFAULT,这个和下面的pkvm,都是软件特性
客户机(Guest OS)运行在 EL1,Hypervisor(Linux/KVM)运行在 EL2。
Pkvm: 进一步强化隔离,host kernel 无法访问 guest kernel (EL1) 的内存或状态
hypervisor 运行在 EL2,host kernel 运行在 EL1
guest kernel适用于安全敏感场景(如 Android 的安全虚拟化)
Pkvm架构图:
2./dev/kvm
2.1 definition
KVM 子系统的入口字符设备, 用户态(如 QEMU)首先 open("/dev/kvm"),得到一个 system 级 fd,随后通过一系列 ioctl 创建 VM fd、VCPU fd、KVM 设备 fd 并完成配置。
2.2 函数分类
KVM 的所有对外 UAPI(常量、结构体、ioctl 号等)定义在 include/uapi/linux/kvm.h
https://elixir.bootlin.com/linux/v6.6/source/include/uapi/linux/kvm.h#L926
针对arm架构的kvm初始化
https://elixir.bootlin.com/linux/v6.6/source/arch/arm64/kvm/arm.c#L2397
通用的kvm初始化流程
https://elixir.bootlin.com/linux/v6.6/source/virt/kvm/kvm_main.c#L5119
2.3函数流程
从dmesg中可以看出,来自如下函数
kvm_arm_init
https://elixir.bootlin.com/linux/v6.6/source/arch/arm64/kvm/arm.c#L2458
把宿主机的 EL2 环境与 KVM 体系结构能力一次性准备好: 模式(VHE/nVHE/pKVM)确定、IPA/SVE/VMID 就绪、异常向量/子系统装配完成;随后用户态(如 QEMU)调用 /dev/kvm 的各类 ioctl
主要是2451的子系统初始化,2467的kvm初始化,会进入通用架构初始化
kvm_init
https://elixir.bootlin.com/linux/v6.6/source/virt/kvm/kvm_main.c#L6052
注册kvm的虚拟化的电源管理状态
设置vCPU/irq/vfio等内容 , vfio是linux内核提供用于安全地将物理设备直通给虚拟机或用户态进程,常用于高性能虚拟化场景(如 QEMU/KVM + PCIe 设备直通)。
注册kvm_dev设备
kvm_dev
此时我们就是通过ioctl来进行后续操作
kvm_dev_ioctl
https://elixir.bootlin.com/linux/v6.6/source/virt/kvm/kvm_main.c#L5119
其中KVM_CREATE_VM就是用qemu创建虚拟机,这个我们下一次再讲
#嵌入式##嵌入式笔面经分享##嵌入式软开##笔试##秋招提前批启动你开冲了吗#