注:文中图片直接借用大佬文章中的图片,链接见文末。
一、虚拟化技术简介
1. 什么是虚拟化技术
在一个物理机(宿主机)上安装一个操作系统,操作系统上安装一个虚拟化软件,在虚拟化软件上创建出多个虚拟机。虚拟机发起系统调用等特权指令的操作时会被虚拟化软件接收,经过虚拟化软件处理后交由宿主机实现系统调用。这样就实现了在一个物理机上运行多个虚拟机,而这个实现的过程就是虚拟化,支持这种虚拟化的技术就是虚拟化技术。
2. 虚拟化模式
x86架构CPU提供4个运行级别给操作系统和应用程序来访问硬件,权限级别由高到低分别为:Ring0、Ring1、Ring2、Ring3,操作系统(内核)的代码运行在最高权限级别Ring0,应用程序的代码运行在最低权限级别Ring3。应用程序需要访问硬件时,执行系统调用,CPU级别从Ring3切换到Ring0,跳转到系统调用对应的内核代码位置执行,完成设备访问,然后再从Ring0切换回Ring3,继续执行应用程序代码。这个过程称作用户态和内核态的切换。
那么,虚拟机应该运行在哪个CPU运行级别呢?因为宿主机操作系统是工作在Ring0的,所以虚拟机操作系统就不能也运行在Ring0了,但是这样一来,虚拟机操作系统就没有足够的权限执行所有的指令了,当执行一些特权指令时是会报错的。那怎么办呢?虚拟机管理程序(VMM,Virtual Machine Manager)就是来解决这一问题的。虚拟机通过VMM实现其CPU对硬件的访问,根据其原理不同分为两种模式:半虚拟化模式和全虚拟化模式,其中全虚拟化模式又分为基于二进制翻译的全虚拟化和硬件辅助的全虚拟化。
(1)半虚拟化
半虚拟化也叫超虚拟化、操作系统辅助虚拟化。
半虚拟化的思想:修改虚拟机操作系统内核,替换掉不能虚拟化的指令,通过超级调用(hypercall)直接和底层的虚拟化层(hypervisor)通讯。
半虚拟化的特点:性能好,效率佳,但修改操作系统内核难度大,且只支持虚拟化Linux,无法虚拟化Windows。