linux – hypervisor guest os中的内存地址转换

linux – hypervisor guest os中的内存地址转换,第1张

概述假设有这样的代码. MOV [0x1234], EAX (intel assembly) 假设CPU想要处理此指令. 我们假设没有管理程序. 我们只是在linux环境中使用普通的x86 CPU(保护模式). 现在,我理解的是 由于0x1234是虚拟地址,因此需要进行转换 到物理地址.(让我们跳过分段部分) CPU只是将此地址(0x1234)传递给MMU硬件. MMU遍历页表并使用物理地址访问内存 假设有这样的代码.

MOV [0x1234],EAX (intel assembly)

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

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

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

我对么?

现在让我们假设有管理程序和此代码
从客户 *** 作系统运行.

究竟发生了什么?

我知道虚拟机管理程序提供了另一层页表.
但我不明白这究竟是如何运作的.

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

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

先感谢您.

解决方法 回答你的第一个问题:是的,你是.这基本上就是虚拟内存的工作原理.

现在,让我们看看当MMU和客户 *** 作系统之间运行虚拟机管理程序时会发生什么.出于性能考虑,虚拟机管理程序(无论是类型1还是类型2)都会尝试避免在每个来宾 *** 作系统内存访问时进行陷阱.我们的想法是让客户 *** 作系统管理MMU.我将详细介绍可能的实现,一个用于x86,另一个用于PowerPC.

在x86上,从Intel’s manual 3B开始:

27.3.2 Guest & Host Physical Address Spaces

Memory virtualization provIDes guest software with contiguous guest physical
address space starting zero and extending to the maximum address supported by
the guest virtual processor’s physical address wIDth. The VMM utilizes guest physical
to host physical address mapPing to locate all or portions of the guest physical
address space in host memory. The VMM is responsible for the policIEs and algorithms
for this mapPing which may take into account the host system physical
memory map and the virtualized physical memory map exposed to a guest by the
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映射到C的guest虚拟机.

27.3.3 Virtualizing Virtual Memory by Brute Force

A simple-minded way to do this would be to ensure that all guest attempts to access
address-translation harDWare trap to the VMM where such operations can be properly
emulated. It must ensure that accesses to page directorIEs and page tables also get
trapped. This may be done by protecting these in-memory structures with conventional
page-based protection. The VMM can do this because it can locate the page
directory because its base address is in CR3 and the VMM receives control on any
change to CR3; it can locate the page tables because their base addresses are in the
page directory.

在PowerPC上,您没有像英特尔那样的页面目录的硬件表格. TLB的每次修改都是由一条指令引起的,通常来自内核内存管理器.同样,一个直截了当的想法是捕获每个访客对TLB的访问权限(例如,当访客执行tlbwe指令时设置导致VM退出的事项;注意:tlbwe将一个条目写入TLB).一旦进入VMM,管理程序就会对捕获指令进行解码,并模拟其行为,但不是将A映射到B,而是将A映射到C,直接映射到TLB.同样,VMM必须维护虚拟TLB,以防客户 *** 作系统想要检查TLB中的内容,并返回它认为早先放入TLB的内容.

总而言之,虽然某些硬件功能有助于虚拟化客户物理内存,但通常由VMM来管理有效的客户 – 物理到主机 – 物理内存映射.

总结

以上是内存溢出为你收集整理的linux – hypervisor guest os中的内存地址转换全部内容,希望文章能够帮你解决linux – hypervisor guest os中的内存地址转换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1018819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存