建设一个网站大概费用,东莞网站公司推广技巧,公司网站功能性建设有哪些,wordpress 创建数据库VMCS 是Virtual Machine Control Structure。是 Intel 实现 CPU 虚拟化#xff0c;记录 vCPU 状态的一个关键数据结构。VMCS 数据结构主要包含以下信息。
Guest-state area#xff0c;即 vCPU 的状态信息#xff0c;包括 vCPU 的基本运行环境#xff0c;例如寄存器等。Hos…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 的运行行为进行控制。例如发生中断怎么办是否使用 EPTExtended 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操作系统》推荐该课程。