计算虚拟化1——CPU虚拟化

目录

vCPU的概念

vCPU和CPU的关系

CPU的Ring级别

CPU虚拟化技术

软件辅助全虚拟化

半虚拟化

硬件辅助虚拟化


计算资源的虚拟化可以分为CPU虚拟化、内存虚拟化、I/O虚拟化三个方面

CPU虚拟化:多个虚拟机共享CPU资源,对虚拟机中的敏感指令进行截获并模拟执行

内存虚拟化:多个虚拟机共享同一物理内存,需要相互隔离

I/O设备虚拟化:多个虚拟机共享一个物理设备

vCPU的概念

vCPU和CPU的关系

vCPU和物理CPU的关系

一个物理CPU有多个内核,每个内核可以有多个线程

如果物理CPU没有超线程技术

一个内核同时只能处理一个任务

即一个内核对应一个vCPU,将一个内核虚拟为一个vCPU,为虚拟机提供CPU资源

如果物理CPU有超线程技术

一个内核若有两个线程,就可以同时处理2个任务

即一个线程对应一个vCPU,将一个线程虚拟为一个vCPU,为虚拟机提供CPU资源

综上可知:多台虚拟机之间可以复用同一个物理CPU

vCPU的分配

虚拟CPU分配给虚拟机时,虚拟CPU的数量不能超过单台物理节点所能提供的vCPU数量

即:虚拟机分配的CPU总量不能超过单台物理节点所能提供的vCPU数量

分配规则

为虚拟机分配CPU初始值,该初始值应考虑该虚拟机在物理机运行所需的配置(在物理机运行需要多少cpu资源,虚拟机就分配多少cpu资源)

观察该虚拟机使用资源的均值和峰值(2个星期左右),然后再修改CPU的分配数量,得到资源利用最大化(修改后的CPU尽量保证虚拟机的均值控制在50~70%,峰值控制在50~90%之间)

CPU的Ring级别

CPU 指令分级

现代计算机的CPU技术有个核心的特点,就是根据指令的敏感程度分为不同的权限级别来实现运行的,避免了用户与应用程序层面的错误导致整个系统的崩溃;不同类型的CPU会分为不同的权限级别,不过总体的思想是一致的,以下我们主要通过x86的CPU作为代表来讲解CPU的虚拟化

x86 物理CPU的权限分级

x86 CPU分为4个级别,分别为Ring0、Ring1、Ring2、Ring3

Ring0级别(内核态)

直接作用于操作系统内核,给系统核心命令使用的权限,调用系统资源,优先级最高;可以访问内存的所有数据

Ring1-2级别

用于操作系统服务(设备驱动程序)

Ring3级别(用户态)

应用程序APP使用的权限,优先级最低;只能受限的访问内存,并且CPU资源可以被其他程序获取

我们重点关注的是Ring0(内核态)与Ring3(用户态)

每一层只能访问本层以及权限更底层的数据,当用户态直接执行Ring0权限的指令时,会被系统显示为非法指令,会报错,这种操作可能会导致系统出错

物理机操作系统中的用户态如何实现访问内核态呢

当APP需要执行访问磁盘、写文件等操作时,APP需要通过执行系统调用函数,在执行系统调用时CPU的运行级别就会从Ring3切换到Ring0,并跳转到系统调用对应的内核代码位置来进行相关操作,相关操作执行完成之后,从Ring0返回到Ring3,实现用户态与内核态的切换

CPU的指令类型

特权指令

只用于操作和管理关键系统资源的指令,必须在Ring0权限级别上才能运行的指令(可能会有部分特权指令存在于Ring1的权限)

普通指令

在CPU普通权限级别上就可以运行,即在Ring3级别上运行的指令(Ring1-2也属于用户态)

敏感指令

在虚拟化环境下的特殊指令被称为敏感指令

敏感指令指的是修改虚拟机的运行模式或宿主机状态的指令,也就是说是将Guest OS中原本需要在Ring 0模式下才能运行的特权指令剥夺特权后,交给VMM所执行的指令


CPU虚拟化技术

Ring0不允许出现在多个操作系统同时运行的时候,因为宿主操作系统工作在Ring0,虚拟机操作系统就不能运行在Ring0,而当客户操作系统执行特权指令时就会发现错误

为了解决以上问题,提出了软件辅助全虚拟化、半虚拟化、硬件辅助全虚拟化三种解决方法

不论是哪种虚拟化技术,关于虚拟机特权指令的操作都要交给VMM,由VMM交给底层硬件,不同的虚拟化技术只是说VMM交给底层硬件的方式不同

 

软件辅助全虚拟化

半虚拟化

硬件虚拟化

实现技术

通过二进制转换、翻译实现

通过超级调用Hypercall实现

通过将特权指令转到Root模式实现

应用厂商

Vmware Workstation

Xen
不过Xen只支持对Linux的虚拟化
不支持对Windows的虚拟化
因为Windows不开源

Vmware ESXi/Hyper-v/KVM/Xen 3.0

性能

最好,几乎与物理主机性能相同

CPU需要在两种模式切换,带来额外开销
不过其性能正逐渐逼近半虚拟化

兼容性

最佳兼容性

需要修改操作系统,兼容性差

最佳兼容性

软件辅助全虚拟化

使用VMM在底层硬件和服务器之间建立一个抽象层,将物理资源全部抽象化(即针对与虚拟机的所有的底层硬件都是由VMM模拟实现的),不过虚拟机会认为自己是在真实的主机上运行的,而VMM就是虚拟机访问物理层的接口

实现的原理

VMM运行在最高权限等级,Guest OS的特权指令等操作交由VMM代为完成

即:将虚拟机运行的特权指令进行捕获、翻译,使之成为只能对虚拟机生效的虚拟特权指令,软件拦截使得性能开销大

提供两种工作机制(特权解除、陷入模拟)

特权解触(优先级压缩)

虚拟机执行Ring0指令时,将指令发到VMM时会触发VMM异常,这些异常就被VMM捕获,再由VMM将这些特权指令进行虚拟化成为只针对虚拟CPU起作用的虚拟特权指令

本质为使用能运行在物理机用户态中的非特权指令模拟出只对虚拟机有效的虚拟特权指令,实现特权指令的降级

存在的问题:有一部分特权指令会存在于Ring1权限中,而Ring1指令并不会触发VMM的异常捕获,从而导致在虚拟机中执行的特权指令直接对物理机造成了影响,可能导致系统出现故障

陷入模拟(二进制模拟—使用较多)

VMM会对虚拟机传来的指令的二进制代码进行扫描,一旦发现执行的是特权指令时,会将这些二进制代码翻译成虚拟特权指令的二进制代码或者是翻译成运行在核心态中的特权指令二进制代码从而强制的触发异常

这种方案就解决了虚拟机运行Ring1指令时没有被VMM捕获的问题

半虚拟化

实现的原理

通过对Guest OS的内核代码进行一定的修改,将原来在Host OS上执行的一些特权指令修改成可以和VMM直接交互的方式(即将虚拟机对特权指令的调用改为对直接对VMM的调用-这种调用方式为Hypercall),由VMM直接将特权指令传递给物理机,这样就不会有捕获异常、翻译等过程,性能损耗比较少;不过需要给虚拟机操作系统打补丁,并且虚拟机系统的镜像文件并不通用

此时虚拟机知道自己是运行在虚拟环境中,并不是运行在真正的物理主机上

硬件辅助虚拟化

通过此方式就形成了新的执行态(Root态和非Root)

Root与非Root操作模式将原有的CPU操作区分为VMM所在的Root操作区和虚拟机所在的非Root操作区,每个操作区都拥有Ring0-3的所有指令级别;通过这种新的执行态,使得VMM和Guest OS被完全隔离

实现原理

硬件辅助虚拟化是使用了支持虚拟化功能的CPU进行支撑(Inter-TV和AMD-V技术就可以使得CPU支持虚拟化),虚拟机运行在非Root态的核心态中,可以直接调用特权指令,不过其调用特权指令是通过硬件的虚拟化机制将特权指令调用转到处在根模式下的VMM中,由VMM完成对硬件的同一管理

CPU厂商支持虚拟化的力度在不断加大,靠着硬件辅助的虚拟化技术性能逐渐逼近半虚拟化,再加上该虚拟化不需要修改客户端操作系统的优势,该虚拟方式是未来的发展趋势(目前很多的服务器/CPU 上面都可以开启硬件辅助虚拟化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/115278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EntherNet IP通讯学习

# 哎 最近接触ENIP通讯,但是觉得这玩意真的挺复杂的,主要是资料太少了。 好像大家都在保密一样。 1、学习这个通讯一定是因为实际工作中有用到,所以这个时候你一定有一个PLC做了从站。 OK,那下面继续学习吧! 首先先上…

数智赋能!麒麟信安参展全球智慧城市大会

10月31日至11月2日,为期三天的2023全球智慧城市大会长沙在湖南国际会展中心举办,大会已连续举办12届,是目前全球规模最大、专注于城市和社会智慧化发展及转型的主题展会。长沙市委常委、常务副市长彭华松宣布开幕,全球智慧城市大会…

TypeScript 第一站概念篇

前言 🔮 好长一段时间没有写文章了,原因是经历了一次工作变动,加入了一个有一定规模的开发团队,前端算上我有四个人,很欣慰,体验一下团队配合的感觉,在我之上有一个组长,比我年长四…

Mozilla Firefox 119 现已可供下载

Mozilla Firefox 119 开源网络浏览器现在可以下载了,是时候先看看它的新功能和改进了。 Firefox 119 改进了 Firefox View 功能,现在可以提供更多内容,如最近关闭的标签页和浏览历史,你可以按日期或网站排序,还支持查…

学习笔记三十一:k8s安全管理:认证、授权、准入控制概述SA介绍

K8S安全实战篇之RBAC认证授权-v1 k8s安全管理:认证、授权、准入控制概述认证k8s客户端访问apiserver的几种认证方式客户端认证:BearertokenServiceaccountkubeconfig文件 授权Kubernetes的授权是基于插件形成的,其常用的授权插件有以下几种&a…

SpringBoot集成Dubbo

在SpringMVC中Dubbo的使用https://tiantian.blog.csdn.net/article/details/134194696?spm1001.2014.3001.5502 阿里巴巴提供了Dubbo集成SpringBoot开源项目。(这个.....) 地址GitHub https://github.com/apache/dubbo-spring-boot-project 查看入门教程 反正是pilipala一大…

【技术分享】RK356X Android 使用 libgpiod 测试gpio

前言 libgpiod 是用于与 Linux GPIO 字符设备交互的 C 库和工具库;此项目包含六种命令行工具(gpiodetect、gpioinfo、gpioset、gpioget、gpiomon),使用这些工具可以在命令行设置和获取GPIO的状态信息;在程序开发中也可…

网易按照作者批量采集新闻资讯软件说明文档

大家好,我是淘小白~ 今天给大家介绍的爬虫软件是网易按照作者采集的软件 1、软件语言: Python 2、使用到的工具 Python selenium库、谷歌浏览器、谷歌浏览器驱动 3、文件说明: 4、配置文件说明: 5、环境配置 安装Python&am…

【入门Flink】- 03Flink部署

集群角色 Flik提交作业和执行任务,需要几个关键组件: 客户端(Client):代码由客户端获取并做转换,之后提交给JobManger JobManager:就是Fink集群里的“管事人”,对作业进行中央调度管理;而它获…

《面向对象软件工程》笔记——1-2章

“学习不仅是一种必要,而且是一种愉快的活动。” - 尼尔阿姆斯特朗 文章目录 第一章 面向对象软件工程的范畴历史方面经济方面维护方面现代软件维护观点交付后维护的重要性 需求、分析和设计方面团队开发方面没有计划,测试,文档阶段的原因面向…

Nginx简介,Nginx搭载负载均衡以及Nginx部署前端项目

目录 一. Nginx简介 Nginx的优点 二. Nginx搭载负载均衡 2.1 Nginx安装 2.1.1 安装依赖 2.1.2 解压nginx安装包 2.1.3 安装nginx 2.1.4 启动nginx服务 2.2 tomcat负载均衡 2.3 Nginx配置 三. Nginx前端部署 一. Nginx简介 NGINX(读作:engi…

欧科云链研究院:如何降低Web3风险,提升虚拟资产创新的安全合规

在香港Web3.0行业,技术推动了虚拟资产投资市场的快速增长,但另一方面,JPEX诈骗案等行业风险事件也接连发生,为Web3行业发展提供了重要警示。在近期的香港立法会施政报告答问会上,行政长官李家超表示,与诈骗…

win10 下编译ffmpeg3.36.tar.gz

所需工具: win10 ffmpeg3.36.tar.gz。 或其他版本,下载地址:Index of /releases msys2。 下载地址:http://www.msys2.org。 Visual Studio 2017。 1. 安装MSYS MSYS2像是windows下的一个子系统,…

3.4_Linux-浏览文件系统

1.Linux 文件系统 如果你刚接触Linux系统,可能就很难弄清楚Linux如何引用文件和目录,对已经习惯Microsoft Windows操作系统方式的人来说更是如此。在继续探索Linux系统之前,先了解一下它的布局是有好处的。 你将注意到的第一个不同点是&…

MASK-RCNN tensorflow环境搭建

此教程默认你已经安装了Anaconda,且tensorflow 为cpu版本。为什么不用gpu版本,原因下面解释。 此教程默认你已经安装了Anaconda。 因为tensorflow2.1后的gpu版,不支持windows。并且只有高版本的tensorflow才对应我的CUDA12.2; 而…

从零开始的JSON库教程(一)

本文是学习github大佬miloyip而做的读书笔记,项目点此进入 目录 1、JSON是什么 2、搭建编译环境 3、头文件与API设计 4、JSON的语法子集 5、单元测试 6、宏的编写技巧 7、实现解析器 8、关于断言 1、JSON是什么 JSON(JavaScript Object Notati…

SoftwareTest5 - 你就只知道功能测试吗 ?

你就只知道功能测试吗 ? 一 . 按照测试对象划分1.1 文档测试1.2 可靠性测试1.3 容错性测试1.4 安装卸载测试1.5 内存泄漏测试1.6 弱网测试 二 . 按是否查看代码划分2.1 黑盒测试2.2 白盒测试2.3 灰盒测试 三 . 按照开发阶段划分3.1 单元测试3.2 集成测试3.3 冒烟测试3.4 系统测…

用自己的数据集训练YOLO-NAS目标检测器

YOLO-NAS 是 Deci 开发的一种新的最先进的目标检测模型。 在本指南中,我们将讨论什么是 YOLO-NAS 以及如何在自定义数据集上训练 YOLO-NAS 模型。 在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 -…

浮动模块布局

基本思路 若宽度和浏览器一样宽,则不需要设置width 一般父盒子使用标准流,然后标准流内使用浮动 一般父盒子需要居中显示,使用 margin: 0 auto; 注意浮动盒子之间的margin值 与 父盒子width、height值之间的相等关系,一定要计算…

Goland 对容器中的 Go 程序断点远程调试

1,针对 golang 程序打断点有哪几种情况 临时进程:针对临时运行一次的 Golang 脚本,比如定时统计脚本,定时推送脚本。常驻进程:针对一直在后台运行的 Golang 程序,比如 HTTP 或者 GRPC 服务。 我们现在假设…