KVM处理器管理和硬件辅助虚拟化技术

2023-11-13

KVM处理器管理和硬件辅助虚拟化技术

Intel 在2006年发布了硬件虚拟化技术。其中支持X86体系结构的称为Intel VT-x技术。AMD称为SVM技术。

VT-x引入了一种新的处理器操作,叫做VMX(Virtual MachineExtension),提供了两种处理器的工作环境。VMCS结构实现两种环境之间的切换。VM Entry使虚拟机进去客户模式,VMExit使虚拟机退出客户模式。

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. KVM中内存管理

KVM使用影子页表实现客户物理地址到主机物理地址的转换。初始为空,随着虚拟机页访问失效的增加,影子页表被逐渐建立起来,并随着客户机页表的更新而更新。在KVM中提供了一个哈希列表和哈希函数,以客户机页表项中的虚拟页号和该页表项所在页表的级别作为键值,通过该键值查询,如不为空,则表示该对应的影子页表项中的物理页号已经存在并且所指向的影子页表已经生成。如为空,则需新生成一张影子页表,KVM将获取指向该影子页表的主机物理页号填充到相应的影子页表项的内容中,同时以客户机页表虚拟页号和表所在的级别生成键值,在代表该键值的哈希桶中填入主机物理页号,以备查询。但是一旦Guest OS中出现进程切换,会把整个影子页表全部删除重建,而刚被删掉的页表可能很快又被客户机使用,如果只更新相应的影子页表的表项,旧的影子页表就可以重用。因此在KVM中采用将影子页表中对应主机物理页的客户虚拟页写保护并且维护一张影子页表的逆向映射表,即从主机物理地址到客户虚拟地址之间的转换表,这样VM对页表或页目录的修改就可以触发一个缺页异常,从而被KVM捕获,对客户页表或页目录项的修改就可以同样作用于影子页表,通过这种方式实现影子页表与客户机页表保持同步。

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间的通信。

以虚拟机接收数据包来说明虚拟机和设备的交互。

(1)当数据包到达主机的物理网卡后,调用物理网卡的驱动程序,在其中利用Linux内核中的软件网桥,实现数据的转发。

(2)在软件网挢这一层,会判断数据包是发往那个设备的,同时调用网桥的发送函数,向对应的端口发送数据包。

(3)若数据包是发往虚拟机的,则要通过tap设备进行转发,tap设备由两部分组成,网络设备和字符设备。网络设备负责接收和发送数据包,字符设备负责将数据包往内核空间和用户空间进行转发。Tap网络部分收到数据包后,将其设备文件符置位,同时向正在运行VM的进程发出I/O可用信号,引起VM Exit,停止VM运行,进入根操作状态。KVM根据KVM_EXIT_REASON判断原因,模拟I/O指令的执行,将中断注入到VM的中断向量表中。

(4)返回用户模式的Qemu中,执行设备模型。返回到kvm_mainloop中,执行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被再次执行,继续收发数据包。


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

KVM处理器管理和硬件辅助虚拟化技术 的相关文章

  • ChatGLM环境配置

    目的 ChatGPT令人震撼的冲击下 笔者转向NLM的Transformer模型 ChatGLM作为清华开源的大语言模型 笔者尝试了其环境配置 为相关理论学习奠定基础 本文用于备忘与学习 无商业用途 参考 ChatGLM的源码下载链接 Gi
  • 总结24个Python接单赚钱的平台,兼职月入5000+

    如果说当下什么编程语言最靠谱或者比较适合搞副业 答案肯定100 是 Python python是所有语法中最简单易上手的语言 不需要特别的的英语词汇量 逻辑思维也不需要很差就能上手 而且学会了之后就能编写代码爬取各种数据 制作各种图表 提升
  • Android学习路线

    Android学习路线 绝对干货
  • CVE-2021-44228-log4j2复现详细版本-简单教程。

    0x01 前言 昨晚爆出的log4j rce 是通过lookup触发的漏洞 但jdk1 8 191以上默认不支持ldap协议 对于高版本jdk 则需要一定的依赖 不过为了给大家最简单的说明 我这里还是用jdk1 8 144的版本来运行 0x
  • Pytorch-torch.nn.identity()方法详解

    Pytorch torch nn identity 方法详解 identity模块不改变输入 直接return input 一种编码技巧吧 比如我们要加深网络 有些层是不改变输入数据的维度的 在增减网络的过程中我们就可以用identity占
  • Web 前端常用正则校验规则

    Web 前端常用正则校验规则 作为 Web 前端开发 常用的正则校验规则有很多 下面是一些常见的示例 1 校验手机号码 手机号码的正则表达式可以根据不同国家和地区的手机号码格式进行调整 以下是中国大陆的手机号码正则表达式 const reg
  • 关于C语言fgets函数要注意的地方

    关于C语言fgets函数要注意的地方 fgets函数一般用来读入文件内容 每次读一行 然后存入缓存区 有人问那怎么读下一行 直至读完整个文本文件的内容 其实很简单 只要循环用fgets就行 如果你这次把第一行读完了 那么下一次文件指针就会从
  • 关于springboot中编写继承JpaRepository这个接口类时出现报红,不能继承这个接口的问题之解决方法

    这是第二次遇到这个问题只能怪自己之前没有习惯去记录遇到的问题 这次还是关于Jpa的 真的是在找博客的时候看到好多说在入口类里添加 EnableJpaRepositories basePackages xxx xxx xxx 这个注解的 我就
  • el-table-column中运用三元运算符

    在el table column中是不能直接运用三元运算符的 需要转化一下

随机推荐

  • Nacos2.2版本发布了,我为其贡献了几行代码并适配了PostgreSQL插件

    目录 一 背景 二 个人贡献 三 Nacos使用适配的PostgreSQL插件 3 1 插件源码工程项目结构 3 2 打包加载插件 3 3 修改配置文件为PostgreSQL连接字符串 3 4 导入数据库脚本文件 四 总结 一 背景 Nac
  • Springmvc 学习心得

    1 三层架构的介绍和mvc的设计模式 Springmvc的特点 清晰的角色划分 每个功能模块对应一个组件 1 前端控制器 DispatchServlet 2 处理器映射器 HanderMapping 根据 requestMapping 找到
  • Java单元测试框架-1-TestNg初识

    目录 1 1xUnit整体作用 1 2着重介绍Junit TestNg 1 3TestNg测试框架介绍 1 4Eclipse安装TestNG 1 5TestNg测试 1 1xUnit整体作用 xUnit是各种代码驱动测试框架的统称 这些框架
  • @property详细解读

    property 这个关键字 学过iOS的一定会经常用 但是如果你问一个人 property是干嘛用的 可能就会有人一脸茫然地问你 不就是声明属性用的么 这话当然对 那么 property的背后的机制是什么 是如果声明属性 做了哪些事情呢
  • 谈谈代码走读

    代码走读的重要性就不说了 我想谈谈对代码走读的总体认识 首先代码走读前 代码必须编译通过 强类型检查的语言 比如JAVA 自带的编译器就够了 如果是弱类型检查的语言 比如C C 应该用辅助的静态检查工具 比如lint 进行检查 毕竟机器发现
  • 刷题集——POJ 2179 Fliptile(枚举+模拟)

    Fliptile Time Limit 2000MS Memory Limit 65536K Total Submissions 28860 Accepted 10139 Description Farmer John knows that
  • vue element-ui 侧边栏刷新高亮丢失问题解决

    改造之前 侧边栏刷新高亮丢失 用的是rooter link包裹 代码如下
  • JS逆向steam登录

    JS逆向steam登录 前言 我们爬虫有时候 会遇到登录才能获取到数据的情况 最开始的时候我们只需要加入请求的data参数就可以 可是现在网站为了反爬 对登录的密码或者账号都做了加密处理 如果我们不破解出这些加密的密码或者账号 就没办法实现
  • 数据库报Connection is read-only. Queries leading to data modification are not allowed

    数据库报Connection is read only Queries leading to data modification are not allowed 具体是某张表的插入操作时报的错误 问题排查过程 这个超过是批量操作发生的 第一
  • Linux-du命令

    du命令 说明 du命令也是查看使用空间的 但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看 还是和df命令有一些区别的 参数 a或 all 显示目录中个别文件的大小 b或 bytes 显示目录或文件大小时 以b
  • EL表达式语言

    引用 http blog 163 com s zhchluo blog static 1501470820075205739439 基本语法 一 EL简介 1 语法结构 expression 2 与 运算符 EL 提供 和 两种运算符来存取
  • 【uniapp】this有时为啥打印的是undefined?(箭头函数修改this)

    博主 初映CY的前说 前端领域 本文核心 uniapp中this指向问题 前言 this大家知道是我们当前项目的实例 我们可以在这个this上面拿到我们原型上的全部数据 这个常用在我们在方法中调用其他方法使用 一 uniapp中this指向
  • Cplex—java集成,idea配置 步骤大全 windows版本

    首先搜索官网cplex下载安装包 本次示例以windows版本 1 双击打开安装包 2 选择简体中文 3 都是默认 修改路径的同学请记得自己的安装路径后面配置环境变量要用 4 这里我已经安装过了中间步骤直接跳过 5 接下来我们需要在java
  • 郑州大学校园网故障问题解决方法

    1 郑州大学校园网学生用户使用指南 可进入郑州大学网络管理中心网站 校园网交流QQ群 群一475137403 群二685466506 微信公众号 郑州大学网络管理中心 一 校园网注册 1 微信扫码并关注 郑州大学网络管理中心 点击进入微信公
  • FFMPEG对于rtp的推流以及VLC验证

    前言 参考资料 https blog csdn net zhoubotong2012 article details 86711097 https blog csdn net zhoubotong2012 article details 8
  • 2021-10-23

    对于算法题 还是要及时地进行总结和收获 不然 对于核心的知识掌握过几天就忘记了 相当于之前付出的努力都打了水漂 多浪费啊 LRU缓存机制 LRU 缓存机制 运用你所掌握的数据结构 设计和实现一个 LRU 最近最少使用 缓存机制 实现 LRU
  • 【转】在java中,OOA是什么?OOD是什么?OOP是什么?

    Object Oriented Analysis 面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后 按照面向对象的思想来分析问题 OOA与结构化分析有较大的区别 OOA所强调的是在系统调查资料的基础上 针对OO方法所需要的素
  • C++ vector容器-44-vector插入和删除以及存取

    本篇继续学习vector容器 前面学习了vector是一个单端数组 也就是说vector的插入和删除 基本上都是在数组的末端进行 本篇要学习的vector插入和删除的方法就能体现这个特点 最后学习vector的存取操作 1 vector的插
  • 论文笔记 2023.5.22

    图像分类的深度卷积神经网络模型综述 图像分类的过程 图像预处理 图像特征提取 人工提取 传统图像分类算法 卷积操作提取 卷积神经网络 使用分类器对图像进行分类 以图像分类为载体 深度卷积神经网络模型主要包括以下四个类别 1 经典深度卷积神经
  • KVM处理器管理和硬件辅助虚拟化技术

    KVM处理器管理和硬件辅助虚拟化技术 Intel 在2006年发布了硬件虚拟化技术 其中支持X86体系结构的称为Intel VT x技术 AMD称为SVM技术 VT x引入了一种新的处理器操作 叫做VMX Virtual MachineEx