5

假设有这样的代码。

MOV [0x1234], EAX (intel assembly)

假设 CPU 想要处理这条指令。让我们假设没有管理程序。我们只是在 linux 环境中使用普通的 x86 CPU(保护模式)。

现在,我的理解是,由于 0x1234 是虚拟地址,因此需要将其转换为物理地址。(让我们跳过分段部分)

CPU 只需将此地址(0x1234)传递给 MMU 硬件。MMU 遍历页表并使用物理地址访问内存内容。

我对么?

现在让我们假设有虚拟机管理程序,并且这段代码是从客户操作系统运行的。

到底发生了什么?

我知道管理程序提供了另一层页表。但我不明白这是如何工作的。

如果客户代码“MOV [0x1234], EAX”在真实 CPU 中执行。虚拟地址 0x1234 将由真实硬件 MMU 翻译。所以我认为必须重写这条指令(在执行代码之前应该将0x1234替换为另一个地址),或者被困在管理程序中......

我错了吗?如果我错了,请纠正我的理解......

先感谢您。

4

1 回答 1

6

回答你的第一个问题:是的,你是。这基本上就是虚拟内存的工作方式。

现在,让我们看看当管理程序在 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 来管理有效的来宾-物理到主机-物理内存映射

于 2013-01-14T10:46:55.357 回答