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

相关推荐
程序猿零零漆31 分钟前
Spring之旅 - 记录学习 Spring 框架的过程和经验(八)基于Spring的注解应用
java·学习·spring
·present·1 小时前
射频网课学习第二章(阻抗匹配 ch2-5到ch2-9部分)
学习
航Hang*1 小时前
第五章:综合布线技术 —— 管理间(电信间)设计与施工
网络·笔记·学习·设计·光纤
以梦为马越骑越傻1 小时前
量化交易学习_23常用api
学习
·present·1 小时前
射频学习第九章网课学习(宽频放大器)
学习
byzh_rc2 小时前
[机器学习-从入门到入土] 计算学习理论
人工智能·学习·机器学习
三品吉他手会点灯3 小时前
STM32F103 学习笔记-21-串口通信(第2节)-STM32串口功能框图讲解
笔记·stm32·单片机·嵌入式硬件·学习
Sirens.3 小时前
Java异常处理解析:从防御式编程到自定义异常类
java·开发语言·笔记·学习·github·javac
OAoffice3 小时前
企业智能学练考软件分析指南
人工智能·学习·学练考一体化平台·企业学习考试平台
RaLi和夕4 小时前
硬件电路设计学习笔记4.MOS管
笔记·嵌入式硬件·学习