KVM,pKVM on arm64

本文详细介绍了KVM在arm64平台上的两种模式:non VHE模式和VHE模式。non VHE模式中,KVM模块在host kernel @EL1和EL2之间切换,导致一定的性能损耗;而VHE模式通过让host kernel运行在EL2,减少了切换,提高了效率。在两种模式下,VM都需要完全信任host kernel,且GIC虚拟化和设备通过IOMMU的配置都在host kernel中进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文适合对KVM构架和arm CPU构架有一定了解的读者。讲解non VHE KVM, VHE KVM和Protected KVM

查看原文:
https://mp.weixin.qq.com/s/UhZoNayBlc8tzBgqv9n1RA

在这里插入图片描述

KVMon arm64 – non VHE mode
在armv8/v9non VHE模式时,kvm部分运行在hostkernel@EL1,部分运行在EL2.
在hostkernel里面的KVM当成其kernel module, 主要负责给VM分配管理内存,创建VM的stage2 MMU页表,处理一些trap,虚拟GIC和timer,将不能处理的trap转交给userspace处理等
在EL2的KVM部分主要是设置EL2才有权限配置的trap,stage2 MMU, GIC/Timer寄存器,并负责host/VM/hypervisor的context switch

Hostkernel对包括VM内存在内的所有内存有管理和访问权限
GIC的虚拟化的实现和为device pass-through服务的IOMMU设置也是在host kernel里配置的
VM需要完全信任host kernel
non VHE模式因为有比较多的host EL1-- EL2 hypervisor– VM EL1/EL0的切换,一定程度上性能有所损耗

KVMon arm64 – VHE mode
为了减少nonVHE模式host EL1-- EL2 hypervisor–VM EL1/EL0的切换损耗,armv8.1引入VHE模式的支持,通过修改构架使host kernel可以运行在EL2,和KVM module完全都在同一EL2
VM的物理内存分配,stage2 MMU页表的建立和MMU寄存器的设置,vGIC的实现和vIRQ的产生和注入,timer虚拟化的实现和设置, trap的使能和处理都可

<think>好的,用户想了解pkvm_create_hyp_vm()函数的功能和用法。首先,我需要回忆一下KVMARM架构中的初始化流程。根据用户提供的引用,这个函数可能是在ARMv8的KVM实现中,特别是在EL2层的Hypervisor部分。 首先,pkvm_create_hyp_vm()可能与创建虚拟机有关。在KVM中,每个虚拟机需要一个VM结构体来管理资源。ARM架构下,EL2是Hypervisor运行的特权级别,所以这个函数可能负责在EL2层为新的虚拟机分配内存或初始化结构。 接下来,功能解析部分需要说明该函数的作用。可能包括分配VM结构体内存、初始化EL2页表、设置虚拟CPU等。需要确认这是否属于保留内存的一部分,如引用中提到的reserved_mem.c中的kvm_hyp_reserve函数,可能两者有关联。 使用说明方面,这个函数可能由KVM模块在创建虚拟机时调用,比如在用户空间通过ioctl触发KVM_CREATE_VM时,内核层会调用到该函数。需要注意调用上下文,确保在EL2模式下执行,并且参数正确传递,比如配置结构体可能包含内存布局等信息。 文档部分,用户可能需要查看内核源码中的注释,或者ARM的文档。可能需要指出具体的文件和代码位置,比如在arch/arm64/kvm/hyp目录下,或者与pKVM(Protected KVM)相关的实现,因为函数名中的“pkvm”可能指Protected KVM,这是ARM的安全扩展功能。 另外,用户可能是在开发或调试KVM相关功能时遇到问题,需要了解底层函数的作用。可能需要提醒用户注意版本差异,因为不同内核版本函数实现可能不同。同时,建议用户查阅官方文档或社区资源获取最新信息。 最后,生成的相关问题需要围绕该函数展开,比如使用场景、参数解析、内存管理机制和调试方法等,帮助用户深入理解。</think>### pkvm_create_hyp_vm() 函数解析 #### 功能解析 1. **虚拟机管理** `pkvm_create_hyp_vm()` 是ARM KVM中用于创建Hypervisor(EL2特权级)管理的虚拟机实例的核心函数。它通常在物理机初始化阶段或动态创建虚拟机时被调用,负责为虚拟机分配必要的EL2层资源[^1]。 2. **内存与页表初始化** 函数会为虚拟机初始化EL2阶段的页表结构,包括: - 分配`struct kvm`结构体内存 - 设置虚拟机内存映射关系(如IPA到PA的转换) - 处理`kvm_hyp_reserve`保留内存区域的映射 3. **安全隔离支持** 若启用了pKVM(Protected KVM),该函数还会初始化虚拟机之间的隔离机制,确保不同虚拟机/物理机间的内存访问权限隔离。 #### 使用说明 ```c // 典型调用路径 kvm_vm_ioctl() // 用户态触发KVM_CREATE_VM -> kvm_create_vm() -> pkvm_create_hyp_vm() ``` **参数要求**: - 需要传递虚拟机配置参数(如内存布局) - 必须在EL2特权级下执行 - 依赖预先初始化的Hyp保留内存池 **返回值**: - 成功时返回指向`struct kvm`的指针 - 失败时返回错误码(如`-ENOMEM`) #### 文档参考 1. 代码位置: `arch/arm64/kvm/hyp/pkvm.c`(内核版本不同可能路径有差异) 2. 关键结构体: ```c struct pkvm_hyp_vm { struct kvm kvm; struct kvm_pgtable mmu; atomic_t refcount; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值