我尝试在主机上使用 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 是我从 guest 虚拟机复制到主机上的 kallsyms 和模块文件。
然后我将启动我的虚拟机。我将在访客计算机上运行一个程序。程序执行完成后,我将按Ctrl + C(SIGINT) 在我的主机中停止录制。
我发现一旦我尝试使用 perf 报告来读取使用以下命令生成的文件 -
./perf kvm report -i perf.data.kvm
它返回“未找到样本”。这意味着 Intel-PT 未能记录任何样本。
NOTE:我发现MSR中的值的位14MSR_IA32_VMX_MISC
对于我的处理器来说是 0。根据英特尔文档,对于要在 VMX 操作中使用 Intel-PT,该位应为 1。这是否会影响 Intel-PT 不记录任何样本的原因?
即使 VM 开启,INTEL-PT 也能工作吗?还是我记录数据的方法错误?
编辑:我正在使用Linux 内核 4.11.3,具有 Ubuntu 17.04以及支持 Intel-PT 的 Broadwell CPU。
既然我现在清楚为什么 Intel-PT 不能与 QEMU-KVM 一起工作,我将发布一个答案。
正如我在问题中提到的,这不起作用的主要原因是 MSR 中值的位 14MSR_IA32_VMX_MISC
对于我的处理器来说是 0。根据 Intel 文档,该位应为 1,以便 Intel-PT 用于VMX root操作(之间VMXON and VMXOFF).
主要问题是当上述位为0时,VMXON指令将设置TraceEn的组成部分IA32_RTIT_CTL
MSR 为 0。该组件控制跟踪操作,如果复位,则不会将跟踪数据写入缓冲区。该复位是在硬件级别控制的。
要执行此活动,需要有一个Skylake至少是处理器。我当时用的是布罗德韦尔系统,从现在看来,该系统将无法工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)