KVM架构与原理详解

2023-11-09

1.KVM架构

KVM 基本上有两个组件构成:

1. kvm 驱动 现在已经是Linux内核的一个模块了,它的作用主要是负责虚拟机的创建,虚拟内存的分配 虚拟CPU寄存器的读写和虚拟cpu的运行

2. 另一个组件是 Qemu QEMU是一个通用的开源机器模拟器和虚拟器,其主要的功能是用于模拟虚拟机的用户空间组件,提供io 设备模型,访问外设的途径

Qemu 是什么?

Qemu 是纯软件设计的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和虚拟机打交道,但其实是和Qemu模拟出来的硬件打交道,Qemu 将这些真正的指令转译给真正的硬件

正因为Qemu是纯软件实现的,所有的指令都要经过qemu过一手,性能非常低,所以,在生产环境中,所以在生产环境中,Qemu配合KVM来完成虚拟化工作,因为kvm是硬件辅助的虚拟化技术,主要负责比较繁琐的cpu虚拟化和内存虚拟化,而QEMU则负责IO设备虚拟化,两者合作发挥自身的优势,相得益彰

从本质上看,虚拟出的每个虚拟机对应宿主机上的一个QEMU 进程,而虚拟机的执行线路(cpu线路,io线路)对用qemu 进程中的一个线程,

下面通过启动一个虚拟机来讲解kvm 与QEmu是怎么交互工作的

// 第一步,获取到 KVM 句柄

kvmfd = open("/dev/kvm", O_RDWR);

// 第二步,创建虚拟机,获取到虚拟机句柄。

vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);

// 第三步,为虚拟机映射内存,还有其他的 PCI,信号处理的初始化。

ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem);

// 第四步,将虚拟机镜像映射到内存,相当于物理机的 boot 过程,把镜像映射到内存。

// 第五步,创建 vCPU,并为 vCPU 分配内存空间。

ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);

vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0); // 第五步,创建 vCPU 个数的线程并运行虚拟机。

ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0);

// 第六步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。

for (;;) { ioctl(KVM_RUN) switch (exit_reason) {

case KVM_EXIT_IO: /* ... */ case KVM_EXIT_HLT: /* ... */

} }

// 这里的退出并不一定是虚拟机关机,

// 虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会退出执行,

// 退出执行可以理解为将 CPU 执行上下文返回到 Qemu。

Qemu 软件实现虚拟化的思路是二进制指令翻译技术,主要是提取客户端的代码指令,然后将其翻译成TCG中间代码,最后再将中间代码 翻译成物理机指定架构的代码,如X86体系就翻译成其支持的代码形式,ARM架构同理,

所以,从宏观上看,源码结构主要包含以下几个部分:

· /vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。

· /target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。

· /tcg/tcg.c:主要的 TCG 代码。

· /tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。

· /cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。

其中,涉及的主要几个函数如下:

知道了这个总体的代码结构,再去具体了解每一个模块可能会相对容易一点。

KVM作用

kvm基本结构

Kvm 已经是内核模块,被看作是一个标准的Linux字符集设备 /dev/kvm

Qemu 通过kvmlib接口,用fd 通过ioctl 向设备驱动来发送创建,运行虚拟机命令,设备驱动/dev/kvm 就会来解析命令(kvm_dev_ioctl 在函数kvm_main.c中)

以下为kvm_dev_ioctl函数 执行的整个代码流程:

Kvm 模块让Linux 主机成为一个虚拟机监视/管理器(VMM),并且在原有的Linux 两种执行模式的基础上,新增加了客户模式,客户模式拥有自己的用户模式和内核模式,在虚拟机运行时,

三种运行模式分别为:

内核模式: 实现客户模式的切换,处理因为IO或者其他指令引起的客户模式退出(VM_EXIT) kvm 工作在 这 个模式下,

用户模式:代表用户在IO模式下,执行QEMU 指令;

客户模式:执行非IO的客户代码,虚拟机运行在这种模式下

在kvm的模型中,每一个guest os 都是作为一个标准的Linux进程,都可以使用Linux进程管理管理命令!

这里假如Qemu 通过ioctl 发出KVM_CREAT_VM指令,创建一个VM后,qemu需要发送一个命令给VM,如KVM_CREAT_VCPU,这些命令当然也是通过ioctl发送的,用户程序中用ioctl通过发送KVM_CREAT_VM 指令后得到的返回值就是fd(KVM_VM),fd是创建的指向特定虚拟机实例的文件描述符,之后利用这个fd发送命令给VM进行访问控制。KVM 解析这些命令kvm_vm_ioctl

2.KVM工作原理

Kvm 工作原理的基本阐释:

用户模式的qume利用libkvm 通过ioctl进入内核模式,kvm 模块为虚拟机创建虚拟内存,虚拟cpu后执行VMLUACH指令进入客户模式。加载guest os并执行。如果guest os 发生外部中断,或者影子页表缺页之类的情况,会暂停guest os的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码,如果发生iO事件或者信号队列中有信号到达,就会进入用户模式处理。

处理情况如下图

什么是虚拟机管理器vmm ,虚拟机管理器(vmm)有哪些,区别是什么?

虚拟机管理器(virtual machine monitor)是一个宿主程序,它支持一台计算机执行多个完全相同的执行环境,每位用户都会感觉自己在一台独立的计算机上,与其他用户相隔离的计算机上操作,尽管事实上为每位用户提供服务的都是同一台机器,在此种情况下,一台虚拟机就是由一个潜在的控制程序管理的操作系统。

Vmm 是在底层对其上的虚拟机的管理和支持,以前的虚拟机必须现在一个作系统上安装虚拟机操作软件,然后再在操作软件上安装虚拟机,安装系统和应用。但现在的intel 的cpu 已经对虚拟化技术做了硬件支持,大多数的vmm可直接装在裸机上,在其上在安装几个虚拟机,这样就大大提升了虚拟化环境下的性能体验。

出处:http://www.uml.org.cn/yunjisuan/202008171.asp?artid=23611

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KVM架构与原理详解 的相关文章

随机推荐

  • ubuntu18.04合并pdf文件

    以前使用pdftk比较常见 但是pdftk的更新似乎没有跟上 改用pdfunite轻松解决 pdftk原来使用apt安装 现在改成用snap安装pdftk sudo snap install pdftk pdftk合并命令为 pdftk p
  • 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

    题目链接 https www luogu com cn problem P1200 include
  • C++函数基础

    一 函数的定义和使用 1 函数的定义 类型说明符 函数名 含类型说明的形参表 语句序列 如 int GetSum int a int b return a b 2 形式参数 形式参数的作用是实现主函数与被调函数之间的联系 3 函数的返回值和
  • 【ubuntu】ubuntu实体机与windows互传文件(两台电脑)

    先记录一些命令 dpkg list 查看软件列表 sudo apt get purge remove 包名 purge是可选项 写上这个属性是将软件及其配置文件一并删除 如不需要删除配置文件 可执行sudo apt get remove 包
  • Python列表操作中extend和append的区别

    1 用法 append 用于在列表末尾添加新的对象 输入参数为对象 extend 用于在列表末尾追加另一个序列中的多个值 输入对象为元素队列 2 相同点 两个都是对列表即list进行的操作 具体句法可以写为 list1 append obj
  • 解决EXPLORER应用程序错误,桌面出不来

    打开运行 输入CMD 输入for 1 in windir system32 dll do regsvr32 exe s 1 意思是注册所有DLL组件 一般都能解决问题 转载于 https blog 51cto com feifei888 4
  • word文件doc、docx转pdf

    综合类管理系统不管是自研还是外包项目都会被客户或者产品经理要求 实现word导出 excel导出 pdf导出等功能 其实pdf导出呢 有很多种方式 我实现过的就有两种 接下来呢 就说说其中的一种 就是当你已经实现了word导出 或有明确的要
  • 粉丝文化:抖音广告短视频美妆营销中,男明星比女明星更带货?

    1996年 木村拓哉为佳丽宝拍摄了一支口红广告 这条广告轰动一时 代言的口红两个月就卖出了300万支 从此 男明星就成了美妆品牌的宠儿 众多美妆品牌开始启用男明星代言人 男明星为何有如此强力的带货潜力 美妆品牌如何在短视频时代占得先机 抖音
  • 阿里天池比赛——街景字符编码识别

    文章目录 前言 一 街景字符编码识别 1 目标 2 数据集 3 指标 总结 前言 之前参加阿里天池比赛 好久了 一直没有时间整理 现在临近毕业 趁论文外审期间 赶紧把东西整理了 5月底学校就要让我们滚蛋了 哭哭哭 大运会的牺牲品 一 街景字
  • 赛马游戏的java设计_赛马游戏源码

    0 Intro pos g setClip 10 10 HorseMidlet imgIntro 0 getWidth HorseMidlet i mgIntro 0 getHeight g drawImage HorseMidlet im
  • 面试题记1

    希望各位看客们能积极提供答案 1 125874和它的两倍251748 包含着同样的数字 只是顺序不同 找出最小的正整数x 使得2x 3x 4x 5x 和6x都包含有相同的数字 2 求100 各位数之和 3 是用从1到9所有数字 将其任意的连
  • Notion?Roam?OneNote? 不要再用这些垃圾做笔记啦

    双向链接 最近因为Roam Research 双向链接在笔记圈子里火了起来 Notion也在准备做了 那么双向链接是什么呢 我用我的我关于管道的一则笔记给大家讲明白 管道的实现 Linux里 管道实现的原理是 Shell进程先调用pipe创
  • 浅谈 qmake 之 shadow build

    shadow build shadow build 是什么东西 就是将源码路径和构建路径分开 也就是生成的makefile文件和其他产物都不放到源码路径 以此来保证源码路径的清洁 这不是qmake独创的东西 cmake中早就使用这个东西了
  • 性能测试_Day_10(负载测试-获得最大可接受用户并发数)

    目录 如何理解负载测试 如何实现负载测试 jpgc Standard Set插件安装 jpgc Standard Set使用方法 负载测试分析指标 获得最大可接受用户并发数 区间值 负载测试分析指标 获得最大可接受用户并发数 真实值 负载测
  • 阅读论文《Deep Bilateral Learning for Real-Time Image Enhancement》

    这是2017 siggraph的一篇论文 寒假boss让我看这篇论文我没怎么看懂 最近在公司实习 发现该论文的成果已经移到手机端上了 效果还非常不错 这里我重新温习了一下这篇论文 发现有许多可以借鉴的地方 是一篇非常不错的论文 这里重新叙述
  • 我碰到avs错误

    1 写好的avs脚本用播发器不能播放 并且报unexpected chatacter 错误 解决办法 1 尽管avs支持汉语文件路径 但是仍要确认标点符号是否为英文状态下 2 将AVS脚本用记事本打开 重新存为并把编码格式修改成ASNI格式
  • 数值计算方法python实现

    包括 泰勒级数展开 差分逼近微分 二分法求解 试位法求解 迭代法求根 牛顿法求根 正割法 贝尔斯托法多项式求跟 多项式回归 牛顿差商插值 拉格朗日插值法 三次样条插值法 二次样条插值法 高斯消元法 求解线性代数方程组 代码在我的github
  • 事件循环与线程 一

    初次读到这篇文章 译者感觉如沐春风 深刻体会到原文作者是花了很大功夫来写这篇文章的 文章深入浅出 相信仔细读完原文或下面译文的读者一定会有收获 由于原文很长 原文作者的行文思路是从事件循环逐渐延伸到线程使用的讨论 译者因时间受限 暂发表有关
  • SnowFlake 算法

    SnowFlake 算法 1 介绍 是 Twitter 开源的分布式 id 生成算法 核心思想 使用一个 64 bit 的 long 型的数字作为全局唯一 id 2 结构 0 0001000000 0000010000 0001000100
  • KVM架构与原理详解

    1 KVM架构 KVM 基本上有两个组件构成 1 kvm 驱动 现在已经是Linux内核的一个模块了 它的作用主要是负责虚拟机的创建 虚拟内存的分配 虚拟CPU寄存器的读写和虚拟cpu的运行 2 另一个组件是 Qemu QEMU是一个通用的