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

为了维护这两个动作,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操作系统》,推荐该课程。

相关推荐
Waay3 小时前
Linux Shell 知识点考评(一):grep 文本搜索(附答案)
linux·运维·服务器
jamon_tan3 小时前
Linux下串口RAW模式设置
linux
碧海银沙音频科技研究院3 小时前
基于VMware虚拟机ubuntu开发博通BK7258方法
linux·运维·ubuntu
云边有个稻草人6 小时前
【Linux系统】进程地址空间
linux·虚拟地址空间·进程地址空间·虚拟地址空间是怎么实现的?·为什么要有虚拟地址空间?·怎么理解虚拟地址空间?
想唱rap11 小时前
传输层协议TCP
linux·运维·服务器·网络·c++·tcp/ip
曦夜日长11 小时前
Linux系统篇,权限(二):缺省权限、最终权限的计算、文件隔离的两种方式
linux·运维·服务器
云水一下11 小时前
黑客的“猜密码”游戏:SSH暴力破解实战与Linux安全加固
linux·渗透测试·ssh·暴力破解
kebidaixu11 小时前
OK3568开发板更新Ubuntu22.04方法总结
linux·运维·服务器
晚风予卿云月12 小时前
【Linux】Linux2.6 O(1)调度器超详解 | 进程切换+内核链表 | 面试必背
linux·运维·面试
www.0212 小时前
Linux 终端守护神 Tmux :如何优雅地管理后台实验与恢复会话
linux·运维·服务器·人工智能·tmux