系统虚拟化

虚拟化简介

系统虚拟化的发展历史

第一个发展阶段是70年代

第二个发展阶段是2000年到现在

系统虚拟化带来了新的机会

  • 虚拟机动态迁移(小偷偷数据,虚拟机跑开)

虚拟化是对接口的模拟

虚拟化和抽象是两个非常类似却又经常被混淆的概念。抽象(Abstraction)通常是指提出一套新的接口,虚拟化(Virtualization)则是对已有接口进行模拟。举个例子来说,操作系统对一块硬盘的抽象,是提出一套文件系统的接口(例如open、close、read、write等),使得应用程序可以很方便的使用,而不用担心到底硬盘是SATA接口还是IDE接口;而要虚拟化一块磁盘,则通常需要hypervisor向虚拟机提供实际的硬盘接口,比如虚拟一个SATA硬盘,因此虚拟机内部运行的操作系统以为自己正在操作一块SATA的硬盘。

所以,我们说虚拟化X,是指模拟X对外的接口,使用该接口的组件不知道自己到底是在使用X还是在使用虚拟的X。X如果是硬盘,那么虚拟化就是模拟硬盘的接口;X如果是系统,那么就需要模拟系统的接口。什么是系统的接口呢?

计算机系统不同层次的接口

计算机系统的接口,有很多不同的层次。我们介绍其中的三个:ISA、ABI和API。

ISA一般分为User-ISA和System-ISA。User-ISA包括读写内存、进行加减乘除运算等,大家在上计算机汇编课的时候学习的大部分都是这一类,对程序员来说比较熟悉;System-ISA包括对页表的操作、开关中断等,这些指令通常会改变整个系统的状态,因此更多的是被操作系统等底层软件所使用,不允许应用程序直接调用。

ABI的全称是Application Binary Interface。

  • CS的例子,说明ABI的作用
  • ABI包括user-ISA和OS的system call,还包括calling convention
  • 静态编译,可以让应用程序从依赖API变成依赖ABI,但缺点是应用程序变大,内存耗费变多

应用程序的运行通常依赖于其所使用的API,在ABI的基础上还依赖于库(Library)。

  • 比如Python的应用,需要import很多库

系统虚拟化是对ISA的模拟

系统虚拟化的实现

最简单的虚拟化:每条指令都用软件模拟执行

如何将大部分指令运行在CPU上?

功能1:CPU虚拟化

功能2:内存虚拟化

功能3:I/O虚拟化