虚拟化(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架构图:

这篇文章讲VHE讲的不错

https://kernel-tour.org/archives/kvm/vhe.html#:~:text=%E5%9C%A8ARM%E4%B8%8A%EF%BC%8Ckernel%E6%98%AF%E8%BF%90%E8%A1%8C%E5%9C%A8EL1%E7%9A%84%EF%BC%8Ckvm%E7%9A%84%E9%83%A8%E5%88%86%E5%8A%9F%E8%83%BD%EF%BC%8C%E5%BF%85%E9%A1%BB%E4%BD%BF%E7%94%A8EL2%E6%9D%A5%E5%AE%9E%E7%8E%B0%EF%BC%88switch%20the%20world%20between%20host%20and%20guest%EF%BC%89%EF%BC%8C%E6%89%80%E4%BB%A5%E8%BF%99%E5%B0%B1%E5%AF%BC%E8%87%B4%E4%B8%80%E6%AC%A1VM%E8%AE%BF%E9%97%AE%EF%BC%8C%E9%9C%80%E8%A6%81%E9%80%9A%E8%BF%87VM,%28EL1%29%20%3C-%3E%20Hyp%20%28EL2%29%20%3C-%3E%20Kernel%20%28EL1%29%E5%9C%A8Host%E3%80%81Guest%E3%80%81Hyp%E9%97%B4%E7%BB%8F%E8%BF%87%E5%87%A0%E6%AC%A1EL%E5%92%8CSwitch%E5%88%87%E6%8D%A2%E3%80%82

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

#嵌入式##嵌入式笔面经分享##嵌入式软开##笔试##秋招提前批启动你开冲了吗#
qemu+kernel 文章被收录于专栏

qemu+kernel

全部评论

相关推荐

看起来名字可以很长:笑死 我暑期实习阿里云的意向也被 qq 邮箱放在垃圾箱了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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