回答你的第一个问题:是的,你是。这基本上就是虚拟内存的工作方式。
现在,让我们看看当管理程序在 MMU 和来宾操作系统之间运行时会发生什么。出于性能考虑,管理程序(无论是类型 1还是类型 2)将尝试避免在每个来宾操作系统内存访问时陷入陷阱。这个想法是让客户操作系统管理 MMU。我将详细说明可能的实现,一种用于 x86,一种用于 PowerPC。
在 x86 上,来自英特尔的手册 3B:
27.3.2 访客和主机物理地址空间
内存虚拟化为客户软件提供从零开始并扩展到客户虚拟处理器物理地址宽度支持的最大地址的连续客户物理地址空间。VMM 利用客户物理到主机物理地址映射来定位主机内存中的所有或部分客户物理地址空间。VMM 负责此映射的策略和算法,这可能会考虑到主机系统物理内存映射和 VMM 向来宾公开的虚拟化物理内存映射。
VMM 知道 VM 的当前PDBR
基地址(PDBR
保存在CR3
寄存器中),因为访问CR3
将导致 VM_EXIT。VMM 将能够代表来宾操作系统维护真实页面目录。我的意思是,当客户操作系统修改其页面目录以将逻辑地址 A 映射到物理地址 B 时,VMM 会捕获此问题,而不是将 A 映射到 B,而是将 A 映射到 C。因此,对 A 的任何进一步访问都不会导致#PF,它将通过 MMU 完美地路由到 C。这种方法的可悲之处在于客户机认为它已将 A 映射到 B,但实际上 A 已映射到 C,因此 VMM 必须维护一个虚拟页面目录,以防客户机读取它先前映射 A 的位置。 VMM 捕获此读取访问,而不是说 A 映射到 B,它返回给客户机 A 映射到 C。
27.3.3 蛮力虚拟化虚拟内存
一种简单的方法是确保所有来宾尝试访问地址转换硬件陷阱到 VMM,在该 VMM 中可以正确模拟此类操作。它必须确保对页目录和页表的访问也被捕获。这可以通过使用传统的基于页面的保护来保护这些内存中的结构来完成。VMM 可以这样做,因为它可以定位页目录,因为它的基地址在 CR3 中,并且 VMM 接收对 CR3 的任何更改的控制;它可以定位页表,因为它们的基地址在页目录中。
在 PowerPC 上,您没有英特尔的页面目录的硬件表遍历。TLB 的每次修改都是由一条指令引起的,通常来自内核内存管理器。同样,一个简单的想法是捕获每个访客对 TLB 的访问(例如,设置一些东西以在访客执行tlbwe
指令时导致 VM 退出;注意:tlbwe
将条目写入 TLB)。一旦进入 VMM,管理程序就会对捕获指令进行解码,并模拟其行为,但它不是将 A 映射到 B,而是将 A 映射到 C,直接进入 TLB。同样,VMM 必须维护一个虚拟 TLB,以防客户操作系统想要检查 TLB 中的内容,并返回它认为之前放入 TLB 中的内容。
总而言之,虽然一些硬件特性有助于虚拟化来宾物理内存,但通常由 VMM 来管理有效的来宾-物理到主机-物理内存映射。