lecture19 虚拟机

注:基于这位大佬的中文翻译笔记学习,有大段对翻译笔记的直接引用,以及一部分询问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 的工作流程
  1. 正常执行:VMM 跳转到 Guest OS 的第一条指令。只要 Guest 执行的是普通指令(如加减乘除),CPU 就全速直接运行,无性能损耗。

  2. 触发陷入 (Trigger Trap):

    • 当 Guest Kernel 尝试执行特权指令(例如:csrw satp, x1 试图切换页表)时。

    • 由于当前处于 User Mode,CPU 硬件检测到权限不足。

    • CPU 触发一个 Trap(异常),暂停 Guest 的执行。

  3. 控制权转移:

    • 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寄存器。

  1. 触发 Trap:Guest 实际运行在 User Mode,执行特权指令 csrr 是非法的,触发硬件异常,控制权跳转到 VMM。

  2. VMM 介入:

    • VMM 检查 Trap 原因,发现是"读取 SEPC"。

    • VMM 从自己维护的虚拟状态中读取 vSEPC 的值。

  3. 模拟执行:

    • VMM 将 vSEPC 的值写入 Trap Frame 中保存的 Guest 用户寄存器 a0 的位置。

    • VMM 更新 Guest 的程序计数器(PC),指向下一条指令(跳过当前的 csrr)。

  4. 返回 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使用。

工作流程:
  1. SATP 写入拦截:

    • 当 Guest OS 试图执行指令(如 csrw satp, ...)来切换页表时,由于处于 User Mode,触发 Trap。

    • VMM 截获该 Trap。

  2. 构建影子页表:

    • VMM 读取 Guest 想要设置的页表(GVA ------> GPA)。

    • VMM 查找自己维护的内存映射表(GPA ------> HPA)。

    • VMM 将两者结合,计算出 GVA ------> HPA 的直接映射关系。

    • VMM 将这些映射填入一个新的页表,即 Shadow Page Table。

  3. 生效:

    • 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虽为虚拟机而生,但却提供的高效隔离和特权下放特性,在普通软件的性能和安全性方面有着巨大潜力。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习