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

简介: 虚拟化技术中最关键的技术之一就是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

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

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

相关文章
|
9天前
|
KVM 虚拟化
计算虚拟化之CPU——qemu解析
【9月更文挑战10天】本文介绍了QEMU命令行参数的解析过程及其在KVM虚拟化中的应用。展示了QEMU通过多个`qemu_add_opts`函数调用处理不同类型设备和配置选项的方式,并附上了OpenStack生成的一个复杂KVM参数实例。
|
1月前
|
存储 监控 Java
实时计算 Flink版产品使用问题之随着时间增加,作业的CPU繁忙度增加,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
存储 运维 Serverless
函数计算产品使用问题之如何规避因提高CPU规格而导致的内存规格不必要增加的问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
机器学习/深度学习 分布式计算 大数据
MaxCompute产品使用合集之如何查看空间资源、CPU和内存以及存储空间容量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
3月前
|
运维 Serverless Nacos
Serverless 应用引擎产品使用合集之在访问量过大的情况下,函数配置的cpu和内存会自动扩容吗
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之在一个集群上创建多个数据库实例,是否可以做cpu和内存的配额指定
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
3月前
|
SQL 数据处理 API
实时计算 Flink版产品使用问题之holo的io以及cpu使用较为稳定,sink端busy一直在20%左右,有时候50%,该如何优化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
存储 算法 Linux
【计算机操作系统】深入探究CPU,PCB和进程工作原理
【计算机操作系统】深入探究CPU,PCB和进程工作原理
126 1
|
4月前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能平台PAI产品使用合集之如何在CPU服务器上使用PAIEasyRec进行分布式训练
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。