使用英特尔的VMX和ARM的virt-extensions,我注意到缺少一个在实现虚拟机管理程序时非常有用的功能。
在虚拟机管理程序的工作中,通常需要捕获访客行为,但仅用于跟踪目的(即,指令可以由访客正常执行,但我们需要先做一些事情 - 例如记录)。
更准确地说,请看以下示例:在我之前实施的英特尔虚拟机管理程序上(以 Windows 7 作为来宾),每当Windows内核结构出现时,我需要记录正在修改。为了实现这一点,我找到了内核结构的物理地址,并且删除了相应EPT页面的访客写入权限。因此,每当客人试图编写(修改)结构时,都会发生 EPT违规,从而导致管理程序陷阱。
在每次违反EPT的情况下,我会继续以下策略之一 :
策略1:
策略2:
正如您所看到的,即使没有多处理意识,这两种策略也有点复杂。关于策略1 ,如果要在多个处理器上虚拟化Windows,我们还必须在处理EPT违规时将IPI发送到其他核心以暂停它们。此外,这是特定示例,这意味着特定策略。跟踪的另一个示例可以是例如在调用核心函数时记录和/或修改核函数的参数。在这种情况下,我们可能需要一个不同的策略。
我想是时候达到目的了。我的困境如下。每当我们需要跟踪访客行为时,一种简单的方法可以避免复杂的编程策略,虚拟化技术可以动态选择是否在执行或执行之前发生指令陷阱。 /强>
即使在编写我的第一个虚拟机管理程序(在英特尔上)之前,我几乎可以肯定VMX会为我提供这样的功能。我的想法告诉我,这将是任何平台上任何虚拟化技术提供的明显特征,所以当我发现它实际上并非如此时,我感到惊讶(并且有点沮丧):不在英特尔上,而不在ARM上(如我最近发现了)并且很可能不在其他平台上。 因此,我的问题实际上是:为什么?为什么硬件虚拟化“设计人员”没有实现这样的功能呢? 我确信以前已经考虑过了,因此对我来说唯一可能的答案似乎是硬件方面如此功能实现将非常困难甚至不可能,虽然我不明白为什么会这样。是这样吗?
提前感谢您的回答:)
修改
虽然我没有说清楚,但我还想指出这样一个事实,即程序员想要捕捉一些客人行为的几十个案例意图改变它的影响(因此暗示< em>不仅仅是追踪),但这种功能仍然非常有用。
以下面的例子为例。让我们假设我希望我的虚拟机管理程序通过内存映射设备控制来宾的通信(甚至完全模拟一个 - 这是当今虚拟机管理程序的一个非常常见的要求)。大多数时候我们要做的是我们会告诉客人该设备是在地址 A 和挂钩写入/读取该地址的内存映射。当被困指令尝试搜索地址 A 的区域时,目前我们强制执行反汇编并模拟它。如果管理程序为我们提供了让指令以临时r / w权限执行并在其后立即执行陷阱的可能性,则模拟指令将变得不必要,因为我们可以让它执行并“加载”之后所需的效果。
答案 0 :(得分:0)
您只会在执行说明之前陷入困境,因为这就是硬件所提供的。从理论上讲,VM可以对您在虚拟机管理程序中的陷阱做出反应,并对其进行实际处理(更改背后的任何内存绑定参数),因此替代方案不是很有用。
对不起,就是这样。