CPU虚拟化:在物理机(宿主机)中通过线程或进程这种纯软件方式模拟出假的CPU
物理cpu核数 > 虚拟cpu总核数的原因是:虚拟出来的每颗cpu实际上就是一个线程或者进程。虚拟cpu过多时,需要进行进程/线程切换,比较浪费
1、模拟:使用软件方式实现CPU,需要模拟环0,1,2,3。host架构和guest架构不同,如x86和android,因此guest上运行的所有指令都要进行转换,不管是用户空间的指令还是内核空间的指令,因此性能很低。需要安装模拟器来将其他类型的cpu指令翻译为本机cpu的指令集。
2、虚拟:guest架构和host架构相同或可以被兼容(host为64位,guest可以使用32位),只需要模拟环0即可,因为虚拟机中的内核需要运行在内核态,即需要将虚拟机中的内核代码转换为本机的cpu指令集。
3、hypervisor直接管理物理硬件(cpu和memory),hypervisor有时候就是host中的内核。
4、进程中涉及到系统调用时的运行过程:
进程运行在cpu的环3(用户态)上,如果涉及到硬件调用时,就通过软中断方式发起系统调用,由用户态切换到内核态。内核完成系统调用完成后将结果告知调用进程,因此恢复中断现场,进程继续运行。
5、CPU虚拟化方案:
A、完全虚拟化:guest操作系统内核不需要进行任何修改,guest以为自己直接管理真实的底层物理硬件。
guest相对于宿主机(host)而言只是一个进程,这时候guest中的内核程序只是运行在host的环3(用户空间)上的进程,但是,对于内核而言,它必须要运行在环0上,即内核空间要运行在环0上,需要具有所有资源的访问权限。
这时候我们就要进行CPU的虚拟化,通过软件的方式模拟出一个假的CPU,让guest的内核运行在模拟出来的CPU环0上。软件模拟出来的CPU实际上就是host中的一个进程或线程。如果只考虑虚拟化方式而不考虑模拟方式,这时候模拟CPU只需要模拟环0就可,guest中用户空间的操作可以直接运行在真实CPU的环3上。
运行过程:guest中运行的程序需要涉及到硬件操作时,需要发起系统调用,交给guest的内核进行处理,即要经历CPU的工作流程,取指令,解析指令,运行指令等过程,但是guest中的内核运行在host的用户态,因此无法转换成真正的特权指令集,所以还需要向host内核发起系统调用,host内核完成系统调用后,将结果返回给guest内核,guest内核再将结果返回给guest用户进程。可以理解为:在guest中运行的程序使用硬件,需要经过两次内核操作,一是guest中的内核,二是host中的内核。
工作过程如下:
a、BT技术:host内核运行在环0上
BT模式下,假设虚拟机(guest)中的内核运行在环1上,guest的用户空间运行在环3上。但是,guest内核是不可能运行在环1上的,因为环1上没有特权指令,因此必须使用软件的方式模拟环0。BT技术是将guest的内核代码从运行在模拟出来CPU环0移到真实的CPU的环1中。环1和环0之间的交互采用了BT(Dynamic Binary Translation,动态二进制翻译,这个技术主要是vmware公司开发的)技术。BT通过监听环1,随时将guest的内核调用转换为host内核中真正的特权指令的调用,即将上图中guest用户进程调用guest内核,guest内核调用host内核的过程,简化为guest用户进程调用guest内核。即可以理解为BT实现了运行时翻译,guest中涉及到内核空间的调用时,是边调用边翻译边转化的,即减少了在模拟CPU中执行完CPU工作流程后再次提交给host内核的过程。BT技术严重依赖于底层架构(即虚拟机中guest的架构必须和底层架构相同或者可以被兼容),因为它是直接在guest中运行内核指令时动态转换为真实的特权指令集,因此无法实现跨平台。guest的内核运行在host的环1上,guest的用户空间运行在host的环3上。
b、硬件方式:硬件辅助虚拟化,host的内核运行在环-1上。
硬件辅助虚拟化(HVM,hardware virtual machine):由硬件方式实现完全虚拟化,hypevisor运行在环-1上,guest的内核在环0上,即四个环变成了五个环,由硬件进行特权指令的转换,而不是软件方式进行转换。
host中的内核运行在环-1上,特权指令变成放置在环-1上而不再是环0上。guest的内核就可以直接运行在物理CPU中的环0上了。在guest中可以看到物理CPU中的环0-3这个四个环,这是由硬件直接虚拟给guest而不再是通过软件方式虚拟出CPU的四个环。guest中对内核空间的操作直接由硬件进行转换,如guest中执行内核空间操作时,在环0上运行内核代码时,就会被运行在环-1上的hypevisor捕获到,由硬件直接转换为对应的特权指令。
Intel:Intel VT,Intel Virtualization Technology
AMD:AMD-V
B、半虚拟化:软件方式实现,host内核在环0上
这是为了提高软件方式模拟环0虚拟化技术性能而出现的,硬件辅助虚拟化出现后,这种技术就没有存在的意义了。guest的操作系统代码进行了更改,guest是知道自己运行在虚拟机中的。在guest中涉及到内核空间的操作,不是在模拟的环0上转换为cpu的指令集,而是要通过向VMM(hypervisor) 进行hypercall调用来完成特权指令的调用,这是直接调用而不是翻译的过程。这样guest的内核和host的内核交互的过程大大简化了,因为不需要中间的翻译过程了,比如省略了在软件模拟环0上操作的过程。
总结:
性能:硬件辅助虚拟化 > 半虚拟化 > BT技术
完全虚拟化:虚拟机监视器在关键的时候“欺骗”虚拟机,使得客户操作系统以为自己在真实的物理环境下运行,可以使用BT技术进行加速,如果支持HVM时,直接使用硬件辅助虚拟化技术
优点:代码的转换工作是动态完成的,无需修改客户操作系统代码
缺点:需要进行两次转换,即guest中进行硬件操作时,需要提交到guest的内核,然后再由guest内核提交给host内核进行翻译为特定的硬件指令。
半虚拟化:guest操作系统通过更改代码来解决特权指令调用问题,在guest中进行系统调用时,直接提交给host内核进行解析。guest是知道自己运行在虚拟机中的,而不是真实的物理硬件上。
优点:比全虚拟化性能好一些,由两次翻译减少为一次翻译
缺点:不适用于所有的操作系统,因为有些操作系统不能进行代码更改,比如windows
参考:
计算机的心智操作系统之哲学原理
https://yq.aliyun.com/articles/71295
http://blog.51cto.com/tasnrh/1736758
https://blog.csdn.net/coderhattonliu/article/details/54670954