2

GDB 等调试功能通过设置 eflags 寄存器的 TF 标志来工作,这会在处理器每次执行指令后导致异常。当我们运行虚拟机时,如果 kvm 做同样的事情,您需要设置一个名为 MONITOR TRAP FLAG 的标志(当前英特尔软件手册 3c 的第 15 页),这将导致虚拟机退出(VMEXIT)在每条指令向管理程序提供调试之后。

我面临一个问题,我需要设置 BTF(分支陷阱标志)(PG 689 vOLUME 3a INTEL 软件手册)。在正常情况下,这会在每个分支指令上导致 DEBUG EXCEPTION,但由于我想在 VM 上执行此操作,因此我无法确定要在 VMCS 中设置哪个位。在单步的情况下,似乎没有直接的方法可以做到这一点。谁能让我知道是否有某种方法可以使用其他方式做同样的事情?

4

1 回答 1

1

BTF 标志不在 VMCS 中;它在 IA32_DEBUGCTL MSR 中。您需要通过在 VM 条目之前执行 wrmsr 来明确设置它。对于 KVM,您可以在 vmx_vcpu_run 中添加它。

为了使所有调试异常都退出 VM,请在 VMCS 中设置异常位图的位 1。导致 VM 退出的调试异常信息保存在 VMCS 的退出条件字段中。然后管理程序可以自己处理调试异常或将其注入来宾。

于 2018-01-09T20:12:01.413 回答