KVM源代码分析1:基本工作原理

2023-11-19

http://www.oenhan.com/kvm-src-1

13年的时候准备挖“KVM源代码分析”的坑,陆陆续续2年过去了,坑也没有填上,当时是因为对KVM了解的肤浅,真正的理解必然要深入到代码级别,所谓“摈弃皮毛,看到血肉,看到真相”,当时计划写KVM基本工作原理、虚拟机的创建VCPU调度原理KVM内存管理、KVM设备管理等,实际发现代码过程还是很多,估计后续会针对于不同的点专门来写。

需要假定读者有一定的内核基础,和虚拟化基础,原理性的东西估计会一笔带过,我在知乎上写过一些基础入门的书籍:1.首先有OS基础,随便操作系统大学课本;2.对Linux kernel有全面了解,关键模块有理解,推荐书籍:深入Linux内核架构(+1)或者深入理解LINUX内核;3.Hypervisor虚拟化,Intel的《系统虚拟化-原理与实现》,赶时间的建议先把第3步完成。

进入正题:

1.KVM模型结构

为什么有OS虚拟化?随着CPU计算能力的提高,单独的OS已不能充分利用CPU的计算能力,1.很多应用的执行需要单独占用一个OS环境,如安全测试等;2.而IAAS云计算厂商也是以OS为范围销售计算能力。那么在所有虚拟化方案中,都是由hypervisor取代原生的OS去控制具体硬件资源,而同时hypervisor将资源分配具体的VM,VM中运行的是没有修改过的OS,如果让VM中的OS能正常运行,hypervisor的任务就是模拟具体的硬件资源,让OS不能识别出是真是假。

hypervisor-oenhan

当然上面的模型是Xen示例,OS对应用而言是硬件资源管理中心,那么hypervisor就是具体VM的OS了,KVM是就利用了这一点,利用现有的kernel代码,构建了一个hypervisor,这个样子内存分配进程调度等就无需重写代码,如此hypervisor就是所谓的host,VM中的OS就是guest。

guest OS保证具体运行场景中的程序正常执行,而KVM的代码则部署在HOST上,Userspace对应的是QEMU,Kernel对应的是KVM Driver,KVM Driver负责模拟虚拟机的CPU运行,内存管理,设备管理等;QEMU则模拟虚拟机的IO设备接口以及用户态控制接口。QEMU通过KVM等fd进行IOCTL控制KVM驱动的运行过程。

kvm_arch_map_oenhan

如上图所示,guest自身有自己的用户模式和内核模式;guest是在host中是作为一个用户态进程存在的,这个进程就是qemu,qemu本身就是一个虚拟化程序,只是纯软件虚拟化效率很低,它被KVM进行改造后,作为KVM的前端存在,用来进行创建进程或者IO交互等;而KVM Driver则是Linux内核模式,它提供KVM fd给qemu调用,用来进行cpu虚拟化,内存虚拟化等。QEMU通KVM提供的fd接口,通过ioctl系统调用创建和运行虚拟机。KVM Driver使得整个Linux成为一个虚拟机监控器,负责接收qemu模拟效率很低的命令。

2.KVM工作原理

kvm_process

上图是一个执行过程图,首先启动一个虚拟化管理软件qemu,开始启动一个虚拟机,通过ioctl等系统调用向内核中申请指定的资源,搭建好虚拟环境,启动虚拟机内的OS,执行 VMLAUCH 指令,即进入了guest代码执行过程。如果 Guest OS 发生外部中断或者影子页表缺页之类的事件,暂停 Guest OS 的执行,退出QEMU即guest VM-exit,进行一些必要的处理,然后重新进入客户模式,执行guest代码;这个时候如果是io请求,则提交给用户态下的qemu处理,qemu处理后再次通过IOCTL反馈给KVM驱动。

3.CPU虚拟化

X86体系结构CPU虚拟化技术的称为 Intel VT-x 技术,引入了VMX,提供了两种处理器的工作环境。 VMCS 结构实现两种环境之间的切换。 VM Entry 使虚拟机进去guest模式,VM Exit 使虚拟机退出guest模式。

VMM调度guest执行时,qemu 通过 ioctl 系统调用进入内核模式,在 KVM Driver中获得当前物理 CPU的引用。之后将guest状态从VMCS中读出, 并装入物理CPU中。执行 VMLAUCH 指令使得物理处理器进入非根操作环境,运行guest OS代码。

当 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 获得信号到达,则退出到userspace模式的 Qemu 处理。处理完毕后,重新进入guest模式运行虚拟 CPU。

4.Mem虚拟化

OS对于物理内存主要有两点认识:1.物理地址从0开始;2.内存地址是连续的。VMM接管了所有内存,但guest OS的对内存的使用就存在这两点冲突了,除此之外,一个guest对内存的操作很有可能影响到另外一个guest乃至host的运行。VMM的内存虚拟化就要解决这些问题。

在OS代码中,应用也是占用所有的逻辑地址,同时不影响其他应用的关键点在于有线性地址这个中间层;解决方法则是添加了一个中间层:guest物理地址空间;guest看到是从0开始的guest物理地址空间(类比从0开始的线性地址),而且是连续的,虽然有些地址没有映射;同时guest物理地址映射到不同的host逻辑地址,如此保证了VM之间的安全性要求。

这样MEM虚拟化就是GVA->GPA->HPA的寻址过程,传统软件方法有影子页表,硬件虚拟化提供了EPT支持。

总体描述到此,后面代码里面见真相。

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

KVM源代码分析1:基本工作原理 的相关文章

  • KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案

    KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案 应用场景 虚拟机客户机安装完成后 xff0c 需要为其设置网络接口 xff0c 以便和主机网络 xff0c 客户机之间的网络通信 事实上 xff0c 如果要在安装时使用网络通信 xff0
  • kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr

    前文 KVM 虚拟化环境搭建 ProxmoxVE 已经给大家介绍了开箱即用的 PVE 系统 xff0c PVE 是方便 xff0c 但还是有几点问题 xff1a 第一 xff1a 始终是商用软件 xff0c 虽然可以免费用 xff0c 但未
  • 如何在 Ubuntu 18.04 上安装 Kvm

    KVM 基于内核的虚拟机 是内置于 Linux 内核中的开源虚拟化技术 它允许您运行多个基于 Linux 或 Windows 的隔离来宾虚拟机 每个来宾都有自己的操作系统和专用虚拟硬件 例如 CPU 内存 网络接口和存储 本指南介绍如何在
  • 虚拟化KVM

    什么是虚拟化 在计算机技术中 虚拟化是一种资源管理技术 是将计算机的各种实体资源 CPU 内存 磁盘空间 网络适配器等 予以抽象 转换后呈现出来并可供分割 组合为一个或多个计算机配置环境 并重新分割 重新组合 已达到最大化合理利用物理资源的
  • Linux 桌面虚拟化技术 KVM

    KVM 是 Kernel based Virtual Machine 的简称 是一个开源的系统虚拟化模块 自Linux 2 6 20之后集成在Linux的各个主要发行版本中 它使用Linux自身的调度器进行管理 所以相对于Xen 其核心源码
  • 29 KVM管理系统资源-调整虚拟CPU绑定关系

    文章目录 29 KVM管理系统资源 调整虚拟CPU绑定关系 29 1 概述 29 2 操作步骤 29 KVM管理系统资源 调整虚拟CPU绑定关系 29 1 概述 把虚拟机的vCPU绑定在物理CPU上 即vCPU只在绑定的物理CPU上调度 在
  • KVM无法进入virt-manager,提示Unable to init server: Could not connect: Connection refused

    1 KVM virt manager不能以root用户进入 需切换成普通用户或者sudo用户 2 需要配置ssh 密钥 3 需要安装Xming或者Xmanager等KVM可用等图形界面软件 无法连接kvm 设置用户到组 一定要当前用户不要r
  • ovirt-node和ovirt-engine相连遇到的问题解决办法

    1 Host 192 168 70 7 does not comply with the cluster Default emulated machines The Hosts emulated machines are
  • kvm-ovirt-vdsm安装记录

    小技巧 1 fedaro 19自动查找最快yum源 yum install yum fastestmirror 2 libvirt启动sasl添加用户 saslpasswd2 c a libvirt admin 3 查看kvm模块 lsmo
  • kvm虚拟机vnc和spice配置

    一 简介 通过vnc或spice方式访问虚拟主机上的KVM虚拟机 可以直接通过图形化界面virt manager来设置 但此处通过xml配置文件修改 二 详解 1 VNC方式访问 vnc方式访问虚拟机不是在kvm虚拟机安装配置vnc服务器
  • kvm之多网卡队列开启设置

    背景 目前基于dpdk数据平面开发套件的应用越来越多 而dpdk对于上层应用运行时 服务的进程数多于1时 要求网卡支持多队列 否则项nginx这种多进程应用程序只能再默认配置下运行 只能启动一个worker 要求 在kvm虚机中将网卡设置支
  • KVM源代码分析1:基本工作原理

    http www oenhan com kvm src 1 13年的时候准备挖 KVM源代码分析 的坑 陆陆续续2年过去了 坑也没有填上 当时是因为对KVM了解的肤浅 真正的理解必然要深入到代码级别 所谓 摈弃皮毛 看到血肉 看到真相 当时
  • 2020最新版KVM虚拟机安装详解

    VMware Workstation Pro15 5下 1 操作环境 CentOS Linux release 7 7 1908 Core 2 需要用到的工具 XSHELL Centos任意版本镜像 3 必须安装的软件 Xmanager p
  • Qemu-KVM基本工作原理分析

    1 理解KVM与Qemu的关系 我们都知道开源虚拟机KVM 并且知道它总是跟Qemu结合出现 那这两者之间有什么关系呢 首先 Qemu本身并不是KVM的一部分 而是一整套完整的虚拟化解决方案 它是纯软件实现的 包括处理器虚拟化 内存虚拟化以
  • Linux x86-64 上的物理内存中的用户空间和内核之间是否存在明确的划分?

    也就是说 给定一个物理地址 我可以判断这个地址是否来自用户空间吗 据我所知 在虚拟地址空间中 内核将使用 上半部分和用户空间将使用下半部分 但是关于 在物理地址空间 让问题变得复杂的是我想检查KVM中的客户物理地址 这意味着我无法调用客户操
  • libvirtError:XML 错误:预期单播 mac 地址,发现多播

    我正在通过 ansible 设置 KVM 自动化 并且我有一个虚拟机一直给我这个错误 libvirtError XML 错误 预期的单播 mac 地址 发现多播 53 54 00 b4 ad 81 我不认为这是一个可靠的问题 因为其他几个虚
  • Android模拟器和virtualbox不能同时运行

    每当我运行 Virtualbox 时 我都无法启动 Android 模拟器映像 反之亦然 AVD管理器中的错误消息是 ioctl KVM CREATE VM failed Device or resource busy ko failed
  • QEMU和KVM在虚拟机I/O中扮演什么角色?

    我发现 QEMU 和 KVM 之间的界限非常模糊 我发现有人说虚拟机是qemu进程 而另一些人说是kvm进程 究竟是什么 而QEMU和KVM在虚拟机I O中扮演什么角色呢 比如一个vm做PIO MMIO的时候 是qemu还是kvm会把它困住
  • qemu KVM内核模块没有这样的文件或目录

    我目前正在上操作系统课程 我需要使用 qemu 来运行我的教授提供的一个小型操作系统 我正在尝试在 MacBook Air 5 2 上的 virtualbox 上的 ubuntu 12 04 虚拟机中使用 qemu 我知道我遇到的问题可能与
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux

随机推荐

  • Rust全局变量

    在Rust中 全局变量可以分为两种 编译期初始化的全局变量 const创建常量 static创建静态变量 Atomic创建原子类型 运行期初始化的全局变量 lazy static用于懒初始化 Box leak利用内存泄漏将一个变量的生命周期
  • non-protected broadcast场景分析及解决

    non protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver 有时在运行过程中在logcat工具中会发现大片的飘红消息 要消除这些错误信息 需要在广播的 Sender 和 R
  • WSL和VMware不兼容,安装了WSL之后VMware启动不起来

    WSL依赖于hyper v必须开启 而VMware不依赖这个 必须关闭 CMD管理员模式启动 输入bcdedit set hypervisorlaunchtype auto开启 则可以使用WSL CMD管理员模式启动 输入bcdedit s
  • ubuntn 下安装nginx 报错 ./configure: error: C compiler cc is not found

    原因是 error C compiler cc is not found c编译器没有安装 解决办法 需要安装编译工具及库文件 网址很多文章没有详细写nginx 安装教程 跟着教程敲命令然后出错了 安装nginx需要安装编译工具及库文件参考
  • 分布式锁解决方案_Zookeeper分布式锁原理

    通过召zk实现分布式锁可靠性时最高的 公平锁和可重入锁的原理 取水秩序 1 取水之前 先取号 2 号排在前面的 就可以先取水 3 先到的排在前面 那些后到的 一个一个挨着 在井边排成一队 公平锁 这种排队取水模型 就是一种锁的模型 什么是可
  • docker遇到问题集合

    1 docker images下删除镜像提示image is being used by stopped container 1b817324f96a 依次执行下面命令 docker ps a grep Exited awk print 1
  • 爬虫实例十一 全国城市房价排行

    目标网址 https www creprice cn rank index html 这一看就是个静态页面 没有用任何反爬措施所以很好爬 直接发送请求解析数据就可以了 完整代码 import requests from lxml impor
  • 睿智的目标检测54——Tensorflow2 搭建YoloX目标检测平台

    睿智的目标检测54 Tensorflow2 搭建YoloX目标检测平台 学习前言 源码下载 YoloX改进的部分 不完全 YoloX实现思路 一 整体结构解析 二 网络结构解析 1 主干网络CSPDarknet介绍 2 构建FPN特征金字塔
  • ElementUI浅尝辄止26:Notification 通知

    悬浮出现在页面角落 显示全局的通知提醒消息 1 如何使用 适用性广泛的通知栏 Notification 组件提供通知功能 Element 注册了 notify方法 接收一个options字面量参数 在最简单的情况下 你可以设置title字段
  • 资源路径嵌套异常,检测不到:IOException parsing XML document from class path resource [applicationContext.xml]

    org springframework beans factory BeanDefinitionStoreException IOException parsing XML document from class path resource
  • ARP与ARP代理的理解

    1 ARP 首先讲到ARP ARP是地址解析协议 它的作用是在以太网环境下 通过第3层的网络层IP地址来找寻2层数据链路层的MAC地址 得到一张ARP缓存表 转发数据的时候根据ARP缓存表来进行传输 下图详细说明数据传输时ARP是如何一步步
  • TVP新书上架

    新书速递 近期 在腾讯云 TVP 联合出书计划中 腾讯云 TVP 山金孝老师推出了新书 融合 产业数字化转型的十大关键技术 融合 产业数字化转型的十大关键技术 作者 山金孝 李琦 中译出版社 内容简介 数字经济已成为高质量发展的新引擎 数字
  • [Django基础06]模型和数据库交互

    2 数据库配置 MySQL 通常情况下 如果你只是做测试使用 可以使用Django内置的数据库SQLite就完全可以满足需要了 我们在本次教程中 通过使用MySQL这个数据库来完成后续的功能操作 我们首先要做的是 在配置文件中指定数据库的配
  • Densely Connected Convolutional Networks 密集连接卷积网络

    什么是DenseNet DenseNet是由清华大学的Zhuang Liu 康奈尔大学的Gao Huang和Kilian Q Weinberger 以及Facebook研究员Laurens van der Maaten在CVPR 2017所
  • 5.13 综合案例2.0-火焰检测系统(2.2版本接口有更新)

    综合案例2 0 火焰检测系统 简介 火焰传感器 准备 硬件连接图 代码流程 功能实现 1 物联网平台开发 2 设备端开发 调试 3 物联网应用开发 4 1新建 普通项目 4 2创建 Web应用 4 3页面设计 4 4关联产品 4 5关联数据
  • 蓝桥杯C/C++百校真题赛(3期)Day3(考勤刷卡、最大和)

    Day3 Q1 考勤刷卡 Q2 最大和 Q1 考勤刷卡 问题描述 小蓝负责一个公司的考勤系统 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗 当员工刷卡时 会在后台留下一条记录 包括刷卡的时间和员工编号 只 要在一天中员工刷过一次卡
  • 【反向工程】从科研文献表格,反向还原数据

    很多时候会遇到这样一个问题 有一些文章在chart中汇报了实验结果 但是并没有标注上具体的实验数值 如果逍遥获得具体数值 就得用尺子去量 这里推荐一个网站 能够帮助你估计一张chart中 每个数据点对应的横纵坐标 在某些情况下很有用处 至少
  • 数据仓库灵魂30问之数仓基础理念理解

    主题 主题是一个抽象概念 是在较高层次上将数据综合 归类并进行分析利用的抽象 每一个主题都对应一个宏观的分析领域 在实际上 每一个主题对应这个分析领域的所有的分析对象 比如销售主题对应所有和销售这个领域有关的数据 主题域 主题域通常是联系较
  • 效果奇特的HTML5动画,12个效果奇特的HTML5动画赏析

    本文将为大家分享12个效果奇特的HTML5动画 HTML5强大的动画特性可以让你的网页变得更加生动和富有活力 交互性也会进一步得到提高 一起来看看下面的这些HTML5动画案例 没个案例都提供源代码下载 1 HTML5 Canvas瀑布动画
  • KVM源代码分析1:基本工作原理

    http www oenhan com kvm src 1 13年的时候准备挖 KVM源代码分析 的坑 陆陆续续2年过去了 坑也没有填上 当时是因为对KVM了解的肤浅 真正的理解必然要深入到代码级别 所谓 摈弃皮毛 看到血肉 看到真相 当时