Linux 虚拟机监控程序来宾操作系统中的内存地址转换

Linux 虚拟机监控程序来宾操作系统中的内存地址转换,linux,memory,virtualization,virtual-machine,virtual-memory,Linux,Memory,Virtualization,Virtual Machine,Virtual Memory,假设有这样的代码 MOV [0x1234], EAX (intel assembly) 假设CPU想要处理这个指令。 假设没有虚拟机监控程序。 我们只是在linux环境中使用普通的x86CPU(受保护模式) 现在,我的理解是 由于0x1234是一个虚拟地址,因此需要对其进行转换 转换为物理地址。(让我们跳过分段部分) CPU只需将此地址(0x1234)传递给MMU硬件。 MMU遍历页表并使用物理地址访问内存内容 我说得对吗 现在让我们假设有虚拟机监控程序和此代码 正在从来宾操作系统运行 到底发

假设有这样的代码

MOV [0x1234], EAX (intel assembly)
假设CPU想要处理这个指令。 假设没有虚拟机监控程序。 我们只是在linux环境中使用普通的x86CPU(受保护模式)

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

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

我说得对吗

现在让我们假设有虚拟机监控程序和此代码 正在从来宾操作系统运行

到底发生了什么

我知道hypervisor提供了页面表的另一层。 但我不明白这到底是怎么回事

如果执行来宾代码“MOV[0x1234],EAX” 在真实的CPU中。虚拟地址0x1234将被转换为 真正的硬件MMU。所以我认为这个指令必须 重写(0x1234应替换为其他地址 在代码执行之前),或被捕获到虚拟机监控程序

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


提前谢谢。

回答您的第一个问题:是的,您是。这就是虚拟内存的基本工作原理

现在,让我们看看当管理程序在MMU和来宾操作系统之间运行时会发生什么。出于性能考虑,虚拟机监控程序(也就是类型1或类型2)将尝试避免在每次来宾操作系统内存访问时被捕获。其想法是让来宾操作系统管理MMU。我将详细介绍可能的实现,一个用于x86,一个用于PowerPC

在x86上,从:

27.3.2来宾和主机物理地址空间

内存虚拟化为来宾软件提供了连续的来宾物理 从零开始并扩展到支持的最大地址的地址空间 来宾虚拟处理器的物理地址宽度。VMM利用来宾物理层 托管物理地址映射以定位来宾物理地址的全部或部分 主机内存中的地址空间。VMM负责策略和算法 对于此映射,可能会考虑主机系统物理 内存映射和虚拟化物理内存映射由 VMM

VMM知道VM的当前
PDBR
基址(
PDBR
保存在
CR3
寄存器中),因为访问
CR3
将导致VM\u退出。VMM将能够代表来宾操作系统维护真实页面目录。我的意思是,当来宾操作系统修改其页面目录以将逻辑地址A映射到物理地址B时,VMM会在该目录上设置陷阱,而不是将A映射到B,而是将A映射到C。因此,对A的任何进一步访问都不会导致A#PF,它将通过MMU完美地路由到C。这种方法的悲哀之处在于,来宾认为它已将A映射到B,但实际上A已映射到C,因此VMM必须维护一个虚拟页面目录,以防来宾读取它以前映射到A的位置。VMM在此读取访问上设置陷阱,而不是说A映射到B,它返回到将A映射到C的来宾

27.3.3通过暴力虚拟化虚拟内存

一个简单的方法是确保所有来宾都尝试访问 地址转换硬件陷阱到VMM,在那里可以正确执行此类操作 仿效。它必须确保对页面目录和页面表的访问也能被访问 被困。这可以通过使用传统的方法保护这些内存结构来实现 基于页面的保护。VMM可以执行此操作,因为它可以定位页面 目录,因为它的基址在CR3中,VMM接收对任何 改为CR3;它可以定位页表,因为它们的基址位于 页面目录

在PowerPC上,您没有像Intel那样的页目录硬件表漫游。TLB的每次修改都是由一条指令引起的,通常来自内核内存管理器。在这里,一个简单的想法是捕获每个来宾对TLB的访问(例如,当来宾执行
tlbwe
指令时设置使VM退出;注意:
tlbwe
将条目写入TLB)。一旦进入VMM,虚拟机监控程序就会对捕获指令进行解码,并模拟其行为,但它不是将A映射到B,而是将A映射到C,直接映射到TLB。同样,VMM必须维护一个虚拟TLB,以防来宾操作系统想要检查TLB中的内容,并返回它认为先前已经放在TLB中的内容


总之,尽管某些硬件功能有助于虚拟化来宾物理内存,通常由VMM来管理有效的来宾物理到主机物理内存映射

谢谢,这是一个非常有用的答案!!