完全仿真与完全虚拟化

时间:2011-05-18 12:53:51

标签: virtualization emulation

在完全仿真中,I / O设备,CPU,主存储器被虚拟化。客户操作系统将访问虚拟设备而不是物理设备。但究竟什么是完全虚拟化?是完全仿真还是完全不同的东西?

9 个答案:

答案 0 :(得分:28)

仿真和虚拟化是相关的,但并不相同。

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

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

还有一个单独的虚拟机概念,例如运行Java,.NET或Flash代码的虚拟机。它们可以在一个实现与下一个实现之间变化,并且可以包括仿真或虚拟化或两者的方面。例如,JVM提供了执行Java字节代码的机制。但是,JVM规范并未规定字节代码必须由软件执行,或者必须将它们编译为本机代码。每个JVM都可以做到这一点,实际上大多数JVM都在适当的情况下使用仿真并在适当的地方使用JIT(我认为Hotspot JIT就是Sun / Oracle的JVM所称的)。

答案 1 :(得分:4)

  

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

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

  

但究竟什么是完全虚拟化?

通过虚拟化,您可以尝试在硬件上运行尽可能多的代码来加速该过程。 这尤其是必须在kernel mode中运行的代码的问题,因为这可能会更改主机的全局状态(运行Hypervisor or VMM的机器),从而影响其他虚拟机。

答案 2 :(得分:1)

这是试图回答我自己的问题。

System Virtualization : Understanding IO virtualization and role of hypervisor

虚拟化

虚拟化作为一个概念,可以使多个/不同的应用程序在相同的底层硬件上共存,而不会彼此了解。

例如,Windows,Linux,Symbian等完整的操作系统及其应用程序可以在同一平台上共存。所有计算资源都是虚拟化的。

这意味着上述机器都无法访问物理资源。唯一可访问物理资源的实体是称为虚拟机监视器(又称Hypervisor)的程序。

现在这很重要。请仔细阅读并重新阅读。

虚拟机管理程序为上面的每台机器提供虚拟化环境。由于这些机器不是物理硬件而是访问虚拟化硬件,因此它们被称为虚拟机。

例如,Windows内核可能希望启动物理计时器(系统资源)。假设ther timer是内存映射IO。 Windows内核在Timer地址上发出一系列加载/存储指令。在非虚拟化环境中,这些加载/存储将导致计时器硬件的编程。

但是,在虚拟化环境中,这些基于Load / Store的物理资源访问将导致陷阱/故障。陷阱由管理程序处理。 Hypervisor知道windows尝试编程定时器。管理程序维护每个虚拟机的Timer数据结构。在这种情况下,管理程序会更新它为Windows创建的计时器数据结构。然后它编程实时计时器。计时器生成的任何中断都由管理程序首先处理。更新虚拟机的数据结构,并调用后者的中断服务例程。

简而言之,Windows完成了在非虚拟化环境中所做的一切。在这种情况下,其操作导致不更新真实系统资源,但虚拟资源(上面的数据结构)得到更新。

因此,所有虚拟机都认为他们正在访问底层硬件;实际上对他们来说不了解,所有对物理硬件的访问都是由管理程序调解的。

上述所有内容均为完整/经典虚拟化。大多数现代CPU都不适合经典虚拟化。陷阱/故障不适用于所有指令。因此,在现代设备上很容易绕过虚拟机管理程序。

这是半虚拟化产生的地方。虚拟机源代码中的敏感指令被调用Hypervisor取代。上面的加载/存储代码段可能会被调用替换为

Hypervisor_Service(Timer Start, Windows, 10ms); 

EMULATION

仿真是与虚拟化相关的主题。想象一下,最初为ARM编译的程序可以在ATMEL CPU上运行。 ATMEL CPU运行一个Emulator程序,该程序解释每个ARM指令并在ATMEL平台上模拟必要的操作。因此,模拟器提供了虚拟化环境。

在这种情况下,系统资源的虚拟化不是通过陷阱和执行模型来执行的。

答案 3 :(得分:1)

无论是仿真还是虚拟化,代码都直接在硬件上运行。它的指令由CPU本地执行,其I / O访问直接访问硬件。

虚拟化是指访客代码至少在某些时间本地运行,并且仅捕获在虚拟机外部运行的代码(例如hypervisor)以进行特权操作或I / O访问。

要处理这些陷阱(也就是VM退出),VM实际上可以模拟来宾正在尝试做什么。例如。 guest虚拟机可能正在运行简单网卡的设备驱动程序,但NIC完全由VM中的软件实现。如果VM使用传递将guest虚拟机的I / O访问发送到主机上的真实网卡,那将是该硬件的虚拟化。 (特别是如果它以允许多个访客同时使用它的方式进行,否则它实际上只是将其提供给一个访客,而不是虚拟化。)

虚拟化的硬件支持(like Intel's and AMD's separate x86 virtualization extensions)可以让访客执行通常会影响整个计算机的操作,例如修改页表中的内存映射。因此,不是触发VM退出并让VM弄清楚guest虚拟机正在做什么,然后从外部修改内容以实现结果,而是CPU内置了额外的转换层。(请参阅链接的wiki文章基于软件的虚拟化与硬件辅助虚拟化的更好但更长的描述。)

纯仿真意味着访客代码永远不会本机运行,也永远不会看到主机的“真实”硬件。 模拟器不需要对主机的特权访问。 (有些人可能希望特权访问主机以进行设备直通,或者使用原始网络套接字让客户看起来真的与主机连接到同一网络。)

在x86主机上运行的ARM仿真器始终必须以这种方式工作,因为主机硬件首先无法运行ARM指令。

但是,您仍然可以在x86主机上模拟x86来宾。客户端和主机架构匹配的事实并不意味着仿真器必须利用这一事实。

例如,BOCHS is an x86 PC emulator用便携式C ++编写。其主要用途之一是调试引导加载程序和操作系统。

BOCHS并不关心它是否在x86主机上运行。它只是一个C ++程序,它读取二进制文件(磁盘映像)并在窗口中绘制(客户视频内存的内容)。就主持人而言,它与JPG观众或游戏并无特别的不同。

一些模拟器使用二进制转换将JIT编译客户代码编译成主机代码,但这仍然是仿真,而不是虚拟化。请参阅http://wiki.osdev.org/Emulator_Comparison

BOCHS相对较慢,因为它直接读取和解码客户指令,而不进行二进制转换。但它试图尽可能有效地做到这一点。有关用于有效跟踪访客状态的一些技巧,请参阅How Bochs Works Under the Hood。由于仿真是在非x86硬件上运行x86软件的唯一选择,因此拥有高性能仿真器非常有用。 BOCHS有一些非常聪明且经验丰富的模拟器开发人员,尤其是Darek Mihocka,他有一些关于优化仿真的有趣文章on his site

答案 4 :(得分:1)

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

完全虚拟化是一种类型1的管理程序方案,实际上可以在类型2的管理程序上使用,并且在性能上比前者有所提高,并且只能在来宾ISA与主机ISA相同的情况下使用。这在VirtualBox上使用,并且需要ring 0驱动程序的帮助。驱动程序充当管理程序。令人惊讶的是,关于如何实现2类管理程序的信息很少。我不知道为什么在任何文章,帖子,答案,图表或论文中都没有解决主机操作系统和底层硬件的公理问题时应该出现的明显问题和难题,而这可能就是堆栈溢出时解决的第一个答案。似乎没有人知道如何在64位Windows主机上模拟64位Windows-他们只是没有解决问题。以下是我对此事的最佳猜测-在给定硬件和主机OS操作的情况下,如何实现类型2虚拟机管理程序。

在Windows上,我想象当驱动程序启动时,它将注册一个来宾软件中断的中断,以启动虚拟机,并且处理程序/ DPC将执行以下过程:驱动程序将处理程序注入到IDT为一般保护故障。它可以通过将包装中的KiInterruptDispatch替换为KiInterruptTemplate来包装SYSENTER_CS_MSR:SYSENTER_EIP_MSR来实现。在Windows上,它可以将包装器注入所有IDT条目,包括条目错误检查条目,但这意味着要为新的中断而挂接到IDT写入例程中。为此,可能要做的是读取IDTR中的虚拟地址并对该区域进行写保护,然后对IDT的主机更新将捕获到管理程序GPF包装器中,该包装器将在写入的IDT条目上安装包装器。

但是,在64位Windows主机上的64位Windows guest虚拟机需要能够拥有自己的内核空间,但是问题是,它将与主机内核结构位于完全相同的位置。因此,驱动程序需要擦除virtualbox进程的整个内核视图。这不能在访客中映射或可见。通过从virtualbox进程的cr3页中删除条目来完成此操作。 virtualbox进程使用的GDTR和IDTR必须是所有主机进程的GDTR和IDTR,并且由于该区域受写保护,因此,如果cr3属于该虚拟机,则虚拟机管理程序将在其构建的来宾IDT中记录对该范围的任何访问客人流程之一。这意味着主机IDT需要在写时复制,映射到与SPT中的主机相同的物理IDT页。问题在于,当处理完ISR后,由于驱动程序位于主机内核中,因此它将跳至未映射到进程中的管理程序RIP。因此,此包装的RIP需要映射到SPT中,并且每个IDT条目都有一个不同的包装,这将调用主处理程序,该主处理程序也需要进行映射并传递IDT条目代码。处理程序将在寄存器中传递cr3,将cr3更改为映射主机内核的虚拟进程,然后它将调用主处理程序。处理程序检查cr3,并检查它是访客影子cr3还是主机cr3,然后执行适当的操作。

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

完全虚拟化将被称为“捕获并仿真”,但这不是完全仿真,因为所有第3环代码实际上都在主机CPU上运行(与完全仿真相反,运行代码的解释器是获取行的解释器)阅读)。同样,TLB和页面遍历硬件实际上是直接使用的,而在仿真器上,如果在软件中的仿真TLB阵列中不存在,则每次内存访问都需要在软件中进行遍历。只有特权指令和寄存器,中断,设备和BIOS会被来宾仿真,部分仿真-仍然会进行仿真,但是当任何数量的代码在本地运行时,它都会被引用作为虚拟化(完整,参数或硬件辅助)。

当访客进入访客操作系统时,它将使用INT 0x2e或syscall。系统管理程序显然为INT注入了一个0x2e的包装器,它将为IA32_LSTAR插入sysenter的处理程序,或者为KiInterruptTemplate MSR插入syscall的处理程序。 MSR中的处理程序需要映射到SPT中,并将检查cr3是否是来宾进程之一的影子,如果不是,则不需要更改cr3,因为当前进程将包含主机内核并跳转到主机处理程序。如果它是来宾进程的cr3,它将cr3更改为虚拟进程(可能是专门用于映射主机内核的IO任务的virtualbox主机进程),并跳转到主处理程序,并在已建立的来宾IDT中传递RIP到达重新编译的程序/修补程序并执行paravirtualises某些无法保证陷阱的指令,将它们替换为跳转到虚拟机监控程序内存(这会导致保护错误,因为它们在SPT中环为0)直到到达IRET或sysexit等,然后将cr3更改回来宾的CR3,并在堆栈上将环1特权赋予已建立的来宾IDT中的RIP之后执行IRET,然后执行实际的来宾ISR。当由于在环1中执行环0指令而导致陷阱或插入的带有定制指令代码的准虚拟化陷阱发生时,在常规保护故障入口/准虚拟化ISR注入的ISR将确保cr3属于来宾进程,并且它将声明并处理该问题,如果不是这样,则无需将cr3更改为包括主机内核的主机,即可将控制权传递给主机处理程序,因为它将在非来宾进程的上下文中进行。一个可能发生这种情况的情况是,来宾为来宾上下文切换写入cr3。这需要被模拟,因为来宾必须不能执行该指令并修改cr3,因为它将改变主机OS上主机进程的cr3。系统管理程序需要接受写入并写入新的影子cr3,而不是客户想要的cr3。当guest虚拟机读取cr3时,此机制将阻止guest虚拟机读取实际的cr3,并且系统管理程序将guest虚拟机插入的cr3的值(不是影子1)插入请求的寄存器,将下一条指令地址插入堆栈,并使用念念不忘它所在的戒指。

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

对于类型2虚拟机管理程序的分页,这是一个棘手的问题。我最好的猜测是,系统管理程序驱动程序会为每个GP故障(在环1中执行环0指令)创建一个影子cr3页,该页面会看到一个新的来宾分配的cr3地址正在写入cr3。它将此来宾选择的地址与管理程序在非页面缓冲池上分配的管理程序选择的影子cr3页的地址配对,并将虚拟框进程cr3更改为影子cr3的虚拟机进程,而不是尝试写入的来宾客户机。 shadow cr3 页(您会看到everywhere写为来宾页表是写保护的,但这必须是错误的,因为它是运行在CPU和因此,是唯一可能引起保护故障的驱动程序;使用阴影cr3而不是来宾cr3)是由内核驱动程序写保护的(这是通过递归PML4项自身的读/写位完成的)。每次访客通过虚拟地址将此内容写入访客cr3页面时,该虚拟地址将始终是影子cr3,而不是访客cr3,并且由于写保护位并且在环1中而将出错。在一般保护错误时,将看到其来宾进程之一的影子cr3,它将执行在SPT中尝试的写操作,但会插入它分配的页面的主机物理地址(这次空闲列表中的任何页面) )并记下它为每个访客创建的P2M表中的映射(访客尝试使用插入到SPT中的选定机器地址进行写操作的物理地址)。然后它将加载来宾cr3,根据来宾需要对其进行写入,然后再次加载阴影cr3。当发生页面错误时,处理程序检查影子cr3是其来宾进程之一,并检查SPT,加载来宾cr3并同时检查来宾。如果影子PTE无效,则是影子页面错误。如果来宾PTE也无效,则它使用来宾IDT的页面错误条目中的地址的RIP模拟中断,以将其压入堆栈。在这样做之前,它按前面所述修补了重新编译器中的代码(当来宾在中断期间从其页表中读取时,它实际上将在读取SPT,因此,需要使用管理位对SPT进行读取保护,以便可以截取,而是可以从故障内存访问中的地址读取来宾页表条目)。对于发生的任何其他中断(即主机设备),它并不用于来宾,因此,如果处理程序看到当前的cr3属于其来宾之一的进程,则它将cr3更改为包含主机内核的虚拟进程。映射并为主机处理程序调用原始的{{1}};主机处理程序完成后,它将替换cr3。

硬件辅助类型2进一步提高了性能,使情况更加混乱,并将其统一到一个界面中,并使许多需要临时改进的临时cr3杂耍和管理任务自动化,从而使其更加整洁。内核驱动程序仅需要执行vmxon,等待来宾进行软件中断以向驱动程序注册,然后所有VM Exit事件将由RIP和CR3上的统一处理程序处理,并插入到VMCS主机状态(这意味着处理程序存根)不需要在来宾内核虚拟地址空间中进行映射)。它是专门为此设计的,与环1不同,这意味着不需要重新编译器(代码扫描和分析管理器(CSAM)和补丁管理器(PATM))。它还具有诸如TSC缩放和TSC偏移字段之类的内容,供使用TSC进行更公平调度的来宾使用。系统管理程序仍会钩挂时钟中断以执行I / O更新,并且如果当前正在执行的线程是其vCPU之一的线程的地址,则它将需要vxmoff(这将导致VM退出)并推送某些虚拟机的地址。主机内核内存中的重新初始化序列,将在其中保留来宾保存状态的情况下,虚拟化与vCPU绑定的VMCS(但已准备好执行模拟时钟中断,其代码将使用RDTSC,这将使VM退出并且VMCS中的偏移量可以系统管理程序可使用该报告来报告一个值,该值说明未在主机上安排来宾的时间。它不需要更改cr3,因为vmxoff会自动执行,因此现在可以将其传递给主机处理程序,以执行主机OS的时钟中断处理过程。

答案 5 :(得分:0)

最近的回应:

根据我的研究,我可以说这是对理解概念出现的更好的回应:

仿真的第一个概念实际上可以追溯到第一台计算机Colossus。 1941年,英国政府使用它来模仿纳粹谜编码机的功能。仿真理论于1962年开发,由三位不同角度的IBM工程师构思。

仿真表示模仿 目标的行为 ,可以是硬件,如emu8086仿真器,或者可以是软件,如从某个网络端口模拟服务。

您希望模仿目标提供的功能集,也许您对内部机制不感兴趣。

你为什么要这样?用于控制该功能。为何控制?由于多种原因,这里有很多需要讨论的问题。但请记住,你想要落后于事物。

但是这样的过程对于性能来说代价很高。你有一个指令执行了很多其他指令。也许你有兴趣只控制一些指令。因此,我们希望允许一些指令以原生方式执行。

那么当所有这些指令执行变为原生时会发生什么?然后你有理想的虚拟化。您可以虚拟化任何软件,但今天的趋势是从操作系统的虚拟化转变为应用程序的虚拟化。另外我说理想是因为这个软件在每个硬件上都有不同的执行,所以它还需要模拟一些指令。重要的是要了解今天的大多数虚拟化技术不仅仅是关于虚拟化,还关于仿真。

另请注意,在从仿真到虚拟化的过渡中,系统的输入减少了,因为虚拟化只接受软件作为输入。这些指令流的控制器名为 HyperVisor

答案 6 :(得分:0)

虚拟化可能发生在计算机体系结构的不同层上(从高到低):1:应用程序,2:库,3:操作系统,4:硬件抽象(HAL),5:指令集架构( ISA)。在后一层下面有硬件。 通过利用下层在其界面中暴露的指令,某个层利用来自较低层的服务 请注意,服务的使用与分层并不严格相关,因为某些层可以跳过下面的层并利用来自较低层的指令。作为示例,应用程序可以直接向HAL层提供某些指令,跳过库和O.S.层。

要模仿指令"意味着拦截并将用于计算机体系结构(虚拟)的某个层的指令映射到用于不同计算机体系结构(非虚拟)的同一层的序列(一个或多个)指令。 可以将虚拟化层放置在计算机体系结构的不同层。这一点可能会引起混淆。 例如,在硬件抽象层(例如VMware,VirtualBox)级别进行虚拟化时,会在HAL层和操作系统层之间放置虚拟层。操作系统利用虚拟HAL层的指令,然后由管理程序将某些虚拟ISA(指令集架构)映射到物理系统的ISA。当模拟所有指令时,我们将讨论完全仿真,这是虚拟化的一个特例。在虚拟化中,我们尝试制作一个层,以便出于性能原因尽可能多地直接执行非虚拟层的指令。 在另一个示例中,虚拟化层放置在操作系统(操作系统级虚拟化)上:在这种情况下,虚拟机被命名为容器(例如,Docker)。它包括从应用程序到O.S.的级别。 (含)。

总之,仿真与单指令有关,而"完全仿真"当我们拦截并映射某个层的所有指令时发生。 简而言之,术语"完全仿真"当虚拟化层放置在ISA级别(可能更低级别)时使用。在这种情况下,虚拟机包括从应用程序到ISA的所有级别,并且所有ISA都被拦截和映射。这通常用于虚拟化小众产品,例如Cisco路由器(例如QEMU)或90年代的视频游戏控制台,具有与通常的常用计算机完全不同的架构。但请注意,可能存在"完全仿真"也是在其他层面,这是不必要的。

答案 7 :(得分:0)

虚拟化和仿真几乎是同一回事。这两个词暗示了一个基本概念。也就是说,这两个词是一件事的“方面”。 QEMU(一种执行硬件虚拟化的快速仿真器)中对此进行了演示。

您可以将一件事视为模拟。模拟也可以是confusing字。

首先,我们可以定义单词的常见含义。

  • 模拟:让一件事做另一件事。
  • 仿真:使一个系统精确地复制另一个系统。
  • 虚拟化:允许在另一个系统中运行一个系统。

现在,我们证明这些词的含义几乎相同。例如,在仿真中,您正在创建一个系统与另一个系统的副本。这是仿真的一般含义。在虚拟化中,您希望虚拟化的系统像真实系统一样工作。也就是说,即使它可能以不同的方式实现并且可能不会完全“模拟”硬件,但理想情况下它还是像副本一样。这几乎与模拟相同。在仿真中,您模拟另一个系统,等等。

因此,我们可以看到单词可以互换。基本概念是仿真。

在诸如操作系统虚拟化(“虚拟机”)之类的虚拟化中,我们正在创建一个行为类似于操作系统的系统。它可能会使用来自底层硬件,管理程序或其他东西的技巧来提高性能和安全性。但是最后,它只是对操作系统的模拟。通常,当使用“虚拟机”一词时,它不是该机器的精确副本(如在仿真器中)。它足以完成让程序在实际操作系统上按您期望的方式运行。

在仿真中,通常意味着仿真是“精确的”。在硬件仿真中,您将复制硬件系统的所有功能。这意味着您已经创建了硬件仿真。您可以说您创建了硬件的虚拟化,但是虚拟化在这里稍有不同。虚拟化意味着创建一个隔离的环境,而仿真不一定意味着隔离。因此,硬件仿真器可能为硬件提供与硬件本身相同的接口,但是仿真器的实现可能依赖于全局内存,因此,如果尝试同时运行两个仿真器,它们将相互干扰。这就是虚拟化所解决的问题,它可以隔离仿真。

希望有帮助。

答案 8 :(得分:0)

我认为当虚拟化与仿真没有可比性时反对虚拟化是一种常见的误解。 人们在谈论虚拟化时通常会想到type 2 hypervisors 所做的事情。

根据wikipedia,虚拟化是:

<块引用>

虚拟化或虚拟化(有时缩写 v12n,一个数字名词)是创建虚拟(而不是 实际)版本的东西,包括虚拟计算机硬件 平台、存储设备和计算机网络资源。

此定义适用于仿真和类型 2 管理程序。因此,Emulator 是虚拟化的一个子类型,而 Type 2 Hypervisor 是另一个子类型。两者都可以让您运行虚拟机,但它们的工作方式和使用方式通常不同。许多虚拟机实际上都依赖这两种技术来实现其目标。

此外,仿真并不总是以 1:1 的比例复制原始硬件(通过设计而不是缺乏文档),例如 DOSBox,它模拟一种实际上并不存在的 PC,或高级仿真器(如旧的 Ultra HLE)。这使模拟器更高效(但有破坏软件兼容性的风险)。其他模拟器也有不同的目的:扩展原始硬件的功能(例如让您以 4K 运行游戏的 dolphin,或让您显着提高 3D 质量的 PS1 模拟器,或者最近, SNES 模拟器,带有经过修改的 PPU,可以输出 16:9 的图形,用于修改后的超级马里奥世界,补丁可以在宽屏中运行)。

某些模拟器还可以使用硬件资源,例如显卡。这方面的一个例子是 Connectix VirtualPC,一个用于基于 PowerPC 的 Mac 的旧 PC 模拟器。那时的 mac 和 PC 都有 PCI 插槽,而 Connectix VirtualPC 使您可以使用物理上安装在 mac 中的显卡(PC 上也有)。

我希望这能说明问题。