虚拟化学习笔记三——原理概述

本篇博客主要是对虚拟化原理的概述

虚拟化的三个主要任务

虚拟机监控器VMM对物理资源的虚拟可以归结为三个主要任务:处理器虚拟化、内存虚拟化、I/O虚拟化。
处理器虚拟化是VMM中最核心的部分,内存虚拟化和I/O虚拟化都依赖于处理器虚拟化的正确实现。

特权指令与敏感指令

特权指令

特权指令:系统中一些操作和管理关键资源的指令,这些指令只有在最高特权级上才能正确执行。如果在非最高特权级上运行,特权指令会引发一个异常(其实不一定,也可能被直接忽略),处理器会陷入到最高特权级,交由系统软件来处理。

敏感指令

敏感指令:操作特权资源的指令,包括修改虚拟机的运行模式或者下面物理机的状态;读写敏感的寄存器或是内存,例如时钟或中断寄存器;访问存储保护系统、内存系统或是地址重定位系统以及所有的I/O指令。

所有的特权指令都是敏感指令,但并不是所有的敏感指令都是特权指令。

陷入再模拟

为了VMM可以完全控制系统资源,它不允许直接执行虚拟机上操作系统(即客户机操作系统)的敏感指令。也就是说,敏感指令必须在VMM的监控审查下进行,或者经由VMM来完成。
如果一个系统上所有敏感指令都是特权指令,就能用一个很简单的方法来实现一个虚拟环境:将VMM运行在系统的最高特权级上,而将客户机操作系统运行在非最高特权级上,当客户机操作系统因执行敏感指令(此时,也就是特权指令)而陷入到VMM时,VMM模拟执行引起异常的敏感指令,这种方法被称为“陷入再模拟”。

虚拟化漏洞是什么?

如果一个体系结构上,存在敏感指令不属于特权指令,那么就可能导致系统的控制信息被虚拟机修改或访问,或者会导致VMM遗漏需要模拟的操作,影响虚拟化的正确性。
我们将这种情况称为虚拟化漏洞。
如果一个体系结构上存在敏感指令不属于特权指令,那么其就存在虚拟化漏洞,它就不是一个可虚拟化的结构。

填补或避免虚拟化漏洞的方法

  1. 所有虚拟化都采用模拟来实现,比如解释执行。
  2. 硬件层面填补虚拟化漏洞
  3. 通过软件的方法避免虚拟机中使用到无法陷入的敏感指令。

1.软件模拟

解释执行

取一条执行,模拟出这条指令执行的效果,再继续取下一条指令,周而复始。由于是一条一条取指令,所以不会漏过任何一条指令,在某种程度上,每条指令都“陷入”了,所以解决了陷入再模拟的问题,进而避免了虚拟化漏洞。
虚拟化学习笔记三——原理概述_第1张图片
缺点:性能太差

扫描与修补

如果虚拟机模拟的CPU和物理CPU的体系结构是相同的,其实大多数指令可以被映射到物理CPU上直接运行,没必要每条指令都进行模拟。

扫描与修补,让大多数的指令直接在物理CPU上运行,而把操作系统代码中的敏感指令替换为跳转指令或会陷入到VMM中去的指令,使其一旦运行到敏感指令处控制流就会进入VMM中,由VMM代为模拟执行。

二进制代码翻译

二进制代码翻译的思想很简单,就是通过扫描并修改客户机的二进制代码,将难以虚拟化的指令转化为支持虚拟化的指令。
VMM通常会对操作系统的二进制代码进行扫描,一旦发现需要处理的指令,就将其翻译成为支持虚拟化的指令块。这些指令块可以与VMM合作访问受限的虚拟资源,或者显式地触发异常让VMM进一步处理。

2.硬件辅助完全虚拟化

硬件本身加入足够的虚拟化功能,截获操作系统对敏感指令的执行或者对敏感资源的访问。
Intel的VT-x就是这一方向的代表。

VT-x的具体信息看这篇博客。

3.直接源代码改写——类虚拟化技术

类虚拟化是通过在源代码级别修改指令以回避虚拟化漏洞。
二进制代码是在二进制代码级别上避免虚拟化漏洞,而类虚拟化修改的操作系统内核的代码,使得操作系统内核完全避免这些难以虚拟化的指令。

你可能感兴趣的:(虚拟化)