linux – x86平台中的KVM影子页表处理

linux – x86平台中的KVM影子页表处理,第1张

概述据我所知,在没有硬件支持的处理器上,假设虚拟到主机物理地址转换,KVM使用影子页面表. 当guest虚拟机 *** 作系统修改其页表时,将构建并更新阴影页表.是否有硬件中的特殊说明(让x86作为参考)来修改页面表?除非有特殊说明,否则VMM不会有陷阱.是不是Linux内核在软件中维护的页表只是另一种数据结构?为什么需要特殊说明来更新它? 谢谢! 我使用的是另一个VMM而不是KVM,所以我不知道KVM的细节 据我所知,在没有硬件支持的处理器上,假设虚拟到主机物理地址转换,KVM使用影子页面表.

当guest虚拟机 *** 作系统修改其页表时,将构建并更新阴影页表.是否有硬件中的特殊说明(让x86作为参考)来修改页面表?除非有特殊说明,否则VMM不会有陷阱.是不是Linux内核在软件中维护的页表只是另一种数据结构?为什么需要特殊说明来更新它?

谢谢!

解决方法 我使用的是另一个VMM而不是KVM,所以我不知道KVM的细节,但所有VMM的原理都是一样的.它的工作方式是有两组页表.

除了页表基地址的特殊寄存器之外,没有特殊的指令来管理页表[和其他寄存器中的一些随机位通常用于配置处理器,但这通常是“一次性”设置].页面表只是用常规指令写入的内存位 – 如果你真的想要的话,你可以做加,减,和,或等等,除非你完全知道你在做什么,否则它很可能会引起问题! ],但典型的operato是“mov”(商店)或“xchg”(交换) *** 作.

第一个页面表是OS实际编写的页面表. VMM将其设置为只读内存,因此只要有写入,处理器页面就会出错.由于KVM在处理器中使用硬件虚拟化扩展(AMD处理器上的SVM或Intel处理器上的VMX),因此VMM(在这种情况下为KVM)捕获页面错误,其中检查写入 *** 作以查看它是否为“页面” -table write“,如果是这样,它被转换为第二个影子页面表 – 这就是VMM如何让VM相信内存从0开始并变为1GB,但实际上我们已经采取了一堆页面到处都是1GB的内存,这些内存看起来是一组连续的平面页面.当然,由于VMM“处于”VM内部的 *** 作系统,我们不能让 *** 作系统写入它的REAL页表,因为它不知道在那里写的“真正的”页表值. [但我们确实需要让 *** 作系统拥有自己的页面表,以防它从页面表中读取,并且当它不是 *** 作系统实际预期的时候会完全混淆].

处理器“真实CR3”由VMM设置,并指向阴影页面表.

VMM将捕获CR3(页表基址)写入,以便它可以跟踪页面表所在的位置(并跟踪要使用的“真实CR3”).但是,VMM不需要知道CR3的读取,因此通常允许它们直接在VM中发生而不会拦截它.

处理器中VMM扩展的重点是支持这种特殊指令的拦截,同时仍然将VM中的大多数特权指令作为“常规”指令运行 – 例如,您不希望跳转到VMM用于每次写入标志寄存器以启用/禁用中断等 – 让它在VM中发生,就像它是真正的硬件一样.但是一些寄存器对于VMM可以控制至关重要.

显然,当页表有硬件支持时,则有两层页表.一个将“0-1GB”翻译成“散布在各处的”,另一个是 *** 作系统维护的实际页面表.在这种情况下,不需要拦截任何页表写入,页面错误或任何CR3更新 – *** 作系统可以在其允许的内存页面表映射的内存部分中执行它喜欢的 *** 作如果VM走出允许的部分,VMM将把它捕获为“VMM页表错误”.这当然会使整个事情变得更有效率.

我希望这是有道理的.

总结

以上是内存溢出为你收集整理的linux – x86平台中的KVM影子页表处理全部内容,希望文章能够帮你解决linux – x86平台中的KVM影子页表处理所遇到的程序开发问题。

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

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

原文地址: http://www.outofmemory.cn/yw/1025082.html

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

发表评论

登录后才能评论

评论列表(0条)

保存