linux – x86平台中的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系统中,设置ARP防火墙可以通过多种方法实现,包括使...
在Linux环境下,使用Jack2进行编译时,可以采取以下策略来提...
`getid`命令在Linux系统中用于获取当前进程的有效用户ID(EU...
在Linux环境下,codesign工具用于对代码进行签名,以确保其完...
Linux中的`tr`命令,其英文全称是“transform”,即转换的意...
Linux中的ARP防火墙是一种用于防止ARP欺骗攻击的安全措施,它...