虚拟化技术
1、虚拟化基本知识
计算机的基本部件
控制集:CPU
存储:mem,
I/O:
keyboard,moitor
虚拟化就是将一组物理平台,虚拟化为多组不同的,彼此之间隔离的平台。
CPU在OS安装以后就已经被虚拟化了,每个进程认为自己是独占CPU,内存的。CPU的虚拟化就是将其分为时间片
用户空间的进程需要使用硬件,
cpu执行方式:
最外层运行普通指令环3,用户空间的执行运行在这里
最内存环0:也叫特权环,所有特权指令,cpu中敏感寄存器,尤其是硬件管控寄存机需要由环0中指令才能执行,也就是内和空间在环0
环1与环2 (但是在x86平台上有些敏感指令也运行在这些环上运行)
运行在环3上的guest内核如何调用硬件?
guest的cpu实现方式:
3、软件模拟,创建一个进程或者一个线程模拟的cpu,让guest使用
X86虚拟化面临的常出的问题: 1、特却集压缩:某些敏感指令,放在环1,环2上, 内核运行在环0上,但是兼顾环1,环2,如果运用虚拟化,guestOS需要运行在环1,环2上。从而可以直接运行敏感指令,所以这些指令需要自行捕获,
才会避免guestOS避免执行这些指令。 2、特却集别名:guestOS操作系统实际运行在环1,环2上,但guestOS认为自己运行在环0,所以我们需要将环1,环2将其虚拟为环0.因此我们需要将其起名为环0 3、非特权敏感指令:x86平台上有些敏感指令运行在环1,环2上。
4、地址空间压缩:每一个虚拟机所得到的内存地址空间中必须保留一部分给vmm(虚拟机监控器,比如关闭虚拟机之类的命令)使用。说明有些vmm直接运行在GuestOS当中的。HOST主机中。vmm会进入虚
拟化和退出虚拟化。所以guestOS使用的内存需要给vmm保留一部分,实际使用要比看上去少,使用的地址被压缩了。 5、静默特权失败:X86的某些特却指令在执行失败后不会返回错误的。所以vmm不能捕获这些错误。我们就不知道各个虚拟机实例运行的状态。 6、屏蔽虚拟化:在虚拟化场景中,屏蔽中断,和非屏蔽中断,guestOS对于特权资源的每次访问都会触发处理器异常,(中断发生,处理器必须要要处理)都需要在中断时异常需要由vmm处理,
然后再把结果送个guest中。来回切换导致性能降低。
4、CPU实现虚拟化方式:
1、完全虚拟化
BT技术提升虚拟化性能 二进制翻译
硬件层 ---> 环0(vmm) ----> 环1 (guestos 内核)----> 环2 空闲 ---->环3(应用程序)
guestOS与vmm之间使用的二进制翻译
这个平台为完全虚拟化,guestOS不知道自己是虚拟化。这种虚拟化需要给每个guestOS虚拟机模拟一个环0,所以性能确实很厉害
2、 半虚拟化:
硬件层 ---> 环0(vmm 与 guestos 内核)) ----> 环1 、 环2 空闲 ---->环3(应用程序)
guestOS不会直接调用环0,特权指令需要使用VMM,这时guestOS知道自己是虚拟化。(hypercall调用请求)
guestOS的内核被修改了。知道自己是虚拟化。windows不能运行在半虚拟化环境,因为不能修改close的操作系统
3、硬件虚拟化 hvm
cpu虚拟化
硬件层 --->环 -1 (vmm )-----> 环0( guestos 内核) ----> 环1 、 环2 空闲 ---->环3(应用程序)
guestos内核直接安装在环0上,不用做修改,cpu设计时直接支持虚拟化,但是环0上没有特权指令上,只能捕获操作特权指令,然后交给环-1上的vmm来执行。
但是由于还是需要环-1 环0 来回切换,还是性能比半虚拟化要差一些
5、内存虚拟化:
正常的内存使用就是被虚拟化的。
指令和数据都是由内存中获取的。内存本身就是由物理地址转换成线性地址,(MMU来处理的)
MMU 工作原理:
线性空间转换成物理空间的关系存在页表当中的。 (page table)
每个进程给cpu发送指令时,cpu要将 page table 及时的加载到mmu,然后通过mmu va ---> pa的转换
虚拟化后的内存虚拟化:
GVA ---> GPA ---> HPA
guestOS线性地址空间 -----> guestOS的物理地址空间 -----> HostOS的物理地址空间
当guestOS中用户空间访问内存中数据,直接发送给HostOS cpu,此时由VMM捕获到,HCPU通过MMU找到对应的物理内存地址后会把地址结果给到VMM,VMM在通知guestOS
GPA的位置,然后guestOS到gpa中查找。
后来inter X86 硬件支持(影子mmu),有2个MMU,每次访问内存地址会同时发给这两个mmu,如果是虚拟机访问的就直接返回给虚拟机HPA的地址,跳过了中间的GPA的转换过程。
tlb技术:保存了va--->pa的对应关系 ,加快MMU的转换速度,但是如果多个guestOS时,为了不混淆多个虚拟机的地址对应关系,所以需要都清除tlb
后来又有了tagtlb ,这样在tlb中增加了标记,标记着是那台虚拟机的映射。
6、io虚拟化
本身就很慢,在虚拟化后更慢
IO虚拟化实现的方式借鉴于VMM模型
type-1、type-2
type1:
虚拟机直接跑在硬件上,有一个实例是特权实例(dome0),管理其他的虚拟机
=======>
,
io完全虚拟化 : guestOS调用dome0的虚拟硬盘接口,dome0然后再真正调用物理IO设备的接口,进行二次驱动,这种模拟IO性能比较差
io半虚拟化,前段分为两半,一般在domeU中,后端在dome0上,前段简单封装送给后端,后端做访问真正IO设备,进行IO设备的调用。
io由dome0自己调用。hv自己不会有过多的硬件驱动。所以要借助dome0 io 等各种驱动。
hypervisor自我实现驱动硬件,各个硬件厂商需要单独开发给hv提供驱动,但是厂商不会专门给某个hv提供驱动的,所以hv需要自己开发驱动程序。但是硬件设备太多,自己开发硬件驱代价太大,
所以这种的虚拟化技术对于硬件的兼容性太差。 买服务器需要找好型号。
io虚拟化,是使用文件来模拟io设备。 dome0软件模拟硬件真实的借口。
type-2: 虚拟机跑在操作系统上
vmm不用自己提供任何驱动,只需要模拟各硬件,真正设备的驱动又host来提供
梳理:
各vmm对io的驱动有三种模式:
类型1:半虚拟化,自主vmm:vmm自行提供驱动
混合vmm:借助于外在OS提供驱动。XEN、VM
1、依赖于外部OS提供特权域
2、自我提供特权提供特权域
类型2: 寄宿方式,有宿主机的VMM
IO虚拟化模型:
纯模拟,完全虚拟化
半虚拟化
透传:无论是半虚拟化还是模拟都需要借助dome0来实现IO虚拟化的,透传则是由guest直接使用硬件。dome0管理各硬件
另一种技术:
SR-IOV:将一个硬件轮流给多个guestOS使用。
完全虚拟化:vm(类型2) vb kvm, vm-exsi(类型1)
半虚拟化:xen (类型1)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步