CPU虚拟化的过程

news2025/1/23 9:31:05

VMCS 是Virtual Machine Control Structure。是 Intel 实现 CPU 虚拟化,记录 vCPU 状态的一个关键数据结构。VMCS 数据结构主要包含以下信息。

  • Guest-state area,即 vCPU 的状态信息,包括 vCPU 的基本运行环境,例如寄存器等。
  • Host-state area,是物理 CPU 的状态信息。物理 CPU 和 vCPU 之间也会来回切换,所以,VMCS 中既要记录 vCPU 的状态,也要记录物理 CPU 的状态。
  • VM-execution control fields,对 vCPU 的运行行为进行控制。例如,发生中断怎么办,是否使用 EPT(Extended Page Table)功能等。

VM-Entry,我们称为从根模式切换到非根模式,也即切换到 guest 上,这个时候 CPU 上运行的是虚拟机。VM-Exit 我们称为 CPU 从非根模式切换到根模式,也即从 guest 切换到宿主机。例如,当要执行一些虚拟机没有权限的敏感指令时。

为了维护这两个动作,VMCS 里面还有几项内容:

  • VM-exit control fields,对 VM Exit 的行为进行控制。比如,VM Exit 的时候对 vCPU 来说需要保存哪些 MSR 寄存器,对于主机 CPU 来说需要恢复哪些 MSR 寄存器。
  • VM-entry control fields,对 VM Entry 的行为进行控制。比如,需要保存和恢复哪些 MSR 寄存器等。
  • VM-exit information fields,记录下发生 VM Exit 发生的原因及一些必要的信息,方便对 VM Exit 事件进行处理。

CPU 的虚拟化过程还是很复杂的。如下面这张图。

  • 首先,我们要定义 CPU 这种类型的 TypeInfo 和 TypeImpl、继承关系,并且声明它的类初始化函数。
  • 在 qemu 的 main 函数中调用 MachineClass 的 init 函数,这个函数既会初始化 CPU,也会初始化内存。
  • CPU 初始化的时候,会调用 pc_new_cpu 创建一个虚拟 CPU,它会调用 CPU 这个类的初始化函数。
  • 每一个虚拟 CPU 会调用 qemu_thread_create 创建一个线程,线程的执行函数为 qemu_kvm_cpu_thread_fn。
  • 在虚拟 CPU 对应的线程执行函数中,我们先是调用 kvm_vm_ioctl(KVM_CREATE_VCPU),在内核的 KVM 里面,创建一个结构 struct vcpu_vmx,表示这个虚拟 CPU。在这个结构里面,有一个 VMCS,用于保存当前虚拟机 CPU 的运行时的状态,用于状态切换。
  • 在虚拟 CPU 对应的线程执行函数中,我们接着调用 kvm_vcpu_ioctl(KVM_RUN),在内核的 KVM 里面运行这个虚拟机 CPU。运行的方式是保存宿主机的寄存器,加载客户机的寄存器,然后调用 __ex(ASM_VMX_VMLAUNCH) 或者 __ex(ASM_VMX_VMRESUME),进入客户机模式运行。一旦退出客户机模式,就会保存客户机寄存器,加载宿主机寄存器,进入宿主机模式运行,并且会记录退出虚拟机模式的原因。大部分的原因是等待 I/O,因而宿主机调用 kvm_handle_io 进行处理。

此文章为11月Day29学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1268446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件,但本地没有这个文件,该怎么办呢?往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理? 两个人在同一个分支上,两个人修改了不同文件 其中一人&…

11月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年11月20日-11月26日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营…

【LeetCode:907. 子数组的最小值之和 | 贡献法 乘法原理 单调栈】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Spark将execl表格文件导入到mysql中

实现代码 excel所需的pom依赖 案例实现 实现代码 package excel_mysqlimport org.apache.spark.sql.SparkSession import java.util.Propertiesobject t1 {def main(args: Array[String]): Unit {val spark SparkSession.builder().appName("ExcelToMySQL") /…

力扣347. 前 K 个高频元素(java,最小堆,快速排序法)

Problem: 347. 前 K 个高频元素 文章目录 前言题目描述思路解题方法复杂度Code 前言 对于求取Top K一般有如下两种题型: 1.针对静态数据(查询TopK操作) 2.针对动态数据(包括添加数据操作和查询TOPK操作) 一般解决思路…

【数据结构】八大排序 (三)

目录 前言: 快速排序 快速排序非递归实现 快速排序特性总结 归并排序 归并排序的代码实现 归并排序的特性总结 计数排序 计数排序的代码实现 计数排序的特性总结 前言: 前文快速排序采用了递归实现,而递归会开辟函数栈帧&#xff0…

Echarts大屏-数据可视化

使用原生htmljavascript实现大屏展示,较为麻烦的为边框的四个小角使用伪元素生成,其余echarts使用如下快速上手 - Handbook - Apache ECharts 效果如下:

Docker、Kubernetes、OCI、CRI-O、containerd、runc 之间的关系以及它们是如何一起工作的?

最近网上看到一张图片,能够很清晰地展现出 Docker、Kubernetes、OCI、CRI-O、containerd、runc 之间的关系以及它们是如何在一起工作的,如下: 本文可以作为之前一篇文章(《K8s、Docker、CRI、OCI 之间的爱恨情仇》)的…

最新消息:滴滴 P0 事故原因,原因出来了

最新消息滴滴P0故障原因,是由于k8s集群升级导致的,后面又进行版本回退,由于现在大型互联网公司基本都是基于K8s进行部署的,如果K8s集群一出问题,上面运行的业务Pod和运维系统全部都得宕机,导致没法回滚。 …

算法通关村-----超大规模数据场景的问题

对20GB文件进行排序 问题描述 假设有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序 问题分析 20GB的文件很难一次加载到内存中,可以采用分块策略,先使块内有序,在使块间有序。 实现思路 按照给定…

python安装PyHook3

pyhook 报错 “TypeError: KeyboardSwitch() missing 8 required positional arguments: ‘msg’, ‘vk_code’, ‘scan_code’, ‘ascii’, ‘flags’, ‘time’, ‘hwnd’, and ‘win_name’” 一、PyHook3简介 pyHook包为Windows中的全局鼠标和键盘事件提供回调。Python应…

Ubuntu上的常用软件配置

《立冬》——李白 〔唐代〕 冻笔新诗懒写,寒炉美酒时温。 醉看墨花月白,恍疑雪满前村。 对于Android开发者而言,折腾Android源码那是其乐无穷啊。但是有时候在Linux系统下会很不方便,这里特此记录一下常用的软件配置,希…

NX二次开发UF_CURVE_create_isocline 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_isocline Defined in: uf_curve.h int UF_CURVE_create_isocline(int face_cnt, tag_t faces [ ] , double direction [ 3 ] , const char * start_angle, const ch…

Python Xorbits库:编程无限可能性的新开端

更多资料获取 📚 个人网站:ipengtao.com Xorbits是一个Python库,旨在扩展Python语言的功能,使开发者能够更加轻松地进行创新性编程。该库提供了各种工具和功能,包括但不限于: 异步编程支持: Xo…

HTML-CSS知识速查

HTML/CSS知识速查 文章目录 HTML/CSS知识速查[toc]网页的组成浏览器**为什么需要Web标准:** **web标准的构成:**HTMLHTML语法导读**1.1 HTML语法规则:**1.2 基本结构标签**1.3 标签的关系:**1. **包含关系(Parent-Chil…

PostgreSQL-SQL联表查询LEFT JOIN 数据去重复

我们在使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 1、解决方法一 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id t2.tid 第一种方法我们发现还是有重复数据 2、解决方法二…

Diffusion:通过扩散和逆扩散过程生成图像的生成式模型

在当今人工智能大火的时代,AIGC 可以帮助用户完成各种任务。作为 AIGC 主流模型的 DDPM,也时常在各种论文中被提起。DDPM 本质就是一种扩散模型,可以用来生成图片或者为图片去噪。 扩散模型定义了一个扩散的马尔科夫过程,每一步逐…

删除排序链表的重复元素I和II,多种解法和思考

删除排序链表的重复元素I https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/ 一个循环就可以了,如果当前节点和下一个节点值一样,当前节点不移动让next后移动一个,如果不一样则当前节点后移。 一个循环就可以…

mysql8报sql_mode=only_full_group_by(存储过程一直报)

1:修改数据库配置(重启失效) select global.sql_mode;会打印如下信息 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROU…

水果编曲软件FL Studio21最新中文版本2023年最新FL 21中文版如何快速入门教程

水果编曲软件FL Studio介绍 各位,大家晚上好,今天给大家带来最新最新2023水果编曲软件FL Studio 21中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件,这款软件相信…