KVM-QEMU 开启时,Intel-PT 不记录任何数据包

Intel-PT does not record any packets when KVM-QEMU is on

我试图在主机上使用 Intel-PT,而我 运行 在来宾计算机上使用通用软件程序。所以我期望主机中的 Intel-PT 运行ning 将记录所有相关数据包(如 PIP、FUP、TSC 等)以及所有基于 VM 的数据包,如 VMCS。

我使用下面的命令 -

./perf kvm --host --guest --guestkallsyms=guest-kallsyms --guestmodules=guest-modules record -e intel_pt//

guest-kallsyms 和 guest-modules 是我从来宾复制到主机上的 kallsyms 和模块文件。

然后我将启动我的虚拟机。我将 运行 客户机上的一个程序。程序执行完成后,我将在主机中按 Ctrl + C (SIGINT) 停止录制。

我看到,一旦我尝试使用 perf report 来读取使用以下命令生成的文件 -

./perf kvm report -i perf.data.kvm

它returns "NO SAMPLES FOUND"。这意味着Intel-PT未能记录任何样本。

注意:我发现对于我的处理器,MSR MSR_IA32_VMX_MISC 中值的第 14 位是 0。根据 Intel 文档,对于要在 VMX 操作中使用的 Intel-PT,此位应​​为 1。这会以任何方式影响 Intel-PT 不记录任何样本的原因吗?

INTEL-PT 即使在 VM 开启时也能工作吗?还是我记录数据的方法不对?

编辑:我正在使用 Linux 内核 4.11.3,具有 Ubuntu 17.04 和 Broadwell CPU,它支持 Intel- PT.

既然我现在清楚了为什么 Intel-PT 不能与 QEMU-KVM 一起工作,我会post 一个答案。

正如我在问题中提到的,这不起作用的主要原因是 MSR MSR_IA32_VMX_MISC 中值的第 14 位对于我的处理器是 0。根据 Intel 文档,对于要在 VMX root 操作中使用的 Intel-PT(在 VMXON 和 [=20= 之间),该位应该为 1 ]VMXOFF).

主要问题是,当上述位为0时,VMXON指令会将IA32_RTIT_CTLMSR的TraceEn组件设置为0。该组件控制跟踪操作,如果重置,则不会将跟踪数据写入缓冲区。此重置在硬件级别进行控制。

要执行此 activity,至少需要 Skylake 处理器。我使用的是 Broadwell 系统,但现在看来,它无法正常工作。