asp购物网站,wordpress引用轮播图文件,wordpress菜单移到右边,唐朝网站的地址这篇文章将深入分析Linux中虚拟化技术的实现----KVM技术#xff0c;从KVM技术的简介、技术架构、以及虚拟机和宿主机交互的重要处理逻辑出发#xff0c;深入探究KVM技术的实现。
一、KVM简介#xff1a;
首先#xff0c;我们先查看一下KVM架构#xff0c;看看它的整体工…这篇文章将深入分析Linux中虚拟化技术的实现----KVM技术从KVM技术的简介、技术架构、以及虚拟机和宿主机交互的重要处理逻辑出发深入探究KVM技术的实现。
一、KVM简介
首先我们先查看一下KVM架构看看它的整体工作流程 上图展示了KVMKernel-based Virtual Machine的架构及其与QEMU的交互。以下是对该架构的说明 KVM Guest虚拟机客户机 Applications应用程序这是运行在虚拟机内的上层应用程序。File system and block devices文件系统和块设备 和 Drivers驱动程序这些组件为应用程序提供对存储设备的访问。VCPU虚拟CPU虚拟机内的虚拟处理器图中展示了vcpu0到vcpuN代表多个虚拟CPU。 Hardware Emulation (QEMU) QEMU硬件模拟QEMU负责模拟硬件使得虚拟机可以运行在不同于宿主机硬件的环境中。ioTHREAD这是QEMU中的一个线程负责生成I/O请求并处理这些请求,ioTHREAD代表虚拟机处理输入/输出操作如读写磁盘数据。 KVM (kvm.ko) KVM模块kvm.ko这是Linux内核中的一个模块用于直接在内核中实现虚拟化功能。KVM本身不实现硬件模拟而是与QEMU结合使用通过QEMU进行硬件模拟。File system and block devices文件系统和块设备 和 Physical drivers物理驱动程序这些组件用于连接KVM模块与实际的硬件如磁盘。 Hardware硬件 CPU中央处理器物理CPU被虚拟化为多个虚拟CPU如cpu0, cpuN供虚拟机使用。Disk磁盘物理存储设备被虚拟机通过文件系统和块设备访问。
KVM与QEMU的交互
QEMU通过IOTHREAD生成I/O请求并处理这些请求这些请求代表虚拟机与硬件的交互。KVM模块kvm.ko在Linux内核中运行管理虚拟机的VCPU并与QEMU协作确保虚拟机能够运行并访问硬件资源。整个系统通过qemu_mutex机制确保在任何时刻只有一个线程可以运行QEMU代码从而避免竞态条件和数据不一致。在创建虚拟机时QEMU会调用KVM提供的接口来创建虚拟机、分配vCPU等。同时QEMU还负责模拟虚拟机的其他硬件设备如网卡、串口等。在虚拟机运行过程中QEMU会发起对vCPU的运行请求KVM则负责实际运行vCPU并在需要时与QEMU进行交互如处理I/O请求等。
总结来说KVM和QEMU的结合提供了一种高效的虚拟化解决方案KVM负责虚拟CPU的管理和调度而QEMU则负责硬件模拟和I/O处理两者紧密协作使得虚拟机能够在宿主机上高效运行。
综上所述QEMU和KVM通过特定的接口和机制进行交互共同实现了虚拟机的创建、运行和I/O虚拟化处理等功能。
二、深入KVM工作流程
通过下图来解析KVM的工作流程 通过上图所示QEMU与KVM整体架构图可以详细了解KVMKernel-based Virtual Machine的工作流程。下面通过举例来说明KVM的工作流程 硬件平台与系统总线 图左侧显示了一个模拟平台包含系统总线、VGA、PCI总线、内存及vCPU等硬件资源。这些资源通过QEMU进行模拟并在宿主机上实现虚拟化。 KVM API与主循环 宿主机内核中包含了KVM API/dev/kvm通过该接口用户空间的QEMU进程可以与内核中的虚拟化模块进行交互。QEMU通过KVM API将虚拟机的指令和操作传递给KVM模块。 虚拟机入口VM Entry 当虚拟机需要执行时通过VM Entry进入虚拟机环境。此时虚拟机的vCPU与宿主机上的物理CPU进行交互。网卡驱动、磁盘驱动和显卡驱动等虚拟机设备驱动通过gCR3表影子页表与宿主机资源进行映射和交互。 虚拟机状态与挂起/恢复 VMCSVirtual Machine Control Structure保存了虚拟机的状态包括物理机状态和虚拟机状态。当虚拟机需要挂起时例如保存当前运行状态其状态信息会被保存到VMCS中。恢复时通过检查挂起的信号如果满足进入Guest模式的条件则通过handle exit处理退出事件并重新进入虚拟机执行。 应用程序与虚拟机 虚拟机中的应用程序1和应用程序2通过vCPU执行vCPU通过影子页表gCR3访问宿主机资源。虚拟机中的操作通过VCPU与QEMU进行交互QEMU再通过KVM API将操作传递给KVM模块处理。
示例说明 假设有一个宿主机运行Linux操作系统并在其上通过KVM和QEMU创建了一个Ubuntu虚拟机。 启动虚拟机 用户启动QEMU进程通过KVM API创建和初始化虚拟机的vCPU、内存和I/O设备等资源。QEMU将虚拟机的指令和操作通过KVM API传递给KVM模块KVM模块将这些操作映射到宿主机的物理CPU和内存上。 虚拟机运行 虚拟机启动后其vCPU通过VM Entry进入虚拟机环境开始执行Ubuntu操作系统。虚拟机中的应用程序在vCPU上运行并通过影子页表也可使用EPT方式访问宿主机的硬件资源例如通过网络驱动访问网络通过磁盘驱动访问存储设备等。 挂起与恢复 假设虚拟机正在进行一个长时间的计算任务用户决定暂时挂起虚拟机去处理其他事情。QEMU通过KVM API将虚拟机的当前状态包括CPU寄存器、内存状态等保存到VMCS中。用户事情处理完后决定恢复虚拟机QEMU通过KVM API从VMCS中恢复虚拟机状态并通过handle exit处理恢复逻辑使虚拟机继续执行之前的任务。
本篇博客主要分析了KVM模块和QEMU的整体架构、以及它们是如何协同工作的后面会深入内核源码去探究KVM模块的具体实现。
本博客的内容参考了书籍《QEMU_KVM源码解析与应用》
欢迎大家一起来探讨虚拟化技术后期我会针对KVM技术进行更深入的分析并且会结合eBPF技术分享如何去观测KVM模块大家可以持续关注专栏《虚拟化技术》。