Hypervisor允许多个操作系统共享一个CPU(多核CPU的情况可以是多个CPU)。虽然基本的技术已有半个世纪之久,但是应用到嵌入式领域却是近些年才发生的。
Hypervisor是宽泛的计算概念的一部分,作为虚拟化技术为人所知,这个概念已经出现半个世纪左右了。基本上Hypervisor的目的是共享硬件资源,就像操作系统所做的那样。本文将讨论Hypervisor与操作系统之间的显著差异,同时说明Hypervisor是怎么工作的。
历史背景:
19世纪60年代中期,大型机统治着整个计算世界,但是这些大型机非常稀有且价格极其昂贵(1960s的成百上千美元,相当于今天的百万美元)。不像今天,每个人都拥有自己的电脑(考虑到我们携带的所有数码产品,事实上每个人都拥有多个计算机,而且计算能力比大型机时代的计算机更加强大)。由于大型机的稀有和昂贵的价格,早起的大型机系统一般具有分时的能力。这意味着一台机器可以服务于多个用户,给每一个用户分配一个特定的时间片,在该时间片内某个用户的任务将被执行。一旦一个时间片消耗完毕,机器将会切换到下一个用户的任务。简单起见,可以理解为每个用户获得了一个虚拟机(VM),从每个用户的角度来看,他们每个人都像是拥有自己的大型机。这样的大型机提供了一个Hypervisor(有点像操作系统的操作系统),用以协调多个虚拟机。由于这个原因,hypervisor又被认为是虚拟机管理器,简称为VMM。从系统软件设计者的角度来看,Hypevisor简化了他们的工作,因为每个用户都是相互独立的,而且各自拥有简单的机器模型。Hypervisor为运行在大型机上的每个虚拟机分配CPU、内存、磁盘等硬件资源。即使是在大型机的早期,VMM也允许不同的操作系统同时运行在一台机器上。Hypervisor在当今的现代数据中心和桌面电脑中的应用相当普遍(想想Linux容器, Docker, Xen, VMware等等),但是近些年来它们才进入到嵌入式应用领域,比如医疗设备、汽车信息娱乐系统和数字仪表系统。然而嵌入式领域的Hypervisor在使用目的、约束条件和特点上与数据中心、桌面电脑中的hypervisor有显著的不同,尤其是在关键安全方面。
VM86
微处理器上的Hypervisor的历史相当有趣,它直接诞生于和今天的微处理器一样的架构。伴随着Intel 80386芯片的推出(1985年10月),第一个主流的"虚拟化"技术诞生了。当时的IBM PC是基于8088芯片(8086的一个8位地址总线版本)设计的,可以寻址1M字节的内存。软件的增长很快超出了早期PC有限的内存,所以很快进化出了可以给软件提供更多内存空间的80286和80386芯片。80386是一个具有保护模式的处理器,它可以运行多个VM86虚拟机,我们下面将会看到VM86时怎样运作的。但是重要的是要记住,就目前的虚拟化而言,VM86模式只是80386 32位保护模式全部功能的一个小子集,现代VM映射了绝大多数底层实现。有趣的是,又过了20年微处理器才开始全面实行虚拟化。2005年11月Intel发布了奔腾IV模型,随后AMD在2006年5月发布了支持完全保护模式的虚拟化模型Athlon-64。伴随着Cortex A-15的推出,ARM架构在2011年末实现了硬件虚拟化。
操作理论
VMM所做的工作和OS所做的工作,既有相似之处又有不同之处。为了理解它们,让我们退后一步先看一下程序运行的细节,然后再看VMM是如何工作的。
线程的执行
一个程序之所以能运行是因为CPU按照程序指示的执行流程,一个接一个地执行程序包含的指令。这个执行流通常称为线程,因为它在内存中的代码里来回穿梭,就像一条线在织物中来回穿梭一样。在这种模型中,一个线程不在下一个连续地址继续执行的唯一原因是存在一些分支指令(比如跳转,子程序调用,go to),这些分支指令会导致线程在不同的地址继续执行。不过重点是线程会按照程序的逻辑流来执行。当然一个线程不会永远运行下去,下面几种情况可能会发生。– 线程需要等待某些事件发生(比如用户输入,网络数据包的可用)– 线程遇到了某些问题(比如访问了没有权限的内存区域)– 某个硬件事件发生(比如定时时间到了OS决定调度另一个线程)
OS如何工作
上述事件的处理就是OS的工作内容。当一个线程需要等待某个事件的发生,OS就会介入把当前线程设置为sleep状态,并启动另一个线程。当一个线程执行过程遇到问题,OS会介入要么纠正这个错误,要么终止当前进程。在任何一种情况下,结果可能都是一个不同的线程将被调度且执行。最后是硬件事件发生的情况,OS要么自己处理这个事件(定时器timeout的Case),要么把该事件转送给另一个线程(如设备驱动)。当然,上面是对OS所做工作的过度简化,但是足以让大家明白OS是怎么工作的了。对一个实时OS比如QNX来说,OS只有在需要它的时候才会介入。大多数时候CPU都在运行当前被调度的线程(多核处理器的情况下是多个线程)。只有当例外发生时OS才会接手,决定要做什么(也许是重新调度一些线程),然后就会把CPU的使用权交还给被调度的线程。
未完待续
注:本文译自 What is a hypervisor and how does it work by Randy Martin.
来源:oschina
链接:https://my.oschina.net/u/4256309/blog/4439506