首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完全模拟与完全虚拟化

完全模拟与完全虚拟化
EN

Stack Overflow用户
提问于 2011-05-18 20:53:51
回答 8查看 15.6K关注 0票数 41

在全仿真中,I/O设备、CPU、主存被虚拟化。客户操作系统将访问虚拟设备,而不是物理设备。但是,什么是完全虚拟化呢?它是与完全仿真相同,还是完全不同?

EN

回答 8

Stack Overflow用户

发布于 2011-05-18 21:07:16

仿真和虚拟化是相关的,但不是一回事。

仿真是使用软件来提供不同的执行环境或体系结构。例如,您可能有一个在Windows计算机上运行的Android模拟器。Windows机器的处理器与Android设备不同,因此仿真器实际上是通过软件执行Android应用程序的。

虚拟化更多的是在同一物理环境中运行的多个虚拟环境之间创建虚拟屏障。最大的区别是虚拟化环境是相同的体系结构。虚拟化应用可以提供虚拟化的设备,然后这些设备被转换成物理设备,并且虚拟化主机可以控制哪个虚拟机可以访问每个设备或设备的一部分。但是,实际的执行通常仍然是本机执行的,而不是通过软件执行的。因此,虚拟化性能通常比仿真要好得多。

还有一个单独的虚拟机概念,比如那些运行Java、.NET或Flash代码的虚拟机。它们可以根据不同的实现而有所不同,并且可能包括仿真和/或虚拟化的各个方面。例如,JVM提供了一种执行Java字节码的机制。然而,JVM规范并没有规定字节码必须由软件执行,或者必须将它们编译成本机代码。每个JVM都可以做它自己的事情,事实上,大多数JVM都在适当的地方使用仿真和在适当的地方使用JIT (我认为这就是Sun/Oracle的JVM所称的Hotspot JIT )。

票数 42
EN

Stack Overflow用户

发布于 2011-05-18 20:58:13

在全仿真中,I/O设备、CPU、主存被虚拟化。

不,它们是在软件中模拟的。仿真意味着它们的行为在软件中完全复制。

但是,什么是完全虚拟化呢?

使用虚拟化,您可以尝试在硬件上运行尽可能多的代码,以加快该过程。对于必须在中运行的代码,这是一个特别的问题

内核模式

,因为这可能会改变主机的全局状态(机器

虚拟机管理程序或VMM

正在运行),从而影响其他虚拟机。

票数 7
EN

Stack Overflow用户

发布于 2019-10-30 00:20:36

Hypervisor是supervisor的监督者,也就是说,它是控制内核的内核。

类型1 vs类型2 vs混合虚拟机管理程序

类型1虚拟机管理程序是专为运行虚拟机而设计的操作系统。它直接安装在磁盘上,以便像任何操作系统一样从引导扇区执行;它是专门为管理和运行虚拟机而构建的操作系统,这就是您可以在其上执行的所有操作(就像操作系统一样,它可以是单片的,也可以是微内核化的)。它上安装的所有操作系统都是以来宾身份运行的。

类型2管理程序是在OS之上运行的管理程序,该OS被设计为运行应用程序(完全仿真),或者通过使用驱动程序修改内核来给予OS运行VM的功能(虚拟化),该OS在主机OS之下/与主机OS一起不可见地安装其自身,并且主机OS继续运行(在软件虚拟化的情况下在环0中,在支持硬件虚拟化的情况下在非VMX模式环0中),并且在其下方挂钩的管理程序以VMX非根模式(在硬件虚拟化的情况下)或环1(在软件虚拟化的情况下)来管理访客,同时在适当的地方传递到主机OS并且调用和使用主机OS及其驱动程序来访问硬件(这就是为什么它经常被描绘为在主机OS之上)。主机操作系统上的图形用户界面程序与驱动程序通信,并且每个VM和每个vCPU都有一个子进程。

混合虚拟机管理程序是专为运行应用程序和虚拟机而设计的操作系统。它可以在常规主机操作系统模式下运行,但它具有虚拟机管理程序模式,在引导进入时,该模式将主机操作系统作为虚拟机管理程序顶部的来宾操作系统加载,并可以加载其他来宾操作系统。虚拟机管理程序通常是微内核化的虚拟机管理程序,这意味着硬件驱动程序在主机操作系统(称为父分区)而不是虚拟机管理程序(在Hyper-V上,Integration Services组件驱动程序可以安装在其他来宾操作系统上,以便通过主机操作系统设置的VMBUS系统与主机操作系统驱动程序通信)中实施。主机操作系统使用VMCS在VMX非根模式下运行。从理论上讲,您可以获得半虚拟化的混合虚拟机管理程序,但KVM和Hyper-V仅支持硬件虚拟化,此外,您也可以拥有单一的混合虚拟机管理程序,但意义不大,而且由于主机操作系统的存在,它只需要微核化。混合虚拟机管理程序本质上是一种类型1虚拟机管理程序,可以分别引导到类型1虚拟机管理程序模式和主机操作系统模式。微内核化的虚拟机管理程序通常是混合的,因为使用的主机操作系统是已经安装的操作系统(并且微内核化的虚拟机管理程序功能已经是其中的一部分--它可以作为功能安装在windows服务器上)

完全模拟的第二类虚拟机管理程序

全仿真器将目标ISA的所有寄存器仿真为变量,CPU被完全仿真。这可能是因为想要模拟其ISA与主机不同的客户机(或者实际上,如果您运行x86仿真器,例如Bochs,并且您碰巧在x86系统上运行它,那么它可能是相同的;这并不重要。正如Peter所说,仿真器不需要特权访问(环0驱动程序助手),因为所有解释和仿真都是在进程本地完成的,并且进程调用常规的主机I/O函数。这之所以有效,是因为没有任何代码需要在本地运行。如果你想让它在本地运行,你必须通过一个驱动程序把这个功能带到环0)。完全仿真是对所有东西的仿真: CPU、芯片组、BIOS、设备、中断、页面漫游硬件、TLB。仿真器进程在环3中运行,但这对访客是不可见的,它看到了将由解释器监视的仿真/虚拟环(0和3),并将通过基于其正在解释的指令将值分配给违反的寄存器变量来模拟中断,模拟CPU在每个阶段但在软件中所做的事情。仿真器从地址读取指令,对其进行分析,每次出现寄存器(例如EDX)时,它将读取EDX变量(仿真的EDX )。它模仿CPU的操作,这很慢,因为对于通常由CPU透明地处理的单个操作,存在多个操作。如果客户尝试访问虚拟地址,则动态重编译器采用该客户虚拟地址并使用vCR3遍历客户页表(模仿tlb未命中页面步行器),然后它使用仿真器进程页表直接从vCR3+guest虚拟地址部分产生的每个物理地址读取,因为它不能控制其cr3,因为它是进程,并且就主机OS而言,物理地址只是进程中的虚拟地址(客户物理通过添加偏移量映射到主机虚拟,然后充当主机虚拟地址,因此隐式P2M如果动态重编译器在使用vCR3遍历来宾PTE时检测到来宾PTE上的无效位,那么它会模拟来宾的页面错误,将地址放入vCR2。

软件虚拟化第2类虚拟机管理程序

完全虚拟化是一种类型1虚拟机管理程序方案,实际上可以在类型2虚拟机管理程序上使用,并且是前者的性能提升,并且只能在来宾ISA与主机ISA相同的情况下使用。无法在x86上实现完全虚拟化,因为:

在x86架构中Ring1的实现中有一些从未修复过的缺陷。某些应该被困在环1中的指令不会。例如,这会影响LGDT/SGDT、LIDT/SIDT或POPF/PUSHF指令对。虽然“加载”操作是有特权的,因此可以被捕获,但是“存储”指令总是成功的。如果允许来宾执行这些操作,它将看到CPU的真实状态,而不是虚拟化状态。CPUID指令也有同样的问题。

实际上,这也适用于环3。这不仅仅是环1的小故障。SGDT等不是特权指令,但允许VM执行它与Popek和Goldberg的要求相矛盾,因为VM可以读取CPU的真实状态,并获得真实GDT的地址,而不是虚拟GDT的地址。在UMIP之前,软件完全虚拟化在x86上是不可能的,在英特尔VT之前,x86 CPU本身并不符合Popek和Goldberg的要求,所以必须使用半虚拟化。准虚拟化仍然不符合Popek和Goldberg (因为只有内核模式代码是打补丁的,所以可以使用SGDT),但至少它可以工作,而完全虚拟化根本不起作用,因为SGDT将在来宾内核模式下读取伪值(宿主SGDT ),这意味着如果不打补丁,使用SGDT的来宾内核代码将无法按预期工作。SGDT在用户模式下可用,至少不会影响主机操作系统,而LGDT肯定会。

VirtualBox使用环1完全虚拟化,但对有问题的指令进行半虚拟化,尽管它们在环1中,但它们的行为就像在环0中执行一样,并且需要环0驱动程序的帮助;该驱动程序充当系统管理程序。令人惊讶的是,关于Type2虚拟机管理程序是如何实现的信息非常少。下面是我对这个问题的最佳猜测--在给定硬件和主机OS操作的情况下,我将如何实现类型2虚拟机管理程序。

在Windows上,我可以想象当驱动程序启动时,它将初始化符号链接,并等待用户模式virtualbox软件使用以下命令发出IOCTL

若要启动虚拟机实例,请执行以下操作。处理程序将执行以下过程:驱动程序将处理程序注入到IDT中,用于一般保护故障。它可以通过在周围放置一个包装器来做到这一点

通过替换

在带有包装器的IDT中。在windows上,它可以将包装器注入所有IDT条目,包括条目错误检查条目,但这意味着要挂钩到IDT写入例程中以获得新的中断。它可能要做的就是读取IDTR中的虚拟地址并对该区域进行写保护,然后主机对IDT的更新将捕获到虚拟机管理程序GPF包装器中,该包装器将在写入的IDT条目处安装包装器。

然而,64位windows主机上的64位windows来宾需要能够拥有自己的内核空间,但问题是,它将与主机内核结构位于完全相同的位置。因此,驱动程序需要擦除virtualbox进程的整个内核视图。这不能在来宾中映射,也不能对来宾可见。它通过从virtualbox进程的cr3页面中删除条目来实现这一点。virtualbox进程和其他主机进程使用的GDT和IDT需要相同,但为了避免保留来宾虚拟地址,当来宾写入IDTR时,虚拟机管理程序可以将其用作实际的iDTR值,但在SPT中将其虚拟映射到主机使用的相同物理4KiB IDT帧。这意味着在来宾线程和宿主线程之间切换时,系统管理程序驱动程序需要更改IDTR。因为映射IDT的来宾虚拟页面是写保护的,所以如果cr3是其来宾进程之一,那么来宾对此范围的任何写入都将由虚拟机管理程序记录在它构建的来宾IDT中。问题在于,当处理ISR时,它将跳转到未映射到进程的虚拟机管理程序RIP,因为驱动程序位于主机内核中;因此,此包装器的RIP需要映射到SPT。这意味着您无法在guest中保留虚拟内存,因此,您可能可以保留主机用于其IDT的4KiB地址范围,并静默地将guest访问重定向到不同的主机物理页面,然后不必更改任务交换机上的IDTR。为主机IDT中的处理程序保留的所有内存也必须以静默方式重定向到不同的主机物理页面(因为它们将是管理程序页面,所以它们无论如何都会出错,而管理程序只是

重定向读取和写入

到不同的主机物理页面,这不会在中断后发生,因为它将在环0中,所以IDT中的跳转将在映射到它的实际主机物理页面中,因为它不GPF,所以虚拟机管理程序不能重定向),所以来宾操作系统不知道该区域是保留的。每个IDT条目将有一个不同的包装器,它将调用一个主处理程序,该处理程序也需要映射并传递一个IDT条目代码。处理程序将传递寄存器中的cr3,将cr3更改为映射主机内核的虚拟进程,然后它将调用主处理程序。处理程序检查cr3,如果它是来宾、影子cr3或主机cr3,则执行适当的操作。

驱动程序还必须以同样的方式将自身注入到时钟中断中--如果时钟中断被触发,则客户状态或主机状态(包括当前cr3)被推入,系统管理程序处理程序将客户IDT时钟中断的地址推送到它管理的所有vCPU线程的内核堆栈中(模拟CPU将执行的操作),如果没有新的陷阱帧的话,然后在将cr3更改为映射主机内核的CPU之后调用原始主机处理程序。这将确保每次在主机上调度来宾时在来宾中进行上下文切换,因此来宾时钟间隔将大致与主机时钟间隔相匹配。

完全虚拟化将被称为“陷阱和仿真”,但它不是完全仿真,因为所有的环3代码实际上都在主机CPU上运行(与完全仿真相反,在完全仿真中,运行的代码是读取行的解释器)。此外,TLB和页面遍历硬件实际上是直接使用的,而在仿真器上,如果在软件中的仿真TLB阵列中不存在,则每次存储器访问都需要软件遍历。只有特权指令和寄存器、中断、设备和BIOS

仿真

对于来宾--部分仿真--仿真仍然会发生,但当任意数量的代码在本地运行时,它就会被称为虚拟化(完全、部分或硬件辅助)。

当来宾操作系统陷入来宾操作系统时,它将使用int0x2e或syscall。显然,虚拟机管理程序在0x2e处为INT注入了一个包装器,它将在

对于sysenter或

用于系统调用的MSR。MSR中的处理程序需要映射到SPT中,并将检查cr3是否是某个来宾进程的影子,如果不是,则不需要更改cr3,因为当前将包含主机内核并跳转到主机处理程序。如果它是来宾进程的cr3,它将cr3更改为伪进程(可能是专门用于映射主机内核的IO任务的virtualbox主机进程),并跳转到主处理程序,将它在来宾IDT中构建的RIP传递给重编译器/补丁程序,重编译器/补丁程序遍历

半虚拟化

某些不能保证会陷入陷阱的指令,将它们永久替换为跳转到虚拟机管理程序内存,在那里它放置更好的代码(这将导致保护错误,因为它们在SPT中为环0),直到它到达IRET或they等,然后它将cr3更改回客户的,并在将堆栈上的环1特权放到它已经构建的来宾IDT中的RIP之后执行IRET,然后执行实际的来宾ISR。当由于执行环1中的环0指令而发生陷阱或发生插入的半虚拟化陷阱时,在一般保护故障条目/管理程序处注入的ISR将确保cr3属于访客进程,并且它将声明并处理该问题,如果不是,则不需要将cr3更改为包括主机内核的at,以便将控制传递给主机处理程序,因为它将处于非访客进程的上下文中。可能发生这种情况的一个实例是来宾写入cr3以进行来宾上下文切换。需要模拟这一点,因为来宾操作系统不能执行此指令并修改cr3,因为它会更改主机操作系统上主机进程的cr3;虚拟机管理程序需要接收写入并写入新的影子cr3,而不是来宾操作系统想要的cr3。当访客读取cr3时,此机制会阻止访客读取实际的cr3,并且系统管理程序会将访客插入的cr3 (而不是影子cr3)的值插入到请求的寄存器中,将下一个指令地址插入到堆栈中,并使用iret恢复执行它所在的环。

来宾I/O将针对映射到虚拟机管理程序中定义的模拟设备的虚拟缓冲区和寄存器的来宾物理地址空间。这些仿真寄存器(例如,门铃寄存器)将以与设备对硬件寄存器的改变作出反应的完全相同的方式在主机上下文中以规则的间隔(例如,时钟中断挂钩)被检查,并且处理程序将决定是否需要仿真中断(基于由仿真配置空间中的客户分配的MSI向量,将中断推入表示要中断的所选vCPU的线程的内核堆栈),或者,由于仿真寄存器写入,需要使用本机windows API函数构造到来宾指定缓冲区的I/O操作(转换GVA->HPA并允许实际硬件写入来宾缓冲区将使用的物理页)。

至于在半虚拟化的64位Type2虚拟机管理程序上进行分页,这是一个棘手的问题。硬件使用影子页表(SPT),它是GVA到HPA的映射。我最好的猜测是,对于每个GP故障(执行环1中的环0指令),系统管理程序驱动程序会从virtualbox进程的锁定页中选择一个影子cr3页,因为它看到一个新的来宾分配的cr3地址正在写入cr3。它将此来宾选择的地址与虚拟机管理程序选择的影子cr3页面的地址配对,并将virtualbox进程cr3更改为影子cr3的地址,而不是尝试写入的来宾cr3。The The The

影子cr3

页面(您将看到写有

无处不在

客户页表是写保护的,但它只是必须是错误的,因为它是在中央处理器上运行的影子页表,因此是唯一可能导致保护错误的;影子cr3被使用,而不是客户cr3)是由内核驱动程序写保护的(这是通过递归PML4条目中的读/写位来完成的)。访客尝试使用的特定GPA的cr3页面将由管理程序转换为与其关联的HPA,并且cr3页面中的条目将被复制到影子cr3,并且PML4Es中的GPA地址将使用P2M表转换为HPA。每次来宾通过虚拟地址将其写入来宾cr3页面时,该虚拟地址将始终是影子cr3页面,而不是来宾cr3页面,并且由于写保护位并且处于环1中,它将发生故障。然后,在一般保护故障处注入的处理程序将看到其来宾进程之一的影子cr3,并且它将在相同位置(其实际发生故障的位置)的SPT中执行在来宾PTE中概念上尝试的写入,并且它插入主机物理地址而不是它所插入的来宾物理地址我认为在启动VM时P2M已经填满了,因为VirtualBox进程使用

以锁定用于虚拟机的指定量的RAM )(管理程序可以维护用于P2M的虚拟TLB(访客帧到主机帧映射)和访客页面表(访客虚拟页到访客帧映射),其可以在执行软件页面遍历之前进行检查,而硬件维护用于SPT的TLB)。则系统管理程序将检查虚拟TLB以快速将GPA转换为CR2;如果不存在,它将跟踪客户页表(通过经由其cr3访问客户TLB(使用P2M转换GPA->HPA,然后使用内核函数转换HPA->HVA )),并按照客户所希望的利用所尝试的客户GPA写入条目。当发生页面错误时,处理程序检查影子cr3是它的访客进程之一,并检查cr3 (使用Windows内核函数获得与出错cr3相关联的条目的虚拟地址,就好像它是常规进程一样),然后使用与当前->相关联的访客cr3遍历访客页表,解析出故障的SPT虚拟地址(转换GPA -> HPA -> HVA)。如果影子PTE无效,则它是影子页面错误。如果访客PTE也是无效的,则它使用访客IDT的页面故障条目中的地址的RIP来模拟中断,将其推送到堆栈上;在执行此操作之前,它会如前所述在重编译器中修补代码(当访客在中断期间从其页表中读取时,它实际上将读取SPT,因此需要用管理器位来读取SPT,以便它可以被拦截,并且可以从出错存储器访问中的地址读取访客页面表条目)。对于发生的任何其他中断,即主机设备,它不是针对客户的,因此,如果处理程序发现当前cr3属于它的客户之一的进程,它将把cr3改变为包含主机内核映射的伪进程,并调用原始的

对于主机处理程序,在主机处理程序完成后,它将替换cr3。

硬件辅助类型2虚拟机管理程序

硬件辅助类型2在性能上更上一层楼,使情况变得不那么复杂,并将其统一到单个界面中,并自动执行许多需要即兴完成的临时cr3杂耍和管理任务,使其更加简洁。内核驱动程序只需要执行vmxon,等待客户向驱动程序注册,然后所有VM退出事件将由RIP处的统一处理程序来处理,并将其插入到VMCS主机状态中(这意味着处理程序存根不需要被映射到客户内核虚拟地址空间中)。它是专门为此设计的,不同于环1,这意味着不需要重新编译器(代码扫描和分析管理器(CSAM)和补丁管理器(PATM))。它还具有TSC缩放和TSC偏移量等字段,这些字段可供采用TSC的来宾使用,以实现更公平的调度。系统管理程序仍然挂起时钟中断以执行I/O更新,并且如果当前执行的线程是用于其vCPU之一的线程的地址,则它将需要vxmoff (这将导致VM退出)并将某个重新初始化序列的地址推入主机内核存储器中,该主机内核存储器将VMxx1和VMCS恢复绑定到vCPU的VMCS,其中客户保存的状态在其中(但是具有准备好执行的仿真时钟中断,其代码将使用RDTSC,该RDTSC将退出VM并且VMCS中的偏移量即从中减去主机时间以使主机不可见)。它不需要更改cr3,因为vmxoff会自动更改,所以现在它可以将其传递给主机处理程序,以便为主机操作系统执行时钟中断处理过程。

如果支持EPT,则来宾选择物理地址(cr3、IDTR等)并且页表以vmx非根模式在实际硬件上运行。GVA被转换为HPA :来宾CR3用于生成P2M的GPA,然后使用来宾的EPTP遍历整个EPT,最终获得PDPT的HPA,依此类推(这与使用来宾页表和HPA进行软件虚拟化的过程相同,不同之处在于页面遍历是在实际的页面遍历硬件上完成的,这会更快)。当存在页面错误时,不会发生vm退出,并且存在来宾选择的IDTR,因此使用来宾IDT将中断作为非根环0进行处理。来宾操作系统可以更新此映射,并且虚拟机管理程序不需要干预。当重新尝试访问时,EPT故障将导致VM退出,其中包含相当于cr2的EPTP和指向来宾虚拟机管理程序EPTP的指针。然后,它将其映射和VMRESUME更新为故障指令的RIP。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6044978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档