倚天产品介绍|倚天虚拟化:CPU虚拟化原理介绍

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 虚拟化技术中最关键的技术之一就是CPU虚拟化。在没有硬件辅助虚拟化技术出来之前,通常都是通过TCG(软件进行指令翻译)的方式实现CPU虚拟化。但是由于TCG方式的虚拟化层开销太大,性能太差,因此引入了硬件辅助虚拟化技术。

1. 概述

虚拟化技术中最关键的技术之一就是CPU虚拟化。在没有硬件辅助虚拟化技术出来之前,通常都是通过TCG(软件进行指令翻译)的方式实现CPU虚拟化。但是由于TCG方式的虚拟化层开销太大,性能太差,因此引入了硬件辅助虚拟化技术。

1.1 Intel的硬件辅助虚拟化

Intel的硬件辅助虚拟化技术叫做Intel-VT (Virtualization Technology)技术。具备这种硬件辅助虚拟化技术的CPU包括VMX root operation 和 VMX non-root operation两种模式。两种模式都支持Ring 0 ~ Ring 3 共 4 个运行级别。宿主机的VMM运行在VMX root operation模式下。客户机操作系统及其他应用运行在VMX non-root operation模式下。一般来说,客户机的操作系统直接运行在VMX non-root operation模式的Ring0层,大部分指令可以直接发送给CPU而不需要经过VMM。只有在执行一些比较特殊的指令时才会切换到VMM下。

1.2 ARM的硬件辅助虚拟化

ARM的硬件辅助虚拟化技术叫做ARM-V (Virtualization) 技术,从ARMv8开始比较好的支持这种硬件辅助虚拟化技术。类似X86根/非根模式,ARM引入多个异常级来控制资源访问权限。宿主机上VMM运行在EL2层,客户机操作系统运行在EL1层,应用程序运行在EL0层。

1.2.1 ARMv8 CPU异常级

ARMv8的异常级分为4级(EL0~EL3),权限也是从低到高。同时也分了两个CPU运行状态(Non-secure和Secure),顾名思义为了安全和非安全的运行态,此处不扩展。每一级运行的内容如下图所示:

1622104323048-59e3bfce-1428-4a24-aa6e-63fc972e5e3a.png

运行在不同异常级最大的区别就是能够访问的寄存器组不同,同时也影响了某些硬件行为(比如对页表的lookup)。运行在高异常级时可以访问低异常级的寄存器组,反之不行。

为了切换到更高的异常级(主动触发某个异常级的异常),需要主动执行特殊的指令:

  • Supervisor Call (SVC)。一般由EL0切换到EL1的指令,会进入EL1的异常向量表。
  • Hypervisor Call (HVC) 。Non-secure EL1切换到EL2的指令,会进入到EL2的异常向量表。
  • Secure monitor Call (SMC) 。切换到EL3的指令,只有在EL1、EL2执行有效。

1.2.2 Virtualization Host Extensions(VHE)特性

ARM有一个比较特殊的技术叫做VHE (Virtualization Host Extension)。如果CPU支持VHE特性,那么宿主机的Linux内核和VMM都运行在EL2异常级,这样可以减少EL1和EL2之间模式切换的次数,具备更高的性能。在不支持VHE的CPU上,VMM代码被分成两部分在不同的异常级执行,其中一部分运行在EL2,比如捕获Guest OS退出异常、VM-Exit保存恢复上下文,另一部分VMM代码和Host内核在EL1异常级执行,这样Hypervisor在进行资源管理和虚拟机调度时需要在EL1和EL2之间进行切换,效率会低一些。


1622034426236-16e079fa-4765-4e3f-9dac-0810424d3695.png

如上图所示,在引入VHE之前(b图),Host Kernel被分为两个部分,一部分在EL1,另外一部分(KVM中的Lowisor)在EL2。如果VM发生中断,那么会首先Trap到EL2的Lowisor,然后调用Eret回到EL1的KVM进行处理。当处理完之后,再次进入VM之前,需要再Trap进入EL2,然后再调用Eret回到VM。总共发生了2次Trap,以及调用了2次Eret。不管是软件还是硬件的开销,都不小,尤其是频繁VM exit的情况下。

引入VHE之后(c图),Host Kernel完全运行在EL2上。因此,当VM发生中断,Trap到EL2后,所有的处理逻辑都会在EL2实现,而不需要再回到EL1做额外的处理。对比non-VHE,减少了大量Trap带来的软件和硬件上的开销。

2. Qemu-KVM CPU虚拟化

Qemu-KVM是当前主流的一种虚拟化实现方式。从总体框架上看,大致如下图:

1622021730496-2d777b1b-10b0-413f-8ac7-c474c8185388.png

大致分为qemu和内核KVM的视角来分析。

2.1 Qemu视角

首先,因为Qemu也是用户态程序,所以运行在EL0。Qemu会为虚拟机创建配置的vCPU,每个vCPU就是一个线程(thread)。同时,Qemu也创建了其他的辅助线程,比如用来处理主线程事件的event loop线程、处理IO请求的io threads、vnc worker threads等。当然,Qemu除了模拟CPU,也可以模拟虚拟机的其它任何设备,本文着重分析KVM vCPU线程的实现(硬件辅助虚拟化下虚拟CPU的模拟)。

连接qemu和kvm的桥梁就是通过ioctl来请求/dev/kvm的接口服务。因此,KVM相关的功能,通过/dev/kvm设备的形式呈现给了userspace。

2.2 KVM视角

KVM作为Linux内核的一个模块,集成了硬件虚拟化扩展的功能(可以认为就是硬件虚拟化特性的驱动模块)。ARM的KVM模块在目前的开源最新版本还不支持配置成模块化的方式,只能内建于Linux内核。

KVM提供了几个重要的ioctl接口。

  • KVM_CREATE_KVM:创建一个虚拟机,并返回一个fd_vm的虚拟机文件描述符。
  • KVM_CREATE_VCPU:可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。
  • KVM_RUN:对fd_vcpus操作,启动运行虚拟机。

每个vCPU thread通过调用KVM_RUN ioctl来执行vCPU结构体中保存的Guest代码。当虚拟机上下文发生异常、中断、执行高权限指令时,虚拟机会发生VM exit,Trap到Hyp Mode回到KVM,由KVM接管、处理产生的异常、中断,以及必要时是否模拟执行的高特权指令。

某些异常是KVM处理不了的,比如虚拟机内部读写virtio设备的地址空间产生的VM exit,此时KVM会返回到Qemu,由Qemu做进一步处理,待Qemu处理完之后,再通过KVM_RUN ioctl重新回到虚拟机上下文。

3. 小结

本文主要介绍了ARM硬件辅助虚拟化原理,ARMv8 VHE特性。通过分析Qemu-KVM虚拟化软件流程,配置CPU异常级,模拟VCPU线程,控制虚拟机陷入陷出,最终达到物理CPU资源复用的能力。

好啦!小弹的分享到此为止。我们更欢迎您分享您对阿里云产品的设想、对功能的建议或者各种吐槽,请扫描提交问卷并获得社区积分或精美礼品一份。https://survey.aliyun.com/apps/zhiliao/P4y44bm_8

【扫码填写上方调研问卷】

欢迎每位来到弹性计算的开发者们来反馈问题哦~

相关文章
|
7月前
|
SQL Java 数据库连接
联表查询 && 索引 && 事务 && JDBC使用 &&CPU工作原理 && 线程概念 && Thread类的用法
联表查询 && 索引 && 事务 && JDBC使用 &&CPU工作原理 && 线程概念 && Thread类的用法
135 0
|
9天前
|
存储 算法 Linux
【计算机操作系统】深入探究CPU,PCB和进程工作原理
【计算机操作系统】深入探究CPU,PCB和进程工作原理
|
9天前
|
存储 缓存 并行计算
【软件设计师备考 专题 】CPU和存储器的组成、性能和基本工作原理
【软件设计师备考 专题 】CPU和存储器的组成、性能和基本工作原理
58 0
|
9天前
|
存储 KVM 虚拟化
倚天产品介绍|倚天虚拟化:虚拟机热迁移特性介绍
热迁移分为热迁移和冷迁移,冷迁移过程中有一段明显的时间VM的服务不可用,而热迁移的服务的服务暂停时间非常短。热迁移过程中无需关闭或者长时间暂停VM,VM保持正常运行,只有在热迁移临近结束时有一个非常短暂的停机切换时间。热迁移可保证了VM服务的可用性,提升业务的连续性和用户体验。
|
机器学习/深度学习 Linux KVM
Debian11安装KVM虚拟化并安装Centos
grep --color --perl-regexp 'vmx | svm' /proc/cpuinfo 首先检查其是否支持虚拟化. 分别用以下条命令查看
1140 0
Debian11安装KVM虚拟化并安装Centos
|
机器学习/深度学习 存储 Linux
CentOS 7 部署 KVM 虚拟化
CentOS 7 部署 KVM 虚拟化
651 0
|
安全 IDE KVM
[ 云计算相关 ] KVM虚拟化平台windows虚拟机迁移到openstack虚拟化平台(KVM虚拟化环境中Windows虚拟机安装Virtio驱动程序)
KVM虚拟化平台windows虚拟机迁移到openstack虚拟化平台(KVM虚拟化环境中Windows虚拟机安装Virtio驱动程序) 因为这也不是我的本职工作,只是这次恰巧碰到了,帮着解决了以下,我就没深究原理了,问我原理可能我也不知道,只是这个操作步骤吧,亲测有效。
471 0
[ 云计算相关 ] KVM虚拟化平台windows虚拟机迁移到openstack虚拟化平台(KVM虚拟化环境中Windows虚拟机安装Virtio驱动程序)
|
11月前
|
存储 监控 网络安全
【KVM虚拟化】· 虚拟机的冷迁移和热迁移
【KVM虚拟化】· 虚拟机的冷迁移和热迁移
900 0
|
11月前
|
KVM 虚拟化 Windows
【KVM虚拟化】· KVM中的网络
【KVM虚拟化】· KVM中的网络
207 0
|
11月前
|
存储 KVM 文件存储
【KVM虚拟化】· 存储池、存储卷
【KVM虚拟化】· 存储池、存储卷
433 0