【发布时间】:2015-12-28 10:36:20
【问题描述】:
是否可以直接从 Linux 用户空间进程使用 Haswell CPU 特性 PEBS(基于事件的精确采样)而不是使用内核接口?
我已经成功地使用 RDPMC 指令从用户空间访问性能计数器,并且只使用内核进行 WRMSR。这让我很开心。
现在我也想访问 PEBS。为此,我需要使用 MSR IA32_DS_AREA 来提供“调试存储”内存区域。但是,我不确定如何分配这个内存以及我需要使用什么地址。我可以分配 2MB 的连续物理内存(带有 mlock() 的 Linux HugeTLB)。我还可以解析这个内存的物理地址(通过 procfs)。但是,我不确定虚拟地址或物理地址是否适合作为为 MSR 提供的“线性地址”。 (我担心该地址可能必须位于我无权访问的内核虚拟地址空间中。)
如何在不编写自定义内核模块的情况下为 IA32_DS_AREA 准备合适的内存并记录 PEBS 事件?
【问题讨论】:
-
我希望线性地址是指进程地址空间中的虚拟地址。这是可能,但它不太可能需要物理地址,内核虚拟地址极不可能与此有关。我认为Agner Fog 有一些代码可以在您的程序中使用性能计数器,打开/关闭采样以仅获取您想要分析的计数。
-
有趣。一方面,CPU 根据有效的页表解析虚拟地址听起来非常方便。另一方面,这可能是致命的:WRMSR 仅适用于 ring0,我通过内核模块 (/dev/cpu/
/msr) 访问它。因此,WRMSR 指令可能会在内核上下文中执行,并且我在 msr.c 中看不到任何巧妙的代码来强制使用用户空间内存映射。如果是这种情况,那么如果我可以依赖映射到内核中已知位置的物理地址,那么也许物理地址可以拯救我? -
只是从github线程复制:PEBS代码不是我的;请联系巴里朗特里。他在 PEBS 上做了一些工作。我们库中的 MSR 写入通过 msr 内核模块通过 /dev/cpu/*/msr 处理。
-
嗯,我最初误读了您的问题。内核虚拟地址可能是相关的。我没有注意到您必须在内核模式下使用 WRMSR。我只通过
perf命令(不是setuid root)使用了性能计数器,之前是oprofile。无论如何,Linux 确实已经有一个性能计数器子系统。 您是否考虑过仅使用perf使用的内核 API? 我认为有一个库可以用于编写以自定义方式分析自身(或其他进程)的程序。我很确定perf中的一些计数器是 PEBS。
标签: linux linux-kernel x86-64