CPU虚拟化技术

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014113686/article/details/82755454

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

猜你喜欢

转载自blog.csdn.net/u014113686/article/details/82755454