即将保研上交的大佬推荐了一个操作系统的网课,里面有系统虚拟化部分。听得半知半懂,在这里做一个总结。如有疏漏,还请指出。
文章目录
- 什么是虚拟 virtualization
- 虚拟化是云计算的核心实现技术
- 操作系统的接口层次
- 思考下面这些程序调用了哪个接口
- 定义虚拟机
- 高效虚拟化的定义
- 引入虚拟机需要什么代价
- 虚拟机的两种模式
- Type 1
- Type 2
- 如何实现虚拟化
- Trap and Emulate
- 还有一个问题
- Emulate的方法
- 解释执行/二进制翻译
- 硬件虚拟化
- Type 2有了哪些变化?
- VM包含哪些内容
什么是虚拟 virtualization
我个人以为,虚拟就是制造假象。我们虚拟化一台机器,就是利用软件的技术(常常配合硬件的支持)把机器的实际接口包裹成一个fake接口,用户可以使用fake接口而不必使用原有接口操作机器,fake接口往往更加容易被用户使用。
比如我们虚拟化内存:物理实在的内存就是一块块dram,计算机通过地址总线选定内存单元,记住一个内存地址对程序员来说是很难的。而虚拟之后的内存,变成了程序员(这里主要指汇编程序员)眼中连续编址的内存空间。而这两个地址之间的转换,就由一个虚拟化层负责实现。
与抽象(abstraction)做对比:虚拟是改造原有的接口使其易于使用,抽象是打造接口或者提供新的接口给上层使用者。
虚拟化是云计算的核心实现技术
云计算的初衷是,数据处理和数据存储可以通过互联网访问的大型计算和存储系统集群上更加有效的完成。我们使用的电脑运行一个个进程,远程主机运行的是来自多租客的虚拟机(或者是轻度虚拟化的容器)。借助虚拟化技术,这些虚拟机直接相互隔离,而且不必考虑底层硬件架构的不同以及操作系统的不同。
通过虚拟化,数据中心大量的、性能参差不齐的计算机群仿佛一个大型计算机。用户可以按需订阅这台大型计算机的资源。云服务商也受益于虚拟化技术,可以更好的进行资源的集中管理与调度。
云计算概念与模型 什么样的应用适合云计算
操作系统的接口层次
要理解什么事系统虚拟化,首先要明白这个图。
计算机说白了,就是运行程序的机器。程序的运行就是利用软件的一条条指令去操作硬件。如果我们让所有的进程都可以直接操控硬件,那么会有很大的安全隐患,而且进程直接的调度也难以做到。
于是操作系统应运而生。它对下可以操作一些特权级的硬件指令,对上协调进程并提供系统调用接口。有了操作系统之后,进程的执行模式变成了受限的直接执行。
为了方便用户写代码,一些人将已经编好的代码做成一个库,用户可以调用库运行程序。
于是有了这些接口:
- ISA——instruction set architecture,与计算机组成原理中的指令集是一样的,指的是机器可以识别的语言。
用户ISA部分:所有程序都可以执行的指令,比如mov、add等指令。
系统ISA部分有些指令比如I/O操作需要操作系统代替进程执行,比如修改中断表等。 - ABI——application binary interface,比如简单的hello world程序,编译之后是0、1组成的二进制序列(exe文件)。这个exe文件通过ABI接口来运行。
- API——application programming interface,比如python中有很多的包,程序调用这些包即可完成相应的功能。
思考下面这些程序调用了哪个接口
- Web Game: 只需要下载一个浏览器即可正常运行,是API
- Office Word:只有Windows有,是ABI
- Windows 10:Windows只能运行在x86架构上,是ISA
定义虚拟机
虚拟机的引入主要就是为了解决不兼容的问题,x86架构与arm架构的应用不兼容,Windows与Linux的应用不兼容。
而云计算等情形下要求我们能在任何硬件上跑任何系统。也就是说我们要把硬件虚拟化,使得硬件接口(ISA)可以被任何软件系统使用。
因此,虚拟机虚拟ISA接口,向下利用宿主机器的ISA,向上提供用户需要的ISA。
高效虚拟化的定义
- 为虚拟机内程序提供与该程序原先执行的硬件完全一样的接口(运行在虚拟机内的程序不应该能发现自己运行在虚拟机上)
- 虚拟机只比在无虚拟化的情况下性能略差一点
- 虚拟机监控器控制所有物理资源
引入虚拟机需要什么代价
我们使用虚拟机技术,显然是要在一台机器上同时运行多个计算机系统,也就是说有在操作系统之间做切换的需求。
类似于进程的上下文切换,我们要把用户的寄存器全部保存起来然后再恢复。当我们切换操作系统时,也需要把操作系统的状态信息做记录然后恢复。
因此,我们引入虚拟机监控器层(VMM/Hypervisor)直接接触硬件。得到效果是这样的:
虚拟机的两种模式
Type 1
上图所示即为Type 1结构。VMM直接包裹硬件。
VMM直接运行在硬件之上,所以它需要提供操作系统的功能,如虚拟机调度、硬件驱动、内存管理等。
这种方式的好处就是效率高。坏处就是VMM需要的功能太多,定制化程度高。而且VMM始终运行,不如Type 2灵活。
Type 1 代表有VM Ware、Xen。
Type 2
Type 2 复用主机的操作系统,因此VMM的任务会减轻很多。此外,Type 2 模式下,机器可以正常运行进程,VMM只是宿主机器的一个进程而已。
Type 2 相比Type 1 最大的好处就是灵活,代表是QEMU/KVM。
如何实现虚拟化
完整实现虚拟化需要三部分,虚拟处理器、虚拟内存和虚拟设备。前面我们提到虚拟机虚拟ISA接口即为虚拟处理器。
Trap and Emulate
我们以Type 1 为例。
上图中,EL0与EL1权限不同,EL1可以执行特权指令,EL0只能执行用户态指令
我们的解决思路是Trap and Emulate。
Trap: 在用户态EL0执行特权指令将陷入EL1的VMM中。
Emulate:这些指令的功能都由VMM内的函数实现
当虚拟机内正常执行用户态进程时,其实也是直接操作硬件的。但是当用户态进程执行特权指令时,就将Trap进入EL1的VMM,由VMM通过硬件或者软件的方法,实现该特权指令执行后应有的效果。
这里还有一个问题,VM内的进程如何切换到操作系统呢?不同于普通机器,虚拟机进程需要先进入VMM,然后VMM运行虚拟机操作系统。
还有一个问题
我们虚拟机内的操作系统与正常运行在硬件上的操作系统是一样的,没有任何代码修改,而平时我们操作系统是运行在EL1特权级上,虚拟机操作系统则需要运行在EL0特权级上。
这会引入一个问题:操作系统在设计时有些指令如果在EL1执行,就会变成nop,换言之,有些特权指令不能被trap,自然也不能被Emulate。
私以为这个问题的解决是通过操作系统让步(不让其变成nop)或者硬件增加支持(例如x86的硬件虚拟化方法使得虚拟机操作系统运行在non-root模式下的EL1)实现的。
Emulate的方法
解释执行/二进制翻译
解释执行即使用软件方法一条条对虚拟机代码进行模拟。
二进制翻译引入了一些加速方法, 一是在执行前批量翻译虚拟机指令,二是 缓存已翻译完成的指令。(实际上跟指令Cache很相近)
硬件虚拟化
x86专门给VM提供了non-root模式,使得虚拟机内的操作系统可以直接运行在non-root模式下的EL1,如果虚拟机与宿主机器是同种架构,那么虚拟机的操作系统可以直接操纵硬件,取得与非虚拟机下同等的运行效果。
arm为VMM提供了EL2特权级。
硬件虚拟化在相同架构环境下运行效果杰出。
Type 2有了哪些变化?
文字大家可以先略过 type 1下,VMM相当于操作系统,VM相当于一个进程。 type 2下,VMM相当于一个进程,那么VM内的进程就相当于宿主机器的一个线程。
我的理解是,type2的VMM(EMNU)其实远没有type1强大,它更多的是起到KVM的一个接口的作用。反而是Host OS 配合 KVM完成虚拟化CPU、虚拟化内存的工作。
因此我个人认为,Type 2与Type 1并没有本质区别。
VM包含哪些内容
vCPU是虚拟的CPU,虚拟机以为它运行的vCPU在真实的CPU上,但实际上是用线程模拟出的CPU(VMM相当于宿主机器的一个进程,那么VM内的进程就相当于宿主机器的一个线程)。虚拟寄存器对应物理寄存器,类似于OS的上下文切换。
虚拟机的内存相当于从堆中malloc出的独占内存。
从这里我们其实就可以感受到为什么虚拟机是安全隔离的了。即使虚拟机内部胡搞,对于宿主机器来说它就是一个普通的线程(type 2)。如果想要该虚拟机抢占更多物理资源,就要配置更多的vCPU,因此就有更多的VM线程。
此外,不同虚拟机的内存地址空间是完全隔离的。访问设备则需要VMM进一步提供设备调度。