虚拟化:就是将底层的计算平台虚拟成相互隔离的具有独立计算机主件虚拟平台

一、cpu虚拟化:
(1)模拟:emulation
(2)靠软件实现的CPU虚拟化,进程切换非常消耗资源,当使用特权指令,调用HOst主机内核执行。翻译转换(早期)效率低下。底层与上层构架可以不一致
注:虚拟:virtulization 上层与底层架构要保持一致
(3)完全虚拟化(full-virtulization)整个物理机虚拟一个完整的环境给虚拟。虚拟机都不知道自己运行在虚拟化环境中。假设各guest 内核运行在ring 1的 软件模拟实现ring 0(性能比较差)
(1、BT:wmware提出二进制翻译(软件)能够在guest对特权指令调用的一刻直接翻译成对host的特权指令。不用自己在软件之间多次进行解码,边运行边调用边翻译边转换。80%~85%BT监控在环一上,随时将guest内核调用立刻转化为环零的调用。

(2、硬件辅助的虚拟化:HVM:CPU设计有别于传统架构,多设计1个环。(85%)
(硬件)inter-vtx  amd-v ,让CPU拥有5个环: 3 2 1 0 -1
虚拟机用户空间运行在运行在环 3上
host 内核运行在环 -1上
虚拟机内核运行在环0 上
虚拟机认为自己内核是运行在环零上的,当你调用的时候,交给host 环 -1 ,host能捕获guest对环 0上的调用,由CPU主件自己就能完成转化 ring -1中的特权指令(激活host来完成转换,或者host辅助的)
arm等构架的CPU没有问题。虚拟架构必须与底层物理架构一致。

(4)半虚拟化(para-virtulization)虚拟机内核明确知道自己在虚拟化环境中,当需要运行特权指令,直接跟宿主机的内核发起请求。因此指令调用简单的对应为宿主机内核调用
vm monitor = hypervisor
直接管理硬件相当于内核,只包括CPU、内存 把对hyper 调用虚拟成 hyper call,各虚拟在要使用特权指令对hyper call 发起调用。虚拟机的内核明确知道运行虚拟化环境。

二、Memory虚拟化:
进程:线性地址空间
内核:物理地址空间
1、hypervisor分配给各虚拟机是离散的内存页框,而对于虚拟机,它则认为自己拿到的是连续的地址空间。
2、交给CPU线性地址空间,然后CPU交给MMU转化为虚拟的内存地址(实际还是假的)这个转化是无效的,还得在转化一次hypervisor管理的物理地址空间。
3、TLB很难命中,还会影响其它的虚拟机。每次虚拟机切换就清空TLB,大量消耗资源。

解决方案:
1、影子列表—shadow page table 在虚拟机内部软件模拟出一个mmu,cpu物理mmu还是本身那个mmu。

2、MMU Virtulization:不使用影子列表,当GVA通过虚拟机的MMU转化为GPA的同时这个CPU 的MMU芯片自动会直接转化为HPA —-硬件实现的。
1、Intel: EPT, Extended Page Table
2、AMD: NTP, Nested Page Table

3、TLB virtulization    page table转换结果。
tagged TLB 加个那个虚拟机的标签。

三、I/O虚拟化:
IO的设备分类:
1、外存:
硬盘、光盘、U盘
2、网络设备:
网卡
3、显示设备:
VGA: frame buffer机制完全虚拟化
4、键盘鼠标:
ps/2, usb 完全模拟

I/O虚拟化的方式:
1、模拟: 完全使用软件来模拟真实硬件(达到60%就不错了)
2、半虚拟化化: 类似CPU半虚拟化,虚拟机调用虚拟机网卡IO Frontend前端驱动直接发往IO backend驱动(接近95%)使用硬盘和网卡
3、IO-through: IO透传  —Intel: VT-d

Intel: VT-d 实现IO透传技术。DMA把各io的数据放到寄存器中,或者把从内存的数据放到寄存器里。嵌入目标物理地址,区别IO驱动请求,发往虚拟机。完成硬件映射。
基于北桥的硬件辅助的虚拟化技术;

两种实现方式:
Type-I运行在hypervisor上:
xen, vmware ESX/ESXi,
Type-II运行在host操作系统之上的:
kvm, vmware workstation, virtualbox

Intel硬件辅助的虚拟化:
CPU: vt-x, EPT, tagged-TLB
IO/CPU: vt-d, IOV, VMDq

第一类:跟处理器相关:vt-x
第二类:跟芯片相关:vt-d
第三类:跟IO相关:VMDq和SR-IOV