注:基于这位大佬的中文翻译笔记学习,有大段对翻译笔记的直接引用,以及一部分询问AI和结合自己理解的一些内容。写这份笔记只是为了方便自己复习和理解。
https://github.com/huihongxiao/MIT6.S081
虚拟机:虚拟机本质上是对计算机硬件的模拟,其模拟的精确程度足以运行一个未经修改的操作系统。下面是一些相关术语:
-
VMM (Virtual Machine Monitor) / Hypervisor:
-
位于硬件最底层,取代了传统操作系统内核的位置。
-
Host 空间:运行 VMM 的区域。
-
主要职责:模拟多个计算机环境,管理硬件资源,使得上层软件(Guest OS)认为自己独占硬件。
-
-
Guest 空间(客户机空间):
-
运行在 VMM 之上。
-
Guest Supervisor Mode:运行 Guest 操作系统内核(如 Linux, Windows)。
-
Guest User Mode:运行 Guest 内部的用户进程(如 VI, GCC)。
-
注:目前提到的虚拟机不同于我们在自己电脑上通过软件如VirtualBox运行的虚拟机。文章中提到的虚拟机架构中,VVM是真正取代了操作系统,直接安装在硬件上,拥有对硬件的绝对控制权。虚拟机的概念可以和Guest空间对应,虚拟机包含Guest Kernel和Guest User Apps。
还需要注意的一点是,VM(虚拟机)并不是包含VMM和Guest空间的整体,VM之于VMM就好像进程之于内核。一个VMM可以管理多个VM。VMM的地位相当于内核的内核。
为什么使用虚拟机:
-
资源整合与成本节约(Enterprise & Cloud):
-
多路复用:将 DNS、防火墙等低负载服务合并到一台物理机上,避免硬件浪费。
-
云计算灵活性(如 AWS):云厂商不再出租物理机,而是出租"计算规格"。这允许厂商在同一物理机上超售资源(Overbooking),在不增加硬件成本的情况下提高收益。
-
-
开发与调试(Development):
-
便捷性:如课程中使用 QEMU 运行 XV6,无需复杂的物理硬件配置。
-
调试能力:VMM 提供了比物理机更强大的调试接口(如 GDB 接入),能轻松查看寄存器和内存状态。
-
-
高级抽象功能(Advanced Abstraction):
-
快照(Snapshot):保存整个操作系统和进程的瞬间状态,用于备份、调试或回滚。
-
热迁移(Live Migration):在不中断服务的情况下,将运行中的虚拟机从一台物理机迁移到另一台(例如为了维护硬件)。
-
设计目标:
-
完全透明(Fidelity):
-
Guest OS 不应感知到自己运行在虚拟机中。
-
VMM 必须精确模拟硬件行为,确保任何能运行在物理机上的操作系统(包括未知的 OS)都能在虚拟机中运行。
-
-
严格隔离(Isolation & Security):
-
防逃逸:Guest 绝不能突破 VMM 的限制去访问 Host 或其他 Guest 的内存/存储。
-
信任模型:云环境中,用户运行的软件(甚至操作系统)被视为不可信的。虚拟机提供了比传统进程(Process)更严格的隔离级别,防止恶意攻击或 Bug 扩散。
-
操作系统视角的转变:学习虚拟机的学术价值在于它改变了我们看待操作系统的方式。传统OS的管理单元是进程,而VMM的管理单元是计算机。内存分配,调度等经典问题在VMM层面上需要重新思考,VMM就像是操作系统的操作系统。
现实中的妥协:虽然理想目标是完全模拟,但处于性能考虑,现代虚拟化技术通常会有所妥协。比如半虚拟化暗示------为了获得对磁盘、网卡等设备的高速访问,Guest OS 有时会通过特定的驱动程序与 VMM 进行显式交互(即 Guest 知道自己在虚拟机里)。
VMM的实现路径:在构建VMM时,主要有两种技术路线。
A. 纯软件模拟 (Pure Software Emulation)
-
原理:编写一个软件(如 QEMU 的模拟模式),读取 Guest 的每一条二进制指令,解析其含义,并更新软件模拟出的寄存器状态(如模拟的 PC、模拟的 SATP 等)。
-
优点:概念简单直观,便于跨架构运行(如在 x86 上模拟 RISC-V)。
-
缺点:极度缓慢。每执行一条 Guest 指令可能需要几十条 Host 指令来模拟。
-
结论:由于性能太差,这种方式在云计算和生产环境中不实用。
B. 直接执行 (Direct Execution)
-
原理:将 Guest OS 的指令加载到物理内存中,让真实的物理 CPU 直接运行这些指令。
-
前提:宿主机和客户机的 CPU 架构必须一致(如都是 RISC-V)。
-
挑战:如何处理 Guest OS 的特权指令(Privileged Instructions)?
特权级困境:如果采用直接执行策略,必须决定Guest Kernel运行在什么特权模式下。
-
方案一:运行在 Supervisor Mode(内核态)
-
后果:Guest Kernel 拥有对物理硬件的完整控制权。它不仅能修改真实的页表(SATP),还能读写任意物理内存。
-
风险:Guest 可以轻松破坏 Host 系统或从虚拟机中逃逸。这是绝对不可接受的。
-
-
方案二:运行在 User Mode(用户态)
-
后果:Guest Kernel 本质上变成了 Host 上的一个普通用户进程。
-
问题:Guest Kernel 代码中充斥着特权指令(如修改 SATP 加载页表、读取 STVEC 中断向量)。在 RISC-V 架构下,在 User Mode 执行这些指令是非法的,会导致程序崩溃。
-
核心机制Trap-and-Emulate(陷入和模拟):为了解决上述困境,VMM采用了Trap-and-Emulate策略。其核心思想是:让Guest认为自己有权限,实际上通过Trap由VMM代劳。
A. 运行模式设置
-
Host (VMM):运行在 Supervisor Mode(最高权限,拥有硬件控制权)。
-
Guest Kernel:被降级运行在 User Mode(无特权,受限制)。
B. Trap 的工作流程
-
正常执行:VMM 跳转到 Guest OS 的第一条指令。只要 Guest 执行的是普通指令(如加减乘除),CPU 就全速直接运行,无性能损耗。
-
触发陷入 (Trigger Trap):
-
当 Guest Kernel 尝试执行特权指令(例如:
csrw satp, x1试图切换页表)时。 -
由于当前处于 User Mode,CPU 硬件检测到权限不足。
-
CPU 触发一个 Trap(异常),暂停 Guest 的执行。
-
-
控制权转移:
-
Trap 发生后,控制权自动从 Guest(User Mode)转移回 VMM(Supervisor Mode)。
-
这就像普通进程系统调用出错跳回内核一样,这里是跳回 VMM。
-
C. VMM 的介入
-
VMM 捕获这个 Trap 后,会检查是什么原因导致的(例如:发现是 Guest 试图写 SATP)。
-
此时 VMM 获得了控制权,它可以决定如何"模拟"这个操作(这是下一节 Emulate 的内容),或者终止非法的 Guest。
-
关键点:Guest 并没有真正修改物理寄存器,它只是触发了一个通知 VMM 的信号。
Trap-and-Emulate中的模拟
核心机制------虚拟状态维护:VMM不仅是一个监控者,更是一个状态保管员。它为而每个Guest维护了一套完整的数据结构,用于保存Guest认为的CPU状态。
-
虚拟寄存器:VMM 在内存中维护了 Guest 的
vSTVEC,vSEPC,vSCAUSE,vSATP等所有特权寄存器的副本。 -
虚拟模式 (Mode):VMM 记录 Guest 当前认为自己处的模式(Guest User Mode 或 Guest Supervisor Mode)。
-
虚拟 CPU ID (Hart ID):记录当前模拟的 CPU 核心编号。
模拟流程:假设Guest OS内核试图执行指令csrr a0,sepc,即读取SEPC到a0寄存器。
-
触发 Trap:Guest 实际运行在 User Mode,执行特权指令
csrr是非法的,触发硬件异常,控制权跳转到 VMM。 -
VMM 介入:
-
VMM 检查 Trap 原因,发现是"读取 SEPC"。
-
VMM 从自己维护的虚拟状态中读取
vSEPC的值。
-
-
模拟执行:
-
VMM 将
vSEPC的值写入 Trap Frame 中保存的 Guest 用户寄存器a0的位置。 -
VMM 更新 Guest 的程序计数器(PC),指向下一条指令(跳过当前的
csrr)。
-
-
返回 Guest:
-
VMM 执行
sret。 -
Guest 恢复运行,发现
a0里有了正确的值,以为指令执行成功了。
-
为什么不能直接使用硬件寄存器,而要维护虚拟寄存器:以SCAUSE为例,Guest里的用户程序发起了一个系统调用,Guest OS觉得自己在内核态,它去读SCAUSE,期望读到的值是8(代表系统调用),这样它才能去处理这个系统调用。然而Guest OS实际上运行在User Mode,当Guest OS尝试去读SCAUSE时,因为权限不足,再次触发了硬件Trap,跳到了VMM,由于这次Trap是非法读取寄存器引起,硬件CPU会自动把真实的SCAUSE寄存器修改为2(代表非法指令)。如果VMM直接读取真实硬件值的话,那么Guest OS会读到2,然后崩溃。但实际上,这只是一个正常的系统调用。
因此,VMM在Guest用户程序发起系统调用时截获它,并在虚拟寄存器vSCAUSE中记下8,当Guest OS试图读取寄存器并触发Trap时截获它,此时VMM无视真实硬件中的2,把虚拟寄存器中的8返回给Guest OS。
模式跟踪和sret:VMM必须时刻知道Guest(虚拟机)认为自己处于什么模式,以便决定是否允许执行特权指令模拟。这里需要注意,VMM存储的是虚拟机的状态,包含Guest内核以及Guest用户程序,所以虚拟模式需要在Guest User Mode和Guest Supervisor Mode之间来回切换。如果Guest用户程序(Guest User Mode)试图读SCAUSE,VMM捕获并检查虚拟模式后,会拒绝模拟,向Guest注入一个"非法指令异常";如果Guest OS(Guest Supervisor Mode)做同样的操作,VMM才会进行模拟。
模式切换的关键在于sret:
当Guest OS执行sret想返回用户空间时,这又是一条特权指令,VMM捕获Trap,将虚拟模式从内核态更新为用户态,读取vSEPC,然后把这个地址写入物理SEPC寄存器中,由VMM执行sret,然后开始执行Guest用户程序的代码,且处于Guest User Mode。而Guest OS中的那个sret只是用来引发Trap,它从未在物理CPU上执行成功。
当VMM执行sret想返回Guest OS时,此时可以顺利执行成功。
物理CPU上真正成功执行的sret指令,永远都是VMM发出的。
模拟系统调用:这是一个复杂的多重跳转过程。
-
Guest 用户程序执行
ecall。 -
Trap 到 VMM(因为
ecall在 User Mode 下会 Trap)。 -
VMM 处理:
-
检查虚拟模式是 Guest User Mode。
-
更新虚拟状态:
vSCAUSE = 8(Syscall),vSEPC = Guest PC,vMode = Supervisor。 -
目标重定向:将真实的
SEPC设置为vSTVEC(Guest OS 的 Trap Handler 地址)。
-
-
VMM 返回:执行
sret。 -
Guest OS 开始运行 Trap Handler,此时就好像xv6中用户程序执行ecall后,内核所接受到的一样,只不过Guest OS以为是硬件直接跳过来的,其实是 VMM 摆渡过来的。
内存虚拟化带来的问题:在虚拟化环境中,内存地址的翻译变得复杂得多,因为存在三层地址空间。但真实得MMU只能进行一次翻译,如果直接让Guest 修改 SATP 寄存器指向 Guest 自己的页表(GVA------>GPA),MMU 最终得到的地址是 GPA。但 CPU 需要的是 HPA 才能真正访问内存。直接使用 GPA 访问硬件会导致访问错误的地址或崩溃。
-
GVA (Guest Virtual Address):Guest 应用程序看到的虚拟地址。
-
GPA (Guest Physical Address):Guest 操作系统认为的物理地址。
-
Guest 认为自己拥有从 0 到 32GB 的连续物理内存。
-
但实际上,这只是 VMM 分配给它的一段一段不连续的宿主机内存。
-
-
HPA (Host Physical Address):宿主机真实的物理内存地址。
影子页表:为了解决上述问题,VMM引入了影子页表机制,其核心思想是------VMM在幕后维护一张真正的页表,直接将GVA映射到HPA,并将其交给CPU使用。
工作流程:
-
SATP 写入拦截:
-
当 Guest OS 试图执行指令(如
csrw satp, ...)来切换页表时,由于处于 User Mode,触发 Trap。 -
VMM 截获该 Trap。
-
-
构建影子页表:
-
VMM 读取 Guest 想要设置的页表(GVA ------> GPA)。
-
VMM 查找自己维护的内存映射表(GPA ------> HPA)。
-
VMM 将两者结合,计算出 GVA ------> HPA 的直接映射关系。
-
VMM 将这些映射填入一个新的页表,即 Shadow Page Table。
-
-
生效:
-
VMM 将 Shadow Page Table 的物理地址 写入真实的硬件 SATP 寄存器。
-
VMM 执行
sret返回 Guest。
-
结果:Guest OS 以为自己设置了页表,实际上硬件使用的是 VMM 偷梁换柱后的影子页表。
如何保证隔离性:影子页表是VMM实现虚拟机隔离的关键手段。影子页表由VMM构建,VMM在构建时,只会填入它分配给该Guest的HPA。即使Guest在自己页表中填入一个指向属于其他VM的物理地址,VMM在翻译GPA------>HPA时会发现非法访问,并拒绝写入影子页表中,或向Guest注入Page Fault。因此,Guest永远无法通过硬件访问到不属于它的物理内存。
维护页表的一致性:Guest OS不仅会切换SATP,还会修改现有的页表项(PTE)。在RISC-V中,修改内存中的PTE不会触发Trap,VMM如何知道Guest修改了页表,从而去更新影子页表是一个问题。
RISC-V规范要求,修改PTE后必须执行sfence.vma指令来刷新TLB,否则硬件不保证看到修改。
VMM的策略:
-
Guest 修改 PTE(VMM 此时不知道,Shadow Page Table 还是旧的,但这没关系,因为硬件 TLB 可能也是旧的)。
-
Guest 为了让修改生效,必须执行
sfence.vma。 -
sfence.vma是特权指令,触发 Trap。 -
VMM 捕获 Trap,意识到页表可能变了。
-
VMM 扫描 Guest 的页表,找到变更的 PTE,同步更新 Shadow Page Table。
-
VMM 执行真实的
sfence.vma,并返回 Guest。
性能和局限性:这种方案完全不需要硬件支持,在任何标准RISC-V种都能运行。但是每次上下文切换(写SATP)都会Trap,每次修改页表(sfence.vma)都会Trap。构建和同步影子页表的开销很大。
外设虚拟化:外设种类繁多且交互复杂,是VMM开发种工作量最大的部分。下面是关于外设虚拟化的三种策略。
1. 策略一:全模拟 (Full Emulation)
-
核心思想:欺骗到底。VMM 模拟一个真实存在的硬件(如经典的 IDE 硬盘或 e1000 网卡),让 Guest OS 以为自己在使用真实的物理设备。
-
适用场景 :运行未修改的旧操作系统(Legacy OS),或者 Guest OS 完全不知道自己运行在虚拟机上的情况。
-
实现机制:
-
Guest OS 依然使用标准的 MMIO(内存映射 I/O)去读写设备寄存器。
-
VMM 将这些 MMIO 地址对应的页表项标记为无效(Invalid)。
-
当 Guest OS 试图访问这些寄存器时,触发 Page Fault(Trap)。
-
VMM 捕获 Trap,检查指令,模拟硬件行为(例如:Guest 写了"发送"寄存器,VMM 就把数据发出去),然后恢复 Guest 运行。
-
-
优缺点:
-
优点:兼容性极好,能运行任何操作系统。
-
缺点 :极度低效。真实驱动通常会频繁读写寄存器(如轮询状态),导致产生海量的 Trap,严重拖慢性能。
-
2. 策略二:半虚拟化设备 (Paravirtualized Devices / Virtio)
-
核心思想:合作共赢。Guest OS 知道自己是在虚拟机里,因此它不使用真实的硬件驱动,而是使用专门为虚拟化环境设计的驱动(如 Virtio)。
-
适用场景:现代操作系统(Linux, Windows, XV6-riscv),对性能有较高要求。
-
实现机制:
-
减少 Trap:不再频繁读写寄存器。
-
共享内存队列 (Virtqueue):Guest 和 VMM 在内存中维护一个命令队列(Ring Buffer)。Guest 把一批读写请求填入队列,然后仅通知一次 VMM(甚至不通知,采用轮询)。
-
后端处理 :VMM(如 QEMU)从队列中取出请求,将其转换为对宿主机文件系统(如
fs.image)的读写操作。
-
-
XV6 案例 :XV6 的
virtio_disk.c就是这种策略的典型代表。它不操作物理磁盘,而是按照 Virtio 标准与 QEMU 进行高效通信。 -
优缺点:
-
优点:性能远高于全模拟,Trap 数量大幅减少。
-
缺点:需要修改 Guest OS,安装特定的驱动程序。
-
3. 策略三:设备直通 (Device Passthrough / SR-IOV)
-
核心思想:让路。VMM 不再中间传话,直接让 Guest OS 操作真实的物理硬件。
-
适用场景:高性能计算、网络密集型应用(如高频交易、云计算网关)。
-
实现机制:
-
硬件支持 (SR-IOV) :现代硬件(如高端网卡)支持单根 I/O 虚拟化 。一块物理网卡可以在硬件层面上虚拟出多个 Virtual Functions (VF)。
-
直接映射 :VMM 配置 IOMMU,将某个 VF 的控制寄存器和 DMA 空间直接映射到 Guest OS 的地址空间。
-
Guest OS 就像操作物理网卡一样操作这个 VF,完全绕过 VMM,实现近乎原生的性能。
-
-
优缺点:
-
优点:性能最高(接近裸金属)。
-
缺点:依赖特定硬件支持,且会破坏虚拟机的可迁移性(因为绑定了特定硬件)。
-
软件模拟到硬件辅助虚拟化
为什么需要硬件支持:在Trap-and-Emulate方案中,Guest执行特权指令频繁触发Trap,导致性能瓶颈。Intel推出VT-x主要有三个动力:
-
市场需求:虚拟机应用极广,客户渴望更高的性能。
-
性能痛点:软件模拟的 Trap 开销太大。
-
架构缺陷:x86 架构不仅难以实现纯软件的 Trap-and-Emulate(不像 RISC-V 那么"干净"),而且修补这些缺陷的成本很高,不如直接出硬件方案。
VT-x引入了两种全新的CPU操作模式,从根本上解决了特权级压缩的问题。
-
VMX Root Mode(根模式):
-
使用者 :VMM (Host)。
-
权限:拥有对硬件的绝对控制权,使用真实的物理寄存器。
-
地位:相当于没有虚拟化时的最高特权级。
-
-
VMX Non-Root Mode(非根模式):
-
使用者 :Guest (虚拟机)。
-
特性:
-
硬件级虚拟寄存器 :硬件为 Non-Root Mode 准备了一套影子寄存器(Shadow Registers)。
-
特权指令直通 :Guest 在 Non-Root Mode 下可以直接读写 这些影子特权寄存器(如 STVEC, CR3),而不需要触发 Trap。
-
-
效果:Guest 内核全速运行特权指令,VMM 只有在必要时(如 I/O 或调度)才介入。
-
控制结构和新指令:为了管理这种新模式,Intel定义了新的数据结构和指令集。
-
VMCS (Virtual Machine Control Structure):
-
这是 VMM 和硬件交互的桥梁(内存中的一个结构体)。
-
VMM 在其中填入 Guest 的初始状态(寄存器值、控制位等)。
-
硬件在模式切换时自动从这里读取或保存状态。
-
-
关键指令:
-
VMLAUNCH:基于 VMCS 启动一个新的虚拟机(进入 Non-Root Mode)。 -
VMRESUME:从 VMM 恢复到虚拟机继续运行。 -
VMCALL:Guest 主动请求 VMM 服务(类似于系统调用,但这是"超级调用 Hypercall"),会强制触发 Trap。
-
EPT:这是为了解决影子页表性能问题而生的硬件方案。在软件方案中,Guest修改页表基址寄存器必须Trap,因为VMM怕它乱访问内存,而在VT-x中,Guest可以直接修改CR3,无需Trap。硬件自动使用Guest Page Table完成GVA------>GPA的映射,然后使用EPT(由VMM配置并告知硬件)完成GPA------>HPA的两层地址翻译。即使Guest可以随意修改自己的页表,它最终生成的 GPA 依然要经过 EPT 的"过滤"。如果 Guest 访问了 EPT 中未映射的 GPA,硬件会抛出异常。VMM 通过控制 EPT 牢牢掌握了物理内存的分配权。
何时Trap:虽然特权指令不再Trap,但在以下情况Guest依然会陷入到VMM中。
-
外部中断 :如定时器中断。这是 VMM 实现多虚拟机分时调度(Time Sharing)的基础。
-
VMCALL:Guest 主动呼叫。 -
特定 I/O 操作:如果没有做设备直通,访问外设依然可能导致 Trap。
多核和多虚拟机:每个CPU核心都有独立的VT-x硬件单元(寄存器组,EPT指针)。
并发模型:
-
可以在 Core 1 上运行 VM A,在 Core 2 上运行 VM B。
-
或者在 Core 1 上通过定时器轮流运行 VM A 和 VM B。
-
VMM 像操作系统管理进程一样,通过
struct vm数据结构来管理多个虚拟机实例。
相比原本的Trap-and-Emulate通过软件维护影子状态,指令执行慢,Trap频繁。
在硬件支持下,通过硬件维护影子状态,特权指令直通,性能接近原生。
Dune:将专门为虚拟机设计的硬件(Intel VT-x),用来增强普通Linux进程的功能和安全性。它不是为了运行另一个操作系统,而是为了让进程拥有像内核一样的特权,同时又不破坏系统的整体安全性。
Dune模式:在传统的 Linux 中,进程受到页表(Page Table)的隔离。而在 Dune 环境下:
-
Dune 模块:作为一个可加载的内核模块运行在 Linux 内核(Root Supervisor Mode)中。
-
Dune 进程 :普通进程可以切换到"Dune 模式"。此时,该进程运行在硬件的 Non-root Mode 下。
-
权限下放 :进程在 Non-root 模式下拥有了自己的虚拟特权寄存器(如 CR3)。这意味着进程可以直接执行特权指令,比如自行设置和切换页表,而不需要通过 Linux 内核。
隔离机制:虽然Dune进程拥有了内核级的权限,但它仍然无法逃逸:
-
第一层:进程页表 (CR3):进程可以自由设置 GVA ------> GPA 的映射,实现灵活的内存管理。
-
第二层:EPT (Extended Page Table):这是由 Dune 模块(Linux 内核)控制的。EPT 限制了该进程只能访问 Linux 分配给它的物理内存。
-
结论:进程可以随意"玩耍"自己的内存,但绝触碰不到其他进程或 Linux 内核的内存。
应用场景一:高效的用户态沙箱
Dune 允许进程内部再次划分权限层级(Guest Supervisor vs Guest User):
-
浏览器实例:主程序运行在进程的 Guest Supervisor 模式,拥有控制权。
-
插件/解码器:运行在进程的 Guest User 模式。
-
优势:
-
独立页表:主程序可以为插件设置极其严格的页表。
-
系统调用拦截:插件执行系统调用时,会直接 Trap 到主程序(Guest Supervisor)而不是 Linux 内核。主程序可以像 VMM 一样审查、允许或拒绝这些调用。
-
性能:利用硬件 VT-x 实现,比传统的软件沙箱(如 ptrace)快得多。
-
应用场景二:加速垃圾回收(GC)
垃圾回收器需要知道哪些内存页在扫描期间被修改过,以确保数据一致性。
-
传统方法 :在普通 Linux 中,获取内存页的 Dirty Bit(脏位)非常困难且缓慢,通常需要复杂的系统调用。
-
Dune 方法:
-
因为进程现在拥有对页表的直接控制权(通过虚拟 CR3),GC 线程可以直接使用普通的
load指令读取 PTE。 -
性能飞跃:GC 可以极快地扫描 PTE 数组,通过 Dirty Bit 迅速定位被修改的 Page,大大缩短了 GC 的停顿时间。
-
一些其他问题的回答:
-
安全性与 Fork:
-
如果 Dune 进程
fork,子进程默认不进入 Dune 模式。 -
即使插件(Guest User)尝试逃逸,它也必须经过 Guest Supervisor 的同意。由于 Guest Supervisor 运行在 Non-root 模式,它无法执行任何能够伤害 Host Linux 内核的操作。
-
-
EPT 的性能代价:
-
使用 EPT 会增加内存地址翻译的层数(GVA ------> HPA)。在最坏情况下,一次内存访问可能演变成几十次页表查询。
-
但在实际应用中,由于 TLB 缓存 的存在,这种性能损耗在大多数工作负载下是可以接受的。
-
Dune的意义:它证明了硬件原语可以被重新定义,VT-x虽为虚拟机而生,但却提供的高效隔离和特权下放特性,在普通软件的性能和安全性方面有着巨大潜力。