Emulation 虚拟机监控程序:跨不同虚拟化技术的特殊功能缺失

Emulation 虚拟机监控程序:跨不同虚拟化技术的特殊功能缺失,emulation,trace,hypervisor,assembly-trap,Emulation,Trace,Hypervisor,Assembly Trap,在使用Intel的VMX和ARM的virt扩展时,我注意到在实现虚拟机监控程序时缺少非常有用的功能 在虚拟机监控程序的工作过程中,通常需要捕获来宾行为,但仅用于跟踪目的(也就是说,来宾可以正常执行指令,但我们需要先做一些事情,例如日志记录) 更准确地说,以下面的示例为例:在我不久前实现的Intel虚拟机监控程序上(以Windows 7为来宾),每当修改Windows内核结构时,我都需要记录日志。为此,我找到了内核结构的物理地址,并删除了来宾对相应EPT页面的写入权限。因此,每当客户机试图写入(修

在使用Intel的VMX和ARM的virt扩展时,我注意到在实现虚拟机监控程序时缺少非常有用的功能

在虚拟机监控程序的工作过程中,通常需要捕获来宾行为,但仅用于跟踪目的(也就是说,来宾可以正常执行指令,但我们需要先做一些事情,例如日志记录)

更准确地说,以下面的示例为例:在我不久前实现的Intel虚拟机监控程序上(以Windows 7为来宾),每当修改Windows内核结构时,我都需要记录日志。为此,我找到了内核结构的物理地址,并删除了来宾对相应EPT页面的写入权限。因此,每当客户机试图写入(修改)结构时,就会发生EPT冲突,从而导致系统管理程序陷阱

在每次违反EPT时,我都会采取以下策略之一:

战略1:

  • 激活监视器陷阱标志
  • 临时授予来宾写入区域的权限(EPT修改)
  • VMRESUME=>由于MTF被激活,来宾将立即执行指令并退出
  • 在接下来的VMEXIT中,我将停用MTF,并再次禁止来宾写入结构(=EPT修改+无效)VMRESUME
战略2:

  • 模拟要编写结构的指令。这意味着要编写一个仿真器(>反汇编程序)
如您所见,即使没有多处理意识,这两种策略也有点复杂。关于策略1,如果要在多个处理器上虚拟化Windows,我们还必须向其他内核发送IPI,以便在处理EPT冲突时暂停它们。另外,这是一个特定的
示例,它意味着一个特定的策略。跟踪的另一个例子可能是在调用内核函数时记录和/或修改内核函数的参数。在这种情况下,我们可能需要一种不同的策略

我想是时候开门见山了。我的困境如下。每当我们需要跟踪来宾行为时,一种避免复杂编程策略的简单方法是虚拟化技术提供了动态选择指令陷阱是在执行之前还是之后发生的可能性。

甚至在编写我的第一个虚拟机监控程序(在Intel上)之前,我几乎肯定VMX会为我提供这样的功能。我的想法告诉我,这将是任何平台上的任何虚拟化技术都能提供的一个明显的功能,因此当我发现它实际上不是时,我感到惊讶(并有点沮丧):不在Intel上,不在ARM上(正如我最近发现的那样),而且很可能不在其他平台上<因此,我的问题实际上是:为什么?为什么硬件虚拟化“设计者”不实现这样的功能?我确信之前已经考虑过了,因此对我来说唯一可能的答案似乎是硬件方面,这样的功能实现将非常困难,甚至不可能,虽然我不明白为什么会是这样。是这样吗

提前感谢您的回答:)

编辑

虽然我还没有说清楚,但我还想指出一个事实,在许多情况下,程序员想要捕获一些来宾行为,目的是改变其效果(因此意味着不仅仅是跟踪),但在这种情况下,这种功能仍然非常有用


以下面的例子为例。让我们假设我希望我的虚拟机监控程序控制来宾与内存映射设备的通信(甚至完全模拟一个——这是当今虚拟机监控程序的一个非常常见的要求)。大多数情况下,我们要做的是告诉客户,设备的内存映射到地址A,并且钩子向该地址写入/读取。当一条被捕获的指令试图对地址a处的区域进行r/w操作时,当前我们被迫对其进行反汇编和仿真。如果虚拟机监控程序为我们提供了让指令以临时r/w权限执行并在其之后立即捕获的可能性,那么模拟该指令将变得不必要,因为我们可以让它执行并“加载项”之后的预期效果。

您只能在指令之前进入陷阱,因为这是硬件提供的。从理论上讲,虚拟机可能会对虚拟机监控程序中的陷阱做出反应,并实际对此采取一些措施(在背后更改任何内存绑定参数),因此替代方法不是很有用

对不起,伙计,事情就是这样

几年后,我突然想到,如果您正在编写虚拟机监控程序,您可以单步执行指令,而不是模拟指令