QEMU&KVM-1 memmory virtualization

简介: KVM全称是Kernel-based Virtual Machine, 目前开源的虚拟化技术包括XEN,KVM,QEMU 从上图看Xen的特点是硬件模拟这块直接由Xen Hypervisor进程完成,并且其是属于半虚拟化,也就是说Dom U里面的Guest OS需要一定改造 最右图属于使用QEMU的user mode emulation模式,不需要有Guest os,可运行user

KVM全称是Kernel-based Virtual Machine,

目前开源的虚拟化技术包括XEN,KVM,QEMU

  • 从上图看Xen的特点是硬件模拟这块直接由Xen Hypervisor进程完成,并且其是属于半虚拟化,也就是说Dom U里面的Guest OS需要一定改造
  • 最右图属于使用QEMU的user mode emulation模式,不需要有Guest os,可运行user mode application,通过TCG进行指令级的动态翻译(比如arm—x86),常用于指令集仿真场景。
  • 中间即KVM模式,属于全虚拟化,Guest OS的资源比如memory,irq等由qemu进程创建,qemu发起对KVM控制,调用cpu 切换到Guest OS运行。KVM属于linux kernel针对虚拟化的实现,x86 arch下对应intel VT-x,AMD-v技术(即vmx与svm)。

   接下来具体介绍下KVM,如下图

 

从进程角度讲qemu,host os,guest OS(这里os进程指kernel),三者是三个进程,三者相互交互。在guest OS的视角察觉不到其他两者(virtio这种半虚拟化除外)。如图一个qemu process负责运行一个guest os。

三者的关系一般为:

  • host os 通知qemu通过向其进程发送eventfd形式(qemu epoll it);
  • qemu控制host os一般通过对其设备节点/dev/kvm进行ioctl。
  • guest os一般不直接与host os,qemu进行交互,在guest OS 进程的视角是察觉不到host os与qemu,guest os一般直接发起对guest memory访问,该memory的io行为由虚拟化硬件功能比如iommu可以直接捕获。

kvm memory virtualization:

  • 结合上图先看右中部分,guest physical memory这块对于QEMU进程其实是一段virtual memory region即qemu全局的address_space_memory,申请到这块memory region会通过host os KVM模块 ioctl KVM_SET_USER_MEMORY_REGION的方式递交给HW EPT(Extension Page Table) MMU接管。
  • 看图中左下角部分当guest os 访问GPA时是由EPT转换成HPA访问。EPT主要类似MMU的PageTable用来负责维护GVA->GPA->HPA的映射关系。(这里针对intel VT-X)。

GVA:Guest Virtual Address  GPA:Guest Physical Address

HPA:Host Physical Address

memory region init:

  • 内存虚拟化的开始由qemu发起add memory region,该memory作为成guest os的physical memory使用,guest os image可以boot到该memory。
  • 调用流程如下:有qemu的main函数调用qemu_init,接着通过ioctl将memory托管给kvm,在kernel mode里,kvm创建mem slot,用于记录memory 相关数据,HVA,GPA,size,dirty page bitmap等,并加入mem  slot list,后续guest os 发生page fault过程会用到该数据。

memory io:

  • 如图在左侧QOM init后层层调用,通过ioctl KVM_RUN,切换到kernel mode, 调用vmx_vmenter更新vmcs切换进入Guest os mode,运行Guest OS。当Guest OS发生memory访问会产生hadrware EPT VILOATION(类似page fault)这时发生vmx_vmexit切换到Host os mode,进入EPT VIOLATION异常处理流程获取到访问内容,接着继续切入Guest os继续运行。

  • VFIO device create

在用户态将vfio分为container/group/device。通过打开dev/vfio 可以得到container,通过打来/dev/vfio/X 可以得到group。通过ioctl可以得到device

一个VM对应一个container,container可包含多个group,一个group可包含多个device

一般在pass through情况下container:group:device为1:1:1

具体VFIO介绍可参考

https://www.kernel.org/doc/Documentation/vfio.txt

下面为VFIO device创建过程

QEMU中依次获取到container,group,创建device,通过ioctl在linux KVM中创建VFIO设备

  • VFIO BAR 虚拟化

VFIO的pci设备memory 虚拟化主要是PCI BAR space的虚拟化。包括MMU参与的BAR mmap将HVA(GPA)转换成HPA,IOMMU参与的BAR remap将HVA转换成GPA(HVA).

如下图通过MMU+IOMMU即完成BAR GVA-->HPA的转换,intel cpu中该IOMMU技术称为VT-d

iommu driver位于linux-5.7.9/drivers/iommu/dmar.c。当guest 访问BAR时,会触发iommu 中断(类似于pagefault),从而访问到GPA(HVA)。

  • VFIO-PCI BAR mmap

下图是VFIO-PCI BAR mmap的过程,QEMU把已经创建的用户空间的bar memory region,通过

mmap vfio device设备节点/dev/vfio/xxx,映射到host kernel space,并做了pci_iomap, 对该region进行remap_pfn_range页表映射,即配置好mmu。

  • VFIO-PCI BAR remap

下图为 BAR remaping过程,涉及到vfio driver,iommu driver

这里说明下intel vt-x(EPT),vt-d (iommu) 是memory虚拟化的关键

相关文章
|
4月前
|
存储 网络协议 网络安全
ESXi 8.0U3h 新增功能简介
VMware ESXi 8.0U3h 发布 - 领先的裸机 Hypervisor
845 0
|
算法 5G 数据安全/隐私保护
大规模MIMO通信系统信道估计matlab性能仿真,对比LS,OMP,MOMP以及CoSaMP
本文介绍了大规模MIMO系统中的信道估计方法,包括最小二乘法(LS)、正交匹配追踪(OMP)、多正交匹配追踪(MOMP)和压缩感知算法CoSaMP。展示了MATLAB 2022a仿真的结果,验证了不同算法在信道估计中的表现。最小二乘法适用于非稀疏信道,而OMP、MOMP和CoSaMP更适合稀疏信道。MATLAB核心程序实现了这些算法并进行了性能对比。以下是部分
813 84
|
机器学习/深度学习 人工智能 运维
CodeFuse团队2024年10篇论文总结
CodeFuse 是蚂蚁集团开发的多语言代码大型语言模型(LLM),基于海量高质量代码数据和多任务微调技术,已在内部研发人员的编码、测试、运维等场景中广泛应用。2024年,CodeFuse 在国际顶会如ICSE、ICDE、KDD等发表多篇论文,涵盖CodeLLM、机器学习、AI等领域,并开源多个自研大模型,总下载量近200万。项目持续迭代,欢迎贡献和建议。
730 11
|
安全 Linux KVM
Linux虚拟化技术:从Xen到KVM
Xen和KVM是Linux平台上两种主要的虚拟化技术,各有优缺点和适用场景。通过对比两者的架构、性能、安全性、管理复杂性和硬件依赖性,可以更好地理解它们的适用场景和选择依据。无论是高性能计算、企业虚拟化还是云计算平台,合理选择和配置虚拟化技术是实现高效、稳定和安全IT环境的关键。
1042 8
|
存储 测试技术 网络安全
冲破内核限制:使用DPDK提高网络应用程序的性能(下)
冲破内核限制:使用DPDK提高网络应用程序的性能
|
安全 物联网 项目管理
玄铁VirtualZone:基于RISC-V架构的安全扩展
本文是RISC-V知识图谱系列中有关安全拓展的内容,主要介绍了RISC-V架构在实现TEE可信执行环境上所有具备的安全能力,并描述了基于RISC-V架构的玄铁C系列处理器实现的安全扩展。
3393 1
玄铁VirtualZone:基于RISC-V架构的安全扩展
|
安全 定位技术 数据安全/隐私保护
电脑BIOS密码的设置与修改方法
电脑BIOS密码的设置与修改方法
1060 2