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

Arn*_*ita 2 linux virtualization trace kvm perf

我试图在主机上使用 Intel-PT,而我在来宾计算机中运行通用软件程序。所以我期望在主机中运行的 Intel-PT 将记录所有相关的数据包(如 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 报告读取使用以下命令生成的文件 -

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

它返回“未找到样本”。这意味着 Intel-PT 未能记录任何样本。

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

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

编辑:我使用的是Linux 内核 4.11.3,具有 Ubuntu 17.04和支持 Intel-PT 的 Broadwell CPU。

Arn*_*ita 5

由于我现在清楚为什么 Intel-PT 不能与 QEMU-KVM 一起工作,我将发布一个答案。

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

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

要执行此活动,至少需要有一个Skylake处理器。我使用的是Broadwell系统,但现在看来,它不起作用。