首页 > 其他分享 >CPU虚拟化的过程

CPU虚拟化的过程

时间:2023-11-29 22:00:57浏览次数:40  
标签:调用 虚拟化 vCPU 宿主机 VM 寄存器 过程 CPU

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 切换到宿主机。例如,当要执行一些虚拟机没有权限的敏感指令时。

CPU虚拟化的过程_CPU虚拟化

为了维护这两个动作,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虚拟化的过程_CPU虚拟化_02

  • 首先,我们要定义 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 进行处理。


标签:调用,虚拟化,vCPU,宿主机,VM,寄存器,过程,CPU
From: https://blog.51cto.com/key3feng/8620575

相关文章

  • Oracle数据库 使用存储过程判断索引是否存在,再删除索引
    不多废话DECLAREindex_countNUMBER;BEGIN--判断索引UK_TEST_2是否存在SELECTCOUNT(*)INTOindex_countFROMuser_indexesWHEREindex_name='UK_TEST_2';IFindex_count>0THENEXECUTEIMMEDIATE'DROPINDEXU......
  • 浏览器插件 Obsidian web 与 Obsidian 插件 local rest api 结合配置过程记录
    1.安装浏览器插件能到这里的肯定是已经有Obsidian了.首先要安装chrome浏览器插件Obsidianweb如图2.安装Obsidian上的插件插件名为localrestapi,如图3.设置浏览器插件配置对应的Obsidianweb中设置上localrestapi的信息,需要简单理解一下,就是......
  • VMWARE虚拟机的CPU分配(VMWARE14):处理器数量、核心数量分配验证
    最近搞了个12核24线程的服务器CPU,加上华南金牌的主板,配了64G的内存,有点飘。然后用VMWARE14建了好几个虚拟机,多开耍耍。然后CPU的分配成了一个问题,因此上网查了下,有两种说法:方案1:有说虚拟机处理器设置页面的“处理器数量”指的是“核心数”,“每个处理器的内核数量”是超线程数量。......
  • uniapp开发App从开发到上架全过程
    ​当我们的APP开发完毕,最终交付的时候,必然要经历的一个环节,就是APP上架,国内APP上架一般为IOS端appstore上架,安卓端应用商店比较多,最常见的应用商店有华为应用商店、小米应用商店、OPPO应用商店、VIVO应用商店、应用宝应用商店等。在开始上架前,需要准备好相应的材料,安卓端需要准......
  • 三大核心成长驱动力,C海光:国产CPU领军,加速突破高端市场
    1.3“数字经济”及“东数西算”推动核心行业市场服务器国产替代数字经济是近年来提出的全新的国家战略,随着各行业数字化转型进程的加快,所产生的数据呈现指数式爆发增长,算力已成为数字经济发展的核心因素,而数据的传输、存储与计算都与服务器息息相关。2022年1月,国务院发布的......
  • Intel 移动CPU天梯榜
    ......
  • 华三虚拟化系统安装
    正常启动后截图 进行分区(比较懒直接自动。手动方法和正常做Linux系统操作一样) 发现报错(附带翻译)    一般出现这个问题,都是因为服务器中已经存在了系统,如果不需要就直接全部删掉继续往下安装 和做Linux系统的操作差不多就不叙述了,看图     ......
  • 处理挖矿病毒kthreaddk的过程
    问题描述发现服务器的CPU和内存占用非常高,然后看了一下发现有几个异常的程序PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND12043root......
  • 记录达梦8安装过程与一些注意事项
    最近项目中使用到达梦数据库(开发版),安装时总是忘记一些比较重要的,常用的参数,所以记录一下.环境:CPU:鲲鹏arm64系统:银河麒麟服务器版V10SP3下载达梦数据库打开达梦数据库下载页(可能需要登录)找到DM8开发版,需要选择安装的机器的CPU平台和系统,再点击下载......
  • R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析泊松过程车
    最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车到了。在本文中,我们将使用指数分布,假设它的参数λ,即事件之间的平均......