Linux_KVM虚拟化源代码分析

合集下载

精品课件-KVM虚拟化技术基础与实践-第五章

精品课件-KVM虚拟化技术基础与实践-第五章

第5章 KVM内核模块解析
Guest OS执行一些特权指令或者外部事件时,比 如I/O访问、对控制寄存器的操作、MSR(Microsoft Reserved Partition)的读写数据包到达等,都会导致物理 CPU发生VM Exit,停止运行Guest OS代码。将Guest OS保存 到VMCS中,Host状态装入物理处理器中,处理器进入内核态, KVM取得控制权,通过读取VMCS中VM_EXIT_REASON字段得到 引起VM Exit的原因,从而调用kvm_exit_handler处理函数。 如果由于I/O获得信号到达,则退出到用户模式的QEMU进行 处理。处理完毕后,重新进入客户模式运行虚拟CPU。
第5章 KVM内核模块解析
5.2.4 VM ioctl调用 VM ioctl指令实现对虚拟机的控制,大多需要从 KVM_CREATE_VM中返回的fd来进行操作,具体操作包括:配置 内存、配置vCPU、运行虚拟机等,主要指令如下: (1) KVM_CREATE_VCPU为虚拟机创建vCPU。 (2) KVM_RUN根据kvm_run结构体信息,运行VM虚拟机。 (3) KVM_CREATE_IRQCHIP创建虚拟APIC,且随后创建的vCPU 都关联到此APIC。 (4) KVM_IRQ_LINE对某虚拟APIC发出中断信号。
第5章 KVM内核模块解析
开始
用户模式 Qemu
内核模式 KVM Driver
执行ioctl 系统调用
进入 客户模式
处理退出
客户模式 Guest OS
执行 客户代码
处理 I/O
Yes I/O? No
VMX Root Operation
信号到达
VMX Non Root Operation

KVM的工作原理

KVM的工作原理

KVM的工作原理KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,它允许在一台物理主机上运行多个虚拟机。

KVM的工作原理可以分为三个主要方面:硬件虚拟化支持、内核模块和用户空间工具。

1. 硬件虚拟化支持:KVM利用现代处理器的硬件虚拟化技术(如Intel的VT-x和AMD的AMD-V)来提供虚拟化的基础。

这些技术允许虚拟机在物理主机上直接运行,并提供了对虚拟机的隔离和保护。

硬件虚拟化支持包括虚拟化扩展、虚拟I/O设备和内存管理。

2. 内核模块:KVM是一个内核模块,它与Linux内核紧密集成。

当KVM模块加载到内核中时,它将Linux内核转变为一个虚拟化管理程序。

KVM通过使用虚拟CPU (vCPU)和虚拟内存管理单元(MMU)来为每个虚拟机提供运行环境。

KVM还负责处理虚拟机的调度、内存管理和设备模拟等任务。

3. 用户空间工具:KVM提供了一组用户空间工具,用于管理和配置虚拟机。

其中最重要的工具是QEMU(Quick EMUlator),它是一个开源的虚拟机监控程序。

QEMU提供了虚拟机的设备模拟、磁盘和网络的管理等功能。

除了QEMU,KVM还提供了一些命令行工具(如kvm、kvm_stat和kvm_host)和图形界面工具(如virt-manager和virt-viewer)。

KVM的工作流程如下:1. 用户通过管理工具(如virt-manager)创建虚拟机配置文件,并指定虚拟机的硬件配置、磁盘映像和网络设置等。

2. KVM模块加载到Linux内核中,并创建一个虚拟化环境。

3. 当用户启动虚拟机时,KVM模块会为虚拟机创建一个vCPU,并将虚拟机的代码和数据加载到虚拟内存中。

4. 虚拟机的代码在vCPU上运行,并通过KVM模块与物理主机的硬件进行交互。

KVM模块负责将虚拟机的指令翻译为物理主机的指令,并将虚拟机的内存访问映射到物理主机的内存。

5. 虚拟机的设备模拟由QEMU负责。

KVM:驶入虚拟化快车道:发现LinuxKVM

KVM:驶入虚拟化快车道:发现LinuxKVM

此每个客 户机都要与管理程序合作以完成 最 受 保 护 的 区 域 中 执 行 。 正 因为 如此 ,虚
对底 层 硬 件 的 虚 拟 化 。
拟化方案 ,( 如V Mwa r e 等)会预扫描要执
件模拟或硬件仿真。
完 全 虚 拟 化 的 例 子 包 括 商 业 化 的 虚 拟 行 的 代 码 ,从 而 用 转 移 指 令 来替 换 这 些 指
系 统 ,如 图 l 所示。
在 管理 程序之 上的是
引入
虚 拟 化 是 一 个存 在 了较 长 时 间 的概 念 了 。 简单 地 说 ,这就 是 将 某 物 拿 来并 将 它 变成 看 起 来 像 别 的什 么东 西 。将 此 概 念 运 用到 一 个 计算 机 系统 中就 允 许 不 同 的 用户 对单 一 的 系统 拥有 不 同的 视 图 ( 例 如 ,一
两 种 最普 通 的虚 拟 化 方 法 是 完 全 虚 拟 素 。在 虚 拟 化 方 案 的 底 部是 被 虚 拟 化 的 机 器 。这 台 机 器 可 能 支持 也 可 能不 直 接 支持
来 ,L i n u x虚 拟 化 这道 风 景 的 一个 改 变 却
是 引人 了内核 虚拟 机 或 KVM 。KV M 是 传 化和 准 虚 拟化 。
' . F 户机操作, I E 坑 ' . F 户机操 作, I E 坑
( 虚拟机 ) 瓤机)
蕾强程序 ( 虚 拟掌 L 监■曩序 ( V MM))

是管理程序 ( h y p e r v i s o r )
使 它 们 有 了这 种 “ 错觉” 。 当 今 ,虚 拟化 方 案 的

d o ws的计 算 机 系统 ) ,这 通 常被 称 为 完全

kvm虚拟化工作原理

kvm虚拟化工作原理

kvm虚拟化工作原理KVM虚拟化工作原理KVM是一种开源的虚拟化技术,它是Linux内核中自带的一种虚拟化模块。

KVM全称为Kernel-based Virtual Machine,即基于内核的虚拟机。

它可以将物理服务器划分为多个独立的虚拟机,每个虚拟机都可以运行不同的操作系统和应用程序。

本文将详细介绍KVM虚拟化工作原理。

1. KVM架构KVM架构主要由三部分组成:Linux内核、QEMU和libvirt。

其中,Linux内核提供了硬件抽象层和CPU虚拟化技术,QEMU提供了设备模型和磁盘映像管理等功能,libvirt则是一个高级API,用于管理虚拟机生命周期、配置和监控等。

2. KVM CPU虚拟化CPU虚拟化是KVM最重要的部分之一。

在CPU虚拟化中,KVM利用了Intel VT或AMD-V等硬件扩展来实现对CPU资源的管理。

这些硬件扩展提供了一种称为“硬件辅助的虚拟化技术”,使得操作系统可以在不知道自己被虚拟化的情况下运行。

具体来说,在CPU虚拟化中,KVM将每个虚拟机视为一个独立的进程,并为其分配一组虚拟CPU。

当虚拟机运行时,KVM会将虚拟CPU指令转换为物理CPU指令,并利用硬件扩展提供的特殊指令来实现对CPU资源的隔离和管理。

这样,每个虚拟机就可以像运行在物理服务器上一样运行。

3. KVM设备模型KVM设备模型是QEMU的一部分,它提供了对各种设备(如磁盘、网卡、USB等)的模拟和管理。

在设备模型中,每个虚拟机都被视为一个独立的计算机系统,具有自己的设备树和驱动程序。

具体来说,在设备模型中,QEMU会模拟各种硬件设备,并将其映射到虚拟机中。

例如,在磁盘映像管理中,QEMU会将虚拟机硬盘映像文件与物理服务器上的实际磁盘进行关联,并通过驱动程序来实现数据读写等操作。

4. KVM网络管理KVM网络管理是指对虚拟网络进行配置和管理。

在KVM中,每个虚拟机都可以配置多个网络接口,并且可以使用不同类型的网络连接方式(如桥接、NAT等)。

Linux KVM虚拟机PVE使用指南

Linux KVM虚拟机PVE使用指南

Linux KVM虚拟机PVE使用指南1引言KVM (全称是 Kernel-based Virtual Machine) 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块 kvm.ko 提供和虚拟化核心架构和处理器规范模块。

使用 KVM 可允许多个包括 Linux 和 Windows 每个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等PVE使用图形化安装方式,支持裸机安装,管理界面是WEB方式,易于操作,浏览器(fireox,chrome等)支持JAVA即可以进行guest OS的图形管理,无须安装客户端,方便快捷。

本文将详细介绍PVE的安装,使用,部署优化等各方面的内容。

2KVM/QEMU体系架构2.1总体架构QEMU作为一个开源的硬件模拟器项目,除了支持x86体系架构之外,还支持ARM、MIPS、PowerPC、IA64等多种硬件架构。

QEMU采用模块化设计的方法,因此,还能支持多种多样的外设硬件,并且能够方便地进行扩充。

除了支持KVM之外,QEMU还支持全模拟化和kqemu加速模块等方式,这三种方式的架构区别如图5-6所示。

第一种模式是通过kqemu模块实现内核态的加速。

通过在内核中加入kqemu 的相关模块,在用户态的QEMU则通过访问/dev/kqemu设备文件接口调用改进型加速。

在这种模式中,主要针对虚拟机和宿主机运行于统一架构的情况下进行虚拟化。

第二种模式是在用户态直接运行QEMU,由QEMU对目标机的所有指令进行翻译后执行,相当于全虚拟化。

在这种模式下,可以运行各种不同形态的体系结构,如Android开发环境中即使用了QEMU来为其模拟ARM运行环境,但是在这种模拟环境下,每一条目标机的执行指令都需要耗费少则数个,多则成千上万个宿主机的指令周期来模拟实现,速度方面不太理想。

第三种模式则是KVM官方提供的kvm-qemu加速模式。

运行在内核态的KVM 模块通过/dev/kvm字符设备文件向外提供操作接口。

KVM虚拟化(一)——介绍与简单使用

KVM虚拟化(一)——介绍与简单使用

KVM虚拟化(一)——介绍与简单使用KVM(Kernel-based Virtual Machine)是一种基于Linux内核的开源虚拟化技术,它允许在一台物理服务器上运行多个虚拟机。

KVM使用了Linux内核的虚拟化扩展,支持x86、x86-64、ARM等处理器架构。

KVM的核心思想是将Linux内核转化为一个虚拟化的管理层,这个管理层被称为Hypervisor。

Hypervisor负责管理虚拟机的创建、销毁和调度,同时它也负责为虚拟机提供一些虚拟设备,如虚拟CPU、虚拟内存、虚拟磁盘等。

KVM虚拟机运行在用户空间下,由Linux内核作为宿主机。

KVM的优势包括:1.性能高效:由于KVM直接运行在硬件上,因此虚拟机与宿主机几乎没有性能差异。

2. 安全可靠:KVM利用Linux内核的安全机制,可以隔离虚拟机之间,提供更高的安全性。

3. 灵活性:KVM虚拟机能够支持多种操作系统,如Linux、Windows、FreeBSD等。

4. 易于管理:KVM提供了丰富的管理工具,如virsh和virt-manager,可以方便地创建、配置和监控虚拟机。

下面我们来看一下KVM的简单使用。

首先需要确认宿主机是否支持KVM虚拟化。

可以通过以下命令来确认:```shellegrep -c '(vmx,svm)' /proc/cpuinfo```如果输出结果大于0,则表示宿主机支持KVM虚拟化。

接下来,我们需要安装KVM软件包。

在大多数Linux发行版中,kvm 和libvirt已经默认安装。

如果没有安装,可以通过以下命令来安装:```shellsudo apt-get install qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils```安装完成后,我们可以通过以下命令来确认KVM是否安装成功:```shellvirsh list```如果输出结果是空的,则表示KVM安装成功。

kvm 模块 编译

kvm 模块编译一、什么是 kvm 模块KVM(Kernel-based Virtual Machine)是一个开源的全虚拟化解决方案,它是Linux 内核的一部分,通过将虚拟化功能直接集成到内核中,提供了一种轻量级的虚拟化解决方案。

kvm 模块是用于在 Linux 内核中支持虚拟化的模块,它提供了一组接口和功能,使得用户能够使用 KVM 技术创建和管理虚拟机。

二、为什么需要编译 kvm 模块在大多数 Linux 发行版中,kvm 模块通常是作为内核的一个模块提供的,而不是默认内核的一部分。

因此,如果我们想要使用 KVM 技术创建和管理虚拟机,就需要在 Linux 内核中编译并加载 kvm 模块。

编译 kvm 模块的好处是可以根据自己的需要定制内核,只包含所需的模块,从而提高系统的性能和安全性。

此外,编译 kvm 模块还可以解决一些兼容性问题,确保 kvm 模块与当前系统环境的兼容性。

三、编译 kvm 模块的步骤下面是编译 kvm 模块的详细步骤:1. 准备编译环境在开始编译 kvm 模块之前,我们需要确保系统中已经安装了所需的编译工具和依赖项。

通常情况下,需要安装以下软件包:•gcc:C 语言编译器•make:构建工具•kernel-devel:内核开发包2. 下载内核源代码在编译 kvm 模块之前,我们需要下载与当前运行的内核版本相对应的内核源代码。

可以从 Linux 内核的官方网站或者使用发行版提供的工具下载内核源代码。

3. 配置内核编译选项进入内核源代码目录,并执行以下命令来配置内核编译选项:make menuconfig在配置界面中,可以根据需要选择和定制所需的功能和模块。

确保启用 kvm 模块和相关的虚拟化选项。

4. 编译内核配置完成后,执行以下命令来编译内核:make这个过程可能需要一些时间,取决于系统的配置和硬件性能。

5. 编译 kvm 模块编译完成后,进入 kvm 模块的源代码目录,并执行以下命令来编译 kvm 模块:make6. 安装 kvm 模块编译完成后,执行以下命令来安装 kvm 模块:make install这将把 kvm 模块复制到系统的模块目录中,并更新内核的模块依赖关系。

Linux KVM虚拟机PVE使用指南

Linux KVM虚拟机PVE使用指南1引言KVM (全称是 Kernel-based Virtual Machine) 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块 kvm.ko 提供和虚拟化核心架构和处理器规范模块。

使用 KVM 可允许多个包括 Linux 和 Windows 每个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等PVE使用图形化安装方式,支持裸机安装,管理界面是WEB方式,易于操作,浏览器(fireox,chrome等)支持JAVA即可以进行guest OS的图形管理,无须安装客户端,方便快捷。

本文将详细介绍PVE的安装,使用,部署优化等各方面的内容。

2KVM/QEMU体系架构2.1总体架构QEMU作为一个开源的硬件模拟器项目,除了支持x86体系架构之外,还支持ARM、MIPS、PowerPC、IA64等多种硬件架构。

QEMU采用模块化设计的方法,因此,还能支持多种多样的外设硬件,并且能够方便地进行扩充。

除了支持KVM之外,QEMU还支持全模拟化和kqemu加速模块等方式,这三种方式的架构区别如图5-6所示。

第一种模式是通过kqemu模块实现内核态的加速。

通过在内核中加入kqemu 的相关模块,在用户态的QEMU则通过访问/dev/kqemu设备文件接口调用改进型加速。

在这种模式中,主要针对虚拟机和宿主机运行于统一架构的情况下进行虚拟化。

第二种模式是在用户态直接运行QEMU,由QEMU对目标机的所有指令进行翻译后执行,相当于全虚拟化。

在这种模式下,可以运行各种不同形态的体系结构,如Android开发环境中即使用了QEMU来为其模拟ARM运行环境,但是在这种模拟环境下,每一条目标机的执行指令都需要耗费少则数个,多则成千上万个宿主机的指令周期来模拟实现,速度方面不太理想。

第三种模式则是KVM官方提供的kvm-qemu加速模式。

运行在内核态的KVM 模块通过/dev/kvm字符设备文件向外提供操作接口。

Linux的虚拟化技术

Linux的虚拟化技术Linux是一款流行的开源操作系统,在全球范围内受到广泛应用。

它拥有许多强大的功能和工具,因此成为许多企业和个人用户的首选系统。

其中一个最重要的特点就是它的虚拟化技术。

在这篇文章中,我们将介绍Linux的虚拟化技术,并探讨它们的应用和优势。

虚拟化技术的意义虚拟化技术是一种使物理计算机能够运行多个虚拟计算机的技术。

这种技术基于将多个模拟的计算机系统运行在一个实际的物理计算机系统上。

这种技术是现代计算机系统中非常重要的一项技术,它给用户和企业带来了许多好处。

首先,虚拟化技术可以消除物理计算机数量的限制。

由于虚拟化技术允许在一个机器上运行多个虚拟机,因此用户可以利用资源更加高效地工作,节省大量的硬件驱动和空间。

同时,虚拟化技术也可以提高整个系统的安全性,特别是当多个虚拟机运行在同一台物理计算机上时。

其次,虚拟化技术可以简化整个系统的管理。

由于虚拟化技术可以将多个系统合并在一起,因此减少了对不同系统的升级、维护和备份的需求。

而且,涉及管理的工作也可以变得更加简单。

如何实现虚拟化?在Linux中,有几个不同的虚拟化技术可供选择。

下面介绍最常用的几个技术。

1.KVMKVM是"Kernel-based Virtual Machine"(基于内核的虚拟机)的缩写。

它是一种用于Linux的开源虚拟化技术。

KVM利用Linux的硬件虚拟化技术和虚拟化命令集来允许多个虚拟机共享一个物理计算机上的资源。

KVM通常用于基于x86架构的系统,这也是它在Linux系统中最受欢迎的虚拟化技术。

KVM的优点包括:- 支持多种虚拟机类型和操作系统- 可以优化虚拟机的性能- 可以提供安全的虚拟化环境2.XenXen是另一种广受欢迎的开源虚拟化技术。

它采用了自主架构和虚拟机监视器(hypervisor)来实现虚拟化。

Xen经常用于虚拟化基于x86架构的系统以及ARM架构的系统。

Xen的优点包括:- 高性能虚拟机- 简化虚拟机的管理- 完全自由和可定制的虚拟机3. LXCLXC是"Linux Containers"(Linux容器)的缩写。

浅析KVM虚拟化

浅析KVM虚拟化作者:李慧颖来源:《中国新通信》2015年第21期【摘要】在云计算技术日益发展的今天,虚拟化技术已经成为云计算的重要支撑技术之一,其特点是能快速进行资源整合,进而最大限度的对已整合资源进行分配。

KVM虚拟化是基于Linux内核的开源虚拟机平台,是硬件虚拟化的扩展及QEMU的升级版,在很大程度上已取代Xen,成为Linux系统上创建和支持虚拟机的默认开源方案。

本文将针对虚拟化技术中的KVM进行介绍,使读者对KVM有初步认识。

【关键字】 Linux内核 KVM虚拟化半虚拟化据报告分析早前70%的IT预算都花费在基础设施上,并且在许多情况下还会更糟。

为了解决这个问题,目前的数据中心已普遍采用虚拟化技术解决各企业对于操作系统单一用途的部署需求而导致的服务器大规模增长。

虚拟化技术既能将各企业的应用隔离开来,又能解决服务器超低利用率导致碳排放激增的问题,为企业节省了开销。

一、虚拟化技术根据韦氏字典的解释,虚拟现实是“通过由电脑提供的感官刺激(例如视觉和听觉),使用户产生一种人工环境的体验,并且在这人工环境中,用户的行动部分地由该环境中所发生的事情所决定”。

虚拟化正是这样做的:虚拟机软件在一台真正的物理系统上创建一个或多个虚拟工作站或服务器。

磁盘空间、处理器性能、网络适配器及大量随机访问存储器(RAM)均取决于真正物理机上的资源。

如图1所示,一般的计算机模型可以抽象成为一定的物理资源和运行其上的计算机元件,它们之间通过定义好的物理资源接口进行交互。

虚拟化层必须能够捕捉到计算机元件对物理资源的直接访问,并将其重新定向到虚拟资源池中。

二、KVM虚拟化KVM的全称是Kernel Virtual Machine,翻译成中文就是基于内核的虚拟机,是一个开源的虚拟化模块。

2.1 KVM的产生KVM最早是由以色列的Qumranet公司开发的,后于2008年被Linux的发行版提供商Redhat收购,从而成为KVM开源项目的新主人,开始着手用KVM替换掉早前已经集成在系统中却由于其自身管理系统资源架构的问题引起内核开发人员不满的Xen。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

KVM虚拟机源代码分析 1, KVM结构及工作原理 1.1 KVM结构 KVM基本结构有两部分组成。一个是KVM Driver ,已经成为Linux 内核的一个模块。负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等。另外一个是稍微修改过的Qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。

VMM(Linux 内核+ KVM Driver)Linux内核模式

Linux用户模式

/dev/kvmKvm-vm fd Kvm-vcpu fdKVM fd

ioctl

LibKvmQemu客户模式内核模式

用户模式

图1 KVM基本结构 KVM基本结构如图1所示。其中KVM加入到标准的Linux内核中,被组织成Linux中标准的字符设备(/dev/kvm)。Qemu通KVM提供的LibKvm应用程序接口,通过ioctl系统调用创建和运行虚拟机。KVM Driver使得整个Linux成为一个虚拟机监控器。并且在原有的Linux两种执行模式(内核模式和用户模式)的基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行下,三种模式的分工如下: 客户模式:执行非I/O的客户代码。虚拟机运行在客户模式下。 内核模式:实现到客户模式的切换。处理因为I/O或者其它指令引起的从客户模式的退出。KVM Driver工作在这种模式下。 用户模式:代表客户执行I/O指令Qemu运行在这种模式下。 在KVM模型中,每一个Guest OS 都作为一个标准的Linux进程,可以使用Linux的进程管理指令管理。 在图1中./dev/kvm在内核中创建的标准字符设备,通过ioctl系统调用来访问内核虚拟机,进行虚拟机的创建和初始化;kvm_vm fd是创建的指向特定虚拟机实例的文件描述符,通过这个文件描述符对特定虚拟机进行访问控制;kvm_vcpu fd指向为虚拟机创建的虚拟处理器的文件描述符,通过该描述符使用ioctl系统调用设置和调度虚拟处理器的运行。

1.2 KVM工作原理 KVM的基本工作原理:用户模式的Qemu利用接口libkvm通过ioctl系统调用进入内核模式。KVM Driver为虚拟机创建虚拟内存和虚拟CPU后执行VMLAUCH指令进入客户模式。装载Guest OS执行。如果Guest OS发生外部中断或者影子页表缺页之类的事件,暂停Guest OS的执行,退出客户模式进行一些必要的处理。然后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。KVM采用全虚拟化技术。客户机不用修改就可以运行。

开始用户模式Qemu内核模式KVM Driver客户模式Guest OS

执行IOCTL系统调用

处理I/O进入客户模式处理退出执行客户代码VMX Root OperationVMX Non Root OperationI/O?信号到达NOYes

图2 KVM 工作基本原理 2 ,相关技术-处理器管理和硬件辅助虚拟化技术 Intel 在2006年发布了硬件虚拟化技术。其中支持X86体系结构的称为Intel VT-x技术。ADM称为SVM技术。 VT-x引入了一种新的处理器操作,叫做VMX(Virtual Machine Extension),提供了两种处理器的工作环境。VMCS结构实现两种环境之间的切换。VM Entry使虚拟机进去客户模式,VM Exit使虚拟机退出客户模式。

2.1 KVM中Guest OS的调度执行 VMM调度Guest OS执行时,Qemu通过ioctl系统调用进入内核模式,在KVM Driver中通过get_cpu获得当前物理CPU的引用。之后将Guest状态从VMCS中读出。并装入物理CPU中。执行VMLAUCH指令使得物理处理器进入非根操作环境,运行客户代码。 当Guest OS执行一些特权指令或者外部事件时,比如I/O访问,对控制寄存器的操作,MSR的读写数据包到达等。都会导致物理CPU发生VMExit,停止运行Guest OS。将Guest OS保存到VMCS中,Host状态装入物理处理器中,处理器进入根操作环境,KVM取得控制权,通过读取VMCS中VM_EXIT_REASON字段得到引起VM Exit的原因。从而调用kvm_exit_handler处理函数。如果由于I/O获得信号到达,则退出到用户模式的Qemu处理。处理完毕后,重新进入客户模式运行虚拟CPU。如果是因为外部中断,则在Lib KVM中做一些必要的处理,重新进入客户模式执行客户代码。

2.2 KVM中内存管理 KVM使用影子页表实现客户物理地址到主机物理地址的转换。初始为空,随着虚拟机页访问实效的增加,影子页表被逐渐建立起来,并随着客户机页表的更新而更新。在KVM中提供了一个哈希列表和哈希函数,以客户机页表项中的虚拟页号和该页表项所在页表的级别作为键值,通过该键值查询,如不为空,则表示该对应的影子页表项中的物理页号已经存在并且所指向的影子页表已经生成。如为空,则需新生成一张影子页表,KVM将获取指向该影子页表的主机物理页号填充到相应的影子页表项的内容中,同时以客户机页表虚拟页号和表所在的级别生成键值,在代表该键值的哈希桶中填入主机物理页号,以备查询。但是一旦Guest OS中出现进程切换,会把整个影子页表全部删除重建,而刚被删掉的页表可能很快又被客户机使用,如果只更新相应的影子页表的表项,旧的影子页表就可以重用。因此在KVM中采用将影子页表中对应主机物理页的客户虚拟页写保护并且维护一张影子页表的逆向映射表,即从主机物理地址到客户虚拟地址之间的转换表,这样VM对页表或页目录的修改就可以触发一个缺页异常,从而被KVM捕获,对客户页表或页目录项的修改就可以同样作用于影子页表,通过这种方式实现影子页表与客户机页表保持同步。 2.3 KVM中设备管理 一个机器只有一套I/o地址和设备。设备的管理和访问是操作系统中的突出问题、同样也是虚拟机实现的难题,另外还要提供虚拟设备供各个VM使用。在KVM中通过移植Qemu中的设备模型(Device Model)进行设备的管理和访问。操作系统中,软件使用可编程I/O(PIO)和内存映射I/O(MMIO)与硬件交互。而且硬件可以发出中断请求,由操作系统处理。在有虚拟机的情况下,虚拟机必须要捕获并且模拟PIO和MMIO的请求,模拟虚拟硬件中断。 捕获PIO:由硬件直接提供。当VM发出PIO指令时,导致VM Exit然后硬件会将VM Exit原因及对应的指令写入VMCS控制结构中,这样KVM就会模拟PIO指令。MMIO捕获:对MMIO页的访问导致缺页异常,被KVM捕获,通过X86模拟器模拟执行MMIO指令。KVM中的I/O虚拟化都是用户空间的Qemu实现的。所有PIO和MMIO的访问都是被转发到Qemu的。Qemu模拟硬件设备提供给虚拟机使用。KVM通过异步通知机制以及I/O指令的模拟来完成设备访问,这些通知包括:虚拟中断请求,信号驱动机制以及VM间的通信。 以虚拟机接收数据包来说明虚拟机和设备的交互。

图3 I/O分析 (1)当数据包到达主机的物理网卡后,调用物理网卡的驱动程序,在其中利用Linux内核中的软件网桥,实现数据的转发。 (2)在软件网挢这一层,会判断数据包是发往那个设备的,同时调用网桥的发送函数,向对应的端口发送数据包。 (3)若数据包是发往虚拟机的,则要通过tap设备进行转发,tap设备由两部分组成,网络设备和字符设备。网络设备负责接收和发送数据包,字符设备负责将数据包往内核空间和用户空间进行转发。Tap网络部分收到数据包后,将其设备文件符置位,同时向正在运行VM的进程发出I/O可用信号,引起VM Exit,停止VM运行,进入根操作状态。KVM根据KVM_EXIT_REASON判断原因,模拟I/O指令的执行,将中断注入到VM的中断向量表中。 (4)返回用户模式的Qemu中,执行设备模型。返回到kvm_main loop中,执行Kvm—main—loop—wait,之后进入main_loop wait中,在这个函数里收集对应设备的设备文件描述符的状态,此时tap设备文件描述符的状态同样被集到fd set。 (5)Kvm main—loop不停地循环,通过select系统调用判断哪螋文件描述符的状态发生变化,相应的调用对应的处理函数。对予tap来说,就会通过Qemu—send_packet将数据发往rtl8139一do—receiver,在这个函数中完成相当于硬件RTL8139网卡的逻辑操作。KVM通过模拟I/O指令操作虚拟RTL8139将数据拷贝到用户地址空间,放在相应的I/O地址。用户模式处理完毕后返回内核模式,而后进入客户模式,VM被再次执行,继续收发数据包。

3,KVM 源代码分析-虚拟机创建和运行流程代码分析

3.1 KVM创建和运行虚拟机流程 KVM虚拟机创建和运行虚拟机分为用户态和核心态两个部分,用户态主要提供应用程序接口,为虚拟机创建虚拟机上下文环境,在libkvm中提供访问内核字符设备/dev/kvm的接口;内核态为添加到内核中的字符设备/dev/kvm,模块加载进内核后即可进行接口用户空间调用创建虚拟机。在创建虚拟机过程中,kvm字符设备主要为客户机创建kvm数据机构,创建该虚拟机的虚拟机文件描述符及其相应的数据结构以及创建虚拟处理器及其相应的数据结构。Kvm创建虚拟机的流程如图4所示。 首先申明一个kvm_context_t 变量用以描述用户态虚拟机上下文信息,然后调用kvm_init()函数初始化虚拟机上下文信息;函数kvm_create()创建虚拟机实例,该函数通过ioctl系统调用创建虚拟机相关的内核数据结构并且返回虚拟机文件描述符给用户态kvm_context_t数据结构;创建完内核虚拟机数据结构后,再创建内核pit以及mmio等基本外设模拟设备,然后调用kvm_create_vcpu()函数来创建虚拟处理器,kvm_create_vcpu()函数通过ioctl()系统调用向由vm_fd文件描述符指向的虚拟文件调用创建虚拟处理器,并将虚拟处理器的文件描述符返回给用户态程序,用以以后的调度使用;创建完虚拟处理器后,由用户态的QEMU程序申请客户机用户空间,用以加载和运行客户机代码;为了使得客户虚拟机正确执行,必须要在内核中为客户机建立正确的内存映射关系,即影子页表信息。因此,申请客户机内存地址空间后,调用函数kvm_create_phys_mem()创建客户机内存映射关系,该函数主要通过ioctl系统调用向vm_fd指向的虚拟文件调用设置内核数据结构中客户机内存域相关信息,主要建立影子页表信息;当创建好虚拟处理器和影子页表后,即可读取客户机到指定分配的空间中,然后调度虚拟处理器运行。调度虚拟机的函数为kvm_run(),该函数通过ioctl系统调用调用由虚拟处理器文件描述符指向的虚拟文件调度处理函数kvm_run()调度虚拟处理器的执行,该系统调用将虚拟处理器vcpu信息加载到物理处理器中,通过vm_entry执行进入客户机执行。在客户机正常运行期间kvm_run()函数不返回,只有发生以下两种情况时,函数返回:1,发生了I/O事件,如客户机发出读写I/O的指令;2,产生了客户机和内核KVM都无法处理的异常。I/O事件处理完毕后,通过重新调用KVM_RUN()函数继续调度客户机的执行。

相关文档
最新文档