系统虚拟化:原理与实现
在硬件与操作系统之间的是硬件抽象层,在操作系统与应⽤程序或函数库之间的是API抽象层。硬件抽象层是计算机中软件所能控制的硬件抽象接⼝,通常包括CPU的各种寄存器,内存管理模块,I/O端⼝和内存映射的I/O地址等。API抽象层抽象的是⼀个进程所能控制的系统功能集合,包括穿件新进程,内存申请和归还,进程间同步与共享,⽂件系统和⽹络操作等。
系统虚拟化是指将⼀台物理计算机系统虚拟化为⼀台或多台虚拟计算机系统。每个虚拟计算机系统(简称虚拟机)都拥有⾃⼰的虚拟硬件(如CPU,内存和设备等),来提供⼀个独⽴的虚拟机执⾏环境。通过虚拟化层的模拟,虚拟机中的操作系统认为⾃⼰仍然是独占⼀个系统在运⾏。每个虚拟机中的操作系统可以完全不同,并且他们的执⾏环境是完全独⽴的。这个虚拟化层被称为虚拟机监控器(Virtual Machine Monitor,VMM)
虚拟机监视器(VMM)是⼀个系统软件,可以维护多个⾼效的、隔离的程序环境,该环境⽀持⽤户直接去访问真实硬件,⽽这样的程序环境就称为虚拟机。
从本质上,虚拟计算机系统和物理计算机系统可以是两个完全不同的ISA系统。但是,不同的ISA使得虚拟机的每⼀条指令都需要在物理机上模拟执⾏,从⽽造成性能下降。相同体系结构的系统虚拟化通常会有⽐较好的性能,VMM实现起来也会⽐较简单
云计算的⼀个核⼼思想就是在服务器端提供集中的计算资源,同时这些计算资源要独⽴地服务于不同的⽤户,也就是在共享的同时,为每个⽤户提供隔离、安全、可信的⼯作环境。虚拟化技术奖是云计算的⼀个基础架构。通俗地说,云计算实际是⼀个虚拟化的计算资源池,⽤来容纳各种不同的⼯作模式,这些模式可以快速部署到物理设备上。虚拟化的资源按照来⾃⽤户的需求多少动态调⽤资源,每个⽤户都有⼀个独⽴的计算执⾏环境。
在没有虚拟化的环境中,操作系统直接负责物理处理器管理,负责进程间调度和切换。但是,VMM接管物理处理器后,客户机操作系统没有管理物理处理器的权利,可以说此时它已经运⾏在VMM为之涉及的虚拟处理器上,管理虚拟处理器,并在虚拟处理器上负责该虚拟机内进程间调度和切换。
虚拟处理器的功能可以由物理处理器和VMM共同完成。对于⾮敏感指令,物理处理器直接解码处理请求,并将相关效果反应到物理寄存器上;⽽对于敏感指令,VMM负责陷⼊再模拟(是不是可以理解为敏感指令保存在虚拟寄存器,⾮敏感指令保存在物理寄存器上?)
在没有虚拟化的环境⾥,对称多处理技术可以让操作系统拥有并控制多个物理处理器,它通过提供并发的计算资源和运算逻辑,允许上层操作系统同时调度多条基于不同计算⽬的的进程并发执⾏,从⽽有效提⾼系统的吞吐率和性能。同理,当物理计算资源⾜够多时,VMM可以考虑为虚拟机呈现出多个虚拟处理器,也就是客户对称多处理器虚拟化技术,也称SMP技术。
在没有虚拟化的情况下,操作系统在对内存的使⽤与管理上达成了两点认识:(1)内存都是从物理地址0开始的;(2)内存都是连续的,或者说⾄少在⼀些⼤的粒度(如256M)上连续。⽽对于虚拟环境中,由于物理地址为0的只有⼀个,⽆法同时满⾜所有客户机操作系统内存从0开始的要求。VMM要做的就是欺骗客户机操作系统,让谎⾔满⾜客户机操作系统对内存的两点要求,这种欺骗过程,就是内存虚拟化。
引⼊了客户机物理地址空间,内存虚拟化就主要处理以下两个⽅⾯的问题:(1)给定⼀个虚拟机,维护客户机物理地址到宿主机物理地址之间的映射关系(2)截获虚拟机对客户机物理地址的访问,并根据所记录的映射关系,将其转换成宿主机物理地址
完全虚拟化通过Binarary Trasnlation在⼆进制代码级别上来避免虚拟化漏洞,类虚拟化采⽤修改操作系统内核的代码(即API级),使得操作系统内核完全避免这些难以虚拟化的指令
由于硬件体系结构在虚拟化⽅⾯设计存在缺陷,导致了虚拟化漏洞,为了进⾏弥补,在硬件还未提供⾜够的⽀持之前,基于软件的虚拟化技术给出了两种可⾏的解决⽅案:模拟执⾏和直接源代码改写。模拟执⾏对应的就是基于软件的完全虚拟化技术,直接改写源代码对应的是类虚拟化技术
⾃伸缩内存调节技术:VMM通过诱导客户机操作系统来回收和分配客户机所拥有的宿主机物理内存技术。具有⽓球模块,申请客户机物理内存,但并不真正有效地使⽤它们,⽽是通知VMM这些客户机物
理内存对应的宿主机物理内存可以被回收。
页共享技术:在⼀台物理主机上运⾏多个客户机,VMM可以通过页共享技术节省宿主机物理内存资源
设备模型是位于虚拟机设备驱动程序与实际设备驱动程序之间的⼀个模块,由设备驱动所发出的I/O请求先通过设备模型模块转化为物理I/O 设备的请求,再通过调⽤物理设备驱动来完成相应的I/O操作。反过来,设备驱动将I/O操作结果通过设备模型模块,返回给客户机操作系统的虚拟设备驱动程序。
第⼆章 x86架构及操作系统概述
2.1-2.2
分段机制:由四个基本部分构成,逻辑地址,段选择寄存器,段描述符,段描述符表。
段选择符
Index:段描述符表的索引
TI:⽤于指明索引哪个段描述符。0为GDT,全局描述符表;1为LDT,本地描述符表
段描述符
描述某个段的基地址、长度和各种属性。当CPU通过⼀个逻辑地址的段选择符获得该段对应的段描述符后,会使⽤描述符中各种属性字段对访问进⾏检查,⼀旦访问被确认合法,CPU将段描述符中的32基地址和逻辑地址中的32位偏移量想加以获得该逻辑地址对应的线性地址。
段描述符表
x86架构提供两种段描述符,全局段描述符表(GDT)和本地段描述符表(LDT)。
为了加速对GDT和LDT的访问,x86提供了GDTR寄存器和LDTR寄存器,描述为:GDTR:包括⼀个32位的基地址(BASE)和⼀个16位长度(LIMIT),LDTR:结构同段寄存器(包括对程序不可见的段描述符寄存器)
分页机制让现代操作系统中的虚拟内存机制成为可能,⼀个页⾯可以存在于物理内存中,也可以存放在磁盘交换区域(如linux下的Swap分区,Windows下的虚拟内存⽂件),程序可以使⽤⽐机器物理内存更⼤的内存区域。操作系统在启动过程中,通过将CR0寄存器的PG位置1来启动分页机制
分页机制,⼀个4KB的页⾯使⽤两级页表
页⽬录项:包含页表的物理地址,CPU使⽤线性地址的22-31位索引页⽬录,获得线性地址对应的页⽬录项
页表项:包含该线性地址对应的PFN(物理页帧号),页表项存放在页表中,CPU使⽤线性地址12-21位索引页表,获得该线性地址对应的页表项
CPU在索引页⽬录前,必须知道页⽬录所在的物理地址,该物理地址存放在CR3寄存器,也称为页⽬录基地址寄存器(PDBR)
TLB:旁路转换缓冲区。为了提⾼地址转换的效率,x86架构使⽤TLB对最近⽤到的页⾯映射进⾏缓存,当CPU访问某个线性地址,其所在页⾯的映射存在于TLB中,⽆须查页表即可进⾏地址转换。当操作系统对页表进⾏修改后,要负责对TLB中对应的条⽬进⾏刷新,以保证缓存的⼀致性。刷新⽅式有:(1)更新CR3,TLB整体刷新(2)INVLPG指令,对TLB单独页⽬录项,页表项刷新
总结以上即为:CPU先访问TLB缓存,若有对应项,从TLB中得到物理地址,如果没有对应项,CPU在访问页表,如果在页表中有对应项,在页表中得到对应的物理地址,如果没有对应项,产⽣缺页中断,⽤调度算法从磁盘中获取页⾯
x86四种运⾏模式:实模式,保护模式,SMM模式和虚拟8086模式。
实模式:CPU加电经历最初混沌状态,⾸先进⼊实模式。操作系统或BIOS通常在该模式下准备必要的数据结构和初始化关键寄存器,然后切换进⼊保护模式
保护模式:操作性运⾏时最常⽤的模式,CPU所有功能⼏乎都能使⽤,可以访问架构允许的所有物理地址空间
操作系统对中断/异常的处理流程
⼀个中断/异常发⽣,打断当前正在执⾏的任务
(1)CPU通过vector索引IDT表得到对应的门,并获得其处理函数的⼊⼝地址
(2)程序跳转到处理函数执⾏,由于处理函数存放在CPL=0的代码段,程序可能会发⽣权限提升,处理函数通常执⾏下列⼏个步骤
i 保存被打断任务的上下⽂,并开始执⾏处理函数;
ii 如果是中断,处理完成后需要写EOI寄存器(伪中断不需要)应答,异常不需要
iii 恢复被打断的任务上下⽂,准备返回
(3)从中断/异常的处理函数返回,恢复被打断的任务,使其继续执⾏
进程:尽管表⾯上看起来程序和进程⾮常类似,但本质上他们是截然不同的。程序是指⼀个静态的指
令序列,⽽进程则是⼀个容器,其中包含了当执⾏⼀个程序的特定实例时所⽤到的各种资源
上下⽂切换是指程序从⼀种状态切换到另⼀种状态,或从⼀个程序切换到另⼀个程序(例如进程切换)时,导致上下⽂相关寄存器值的变化⾏为,这种变化是指就程序上下⽂相关寄存器的值被保存到内存中,新程序上下⽂寄存器的值被加载到寄存器中。通常只有三种情况:⽤户态到内核态的切换;进程切换;到中断上下⽂的切换
中断的处理函数运⾏在特殊的上下⽂环境,称为中断上下⽂
设备通过寄存器和设备RAM将⾃⾝的功能展现给CPU,CPU读写这些寄存器和RAM即可完成对设备的访问和操作。
DMA(直接内存访问)是将CPU从I/O操作中解放,通过DMA,驱动程序可以事先设定⼀个内存地址,设备就可以绕开CPU直接向内存中复制或读取数据。DMA可以分为两种:(1)同步DMA:是指DMA操作由软件发起(2)异步DMA:是指DMA操作由设备发起
第三章虚拟化概述
传统的虚拟化技术⼀般是通过陷⼊再模拟的⽅式实现的,⽽这种⽅式依赖于处理器的⽀持,也就是说,处理器本⾝是否是⼀个可虚拟化的体系结构。VMM对物理资源的虚拟可以归结为三个主要任务:
处理器虚拟化,内存虚拟化和I/O虚拟化
linux内核设计与实现 pdf虚拟环境由三个部分组成:硬件,VMM和虚拟机。在没有虚拟化的情况下,操作系统直接运⾏在硬件之上,管理底层的物理硬件,这就构成了⼀个完整的计算机系统,也就是所谓的“物理机”。在虚拟环境⾥,虚拟机监控器VMM抢占了操作系统的位置,变成了真是物理硬件的管理者,同时向上层的软件呈现出虚拟的硬件平台,⽽此时操作系统运⾏在虚拟平台上,仍然管理着它认为是“物理硬件”的虚拟硬件。
特权指令:系统中有⼀些操作和管理关键系统资源的指令,这些指令只有在最⾼特权级上才能正确运⾏。
敏感指令:操作特权资源的指令,包括修改虚拟机的运⾏模式,读写时钟,中断等寄存器。主要是在虚拟化场景下,客户机OS内核的特权被解除,从原来的0降到1或者3,这部分特权指令在客户机OS中发⽣时,就会产⽣Trap,被VMM捕获,从⽽由VMM完成。虚拟化场景中敏感指令必须被VMM捕获并完成。对于⼀般 RISC 处理器,如 MIPS,PowerPC 以及 SPARC,敏感指令肯定是特权指令,但是x86 例外,但是x86绝⼤多数的敏感指令是特权指令,但是由部分敏感指令不是特权指令,执⾏这些指令的时候不会⾃动trap被VMM捕获
陷⼊再模拟:如果⼀个系统上所有敏感指令都是特权指令,则能够⽤⼀个简单的⽅法来实现⼀个虚拟
环境:将VMM运⾏在系统的最⾼特权级上,⽽将客户机操作系统运⾏在⾮最⾼特权级上,当客户机操作系统因执⾏敏感指令(此时,也就是特权指令)⽽陷⼊到VMM中,VMM 模拟执⾏引起⼀场的敏感指令,这种⽅法被称为“陷⼊再模拟”
虚拟化漏洞:判断⼀个结构是否可虚拟化,核⼼在于该结构对敏感指令的⽀持上,如果某些结构上所有敏感指令都是特权指令,则它是可虚拟化结构,否则如果它⽆法⽀持在所有的敏感指令上触发异常,则不是⼀个可虚拟化结构,称其存在虚拟化漏洞
当客户机操作系统试图访问关键资源时,该请求不会真正发⽣在物理寄存器上,相反,VMM会通过准确模拟物理处理器的⾏为,⽽将其访问定位到VMM为其设计与物理寄存器相应的“虚拟”寄存器上。例如:当处理器取指令MOV CR0,EAX后,发现特权级别不符合,则抛出异常,VMM截获这个异常之后模拟处理器的⾏为,读取EAX内容并存放到虚拟的CR0中,由于虚拟CR0存放在VMM为该虚拟机设计的内存区域⾥,因此该指令执⾏的结果不会让物理的CR0内容改变,等到下⼀次虚拟机试图读CR0时,处理器也会抛出异常,然后由VMM从虚拟的CR0⽽不是从物理的CR0中返回内容给虚拟机
对称多处理技术:可以让操作系统拥有并控制多个物理处理器,它提供并发的计算资源和运算逻辑。即有多个CPU可以并发执⾏。当物理计算资源⾜够多时,VMM也可以考虑为虚拟机呈现出多个虚拟处理器,也就是客户对称多处理器虚拟化技术,也称客户SMP技术。
在没有虚拟化的情况下,操作系统在内存的使⽤和管理上达成了两点认识:内存都是从物理地址0开始的;内存都是连续的,或者说⾄少在⼀些⼤的粒度(如256MB)上连续。
为了更有效的利⽤空闲的物理内存,尤其是系统长期运⾏后产⽣的碎⽚,VMM通常会以⽐较⼩的粒度(如4KB)进⾏分配,这就造成了给定⼀个虚拟机的物理内存实际上是不连续的问题,其具体位置完全取决于VMM的内存分配算法。
引⼊了客户机物理地址空间,内存虚拟化就主要处理两个⽅⾯的问题:给定⼀个虚拟机,维护客户机物理地址到宿主机物理地址之间的映射关系;截获虚拟机对客户机物理地址的访问,并根据所记录的映射关系,将其转换为宿主机物理地址。
客户机操作系统采⽤客户页表维护客户机虚拟地址到客户机物理地址的映射:GPA=f1(GVA),GVA为客户机虚拟地址,GPA为客户机物理地址。⽽VMM负责客户机物理地址到宿主机物理地址之间的映射:HPA=f2(GPA),HPA表⽰宿主机物理地址
I/O虚拟化:现实中外设资源是有限的,为了满⾜多个客户机操作系统对外设访问的需求,VMM必须通过I/O虚拟化的⽅式复⽤有限的外设资源,在⾯临这种问题时,VMM所要做的是模拟,即截获客户操作系统对设备的访问请求,然后通过软件的⽅式模拟真实物理设备的效果,仍然是欺骗客户机操作系统,这种模拟过程,就是I/O虚拟化。
设备发现就是要让VMM提供⼀种⽅式,来让客户机操作系统发现虚拟设备,这样客户操作系统才能加载有关的驱动程序,这是I/O虚拟化的第⼀步
VMM实现虚拟机间的通信机制,并向虚拟机提供相应的API。虚拟机的客户机操作系统通过调⽤这些API与其他虚拟机进⾏通信。VMM除了提供虚拟机之间通信的API外,也提供虚拟机与VMM之间交互的API
类虚拟化技术,其主要思想是通过客户机操作系统与虚拟化管理层的协同设计,由虚拟化管理层软件提供⼀个近似于原物理系统,但⼜不完全相同的虚拟平台,以表⾯虚拟化漏洞和实现更⾼的虚拟化效率。虚拟化技术需要修改操作系统的源代码来与下层的虚拟化管理层软件协同⼯作,从⽽避免体系结构上的缺陷
VMM按照虚拟平台分类,可分为:完全虚拟化和类虚拟化。前者是虚拟平台可以运⾏现有的操作系统,不需要对操作系统进⾏任何修改,后者是平台在现实中不存在,⽽是通过VMM重新定义,这样的虚拟平台需要对所运⾏的客户机操作系统进⾏或多或少的修改使之适应虚拟环境
类虚拟化:通过在源代码级别修改指令以回避虚拟化漏洞的⽅式来使VMM能够对物理资源实现虚拟化。对于x86⼀些难以虚拟化的指令,完全虚拟化通过在⼆进制代码级别(扫描客户机⼆进制代码,将难以虚拟化的指令转化为⽀持虚拟化的指令)上来避免虚拟化漏洞。类虚拟化采取修改操作系统内核
的代码(即API级),使得操作系统内核完全避免这些难以虚拟化的指令
VMM实现结构分类:(1)Hypervisor模型:优点:VMM同时具备物理资源的管理功能和虚拟化功能,因此,物理资源虚拟化的效率会更⾼。虚拟机的安全只依赖于VMM安全;缺点:VMM由于完全拥有物理资源,因此VMM需要进⾏物理资源的管理,包括设备驱动,⽽对于设备驱动开发的⼯作量很⼤,因此任务量较⼤。(2)宿主模型:物理资源由宿主机操作系统管理。宿主机操作系统是传统的操作系统,如windows,linux等,这些传统的操作系统并不是为虚拟化⽽设计的,因此本⾝不具备虚拟化功能,实际的虚拟化功能由VMM来提供。最⼤
的优点是可以充分利⽤现有操作系统的设备驱动程序,VMM⽆须为各类I/O设备重新实现驱动程序。但缺点在于,安全⽅⾯,由于VMM是宿主机操作系统内核的⼀部分,因此,如果宿主机操作系统内核是不安全的,VMM也是不安全的。(3)混合类型:上述两种模式的混合体。VMM依然在最底层,拥有所有的物理资源,但是VMM会主动让出⼤部分I/O设备控制权,交由⼀个运⾏在特权虚拟机中的特权操作系统控制
第四章基于软件的完全虚拟化
解释执⾏:在模拟技术中,最简单的模拟技术是解释执⾏,即取⼀条指令,模拟出这条指令执⾏的效果,再继续取下⼀条指令,由于⼀条⼀条取指令不会漏过每⼀条指令,在某种程度上即每条指令都陷
⼊了,所以解决了陷⼊再模拟的问题,进⽽避免了虚拟化漏洞。但虽然这种⽅法保证了所有指令执⾏受到VMM的监视控制,然后它对每条指令不区别对待,其最⼤的缺点就是性能太差。
扫描和修补:由于解释执⾏有很⼤的性能损失,加上虚拟机中模拟的CPU和物理CPU体系结构是相同的,这样⼤多数指令可以被映射到物理CPU上直接运⾏。扫描和修补技术即通过这样的⽅式,让⼤多数指令直接在物理CPU上运⾏,⽽把操作系统代码中的敏感指令替换为跳转指令或会陷⼊到VMM中去的指令,使其⼀旦运⾏到敏感指令处控制流就会进⼊VMM中,由VMM代为模拟执⾏。流程如下:(1)VMM会在虚拟机开始执⾏每段代码之前对其进⾏扫描,解析每⼀条指令,查到特权指令和敏感指令(2)补丁代码会在VMM中动态⽣成,通常每⼀个需要修补的指令会对应⼀块补丁代码(3)敏感指令被替换成⼀个外跳转,从虚拟机跳转到VMM的空间⾥,在VMM中执⾏动态⽣成的补丁代码(4)当补丁代码执⾏完后,执⾏流再跳转回虚拟机中的下⼀条代码继续执⾏
扫描与修补原理:⼤部分指令都能被物理CPU载⼊执⾏,但对于⼀些敏感指令将会被VMM替换为外跳转,其对应⼀块补丁代码,外跳转将会执⾏补丁代码,从⽽模拟指令的功能
⼆进制代码翻译
将客户机操作系统代码放置在缓存中,不会被物理机CPU直接执⾏
内存虚拟化的⽬的:提供虚拟机⼀个从零开始的连续的物理内存地址;各个虚拟机之间有效隔离,调度以及共享资源
VMM为每个虚拟机动态维护⼀个从客户机物理地址到宿主机物理地址的表,使得多个虚拟机之间相互隔离,可以各⾃拥有从零开始的物理内存地址。VMM截获对客户机物理地址的访问,将其访问为宿主机对应的物理地址。
影⼦页表就是⼀种对应的客户机虚拟机地址到宿主机物理地址的映射表
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论