虚拟化(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创建虚拟机,这个我们下一次再讲

#嵌入式##嵌入式笔面经分享##嵌入式软开##笔试##秋招提前批启动你开冲了吗#
全部评论

相关推荐

点赞 评论 收藏
分享
09-16 14:01
井冈山大学 Java
肖先生~:兄弟们,我发的她都点赞了,但是就是不给我微信
秋招被确诊为……
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务