在不使用第三方(或第一方)列表的情况下,没有解决方案可以从内核(使用任何系统调用,如 perf_event_open(2))获取完整的原始事件列表。Perf 工具使用从/sys/bus/event_source/devices/cpu/events
类似 sysfs 文件夹中扫描的一些基本事件,但它有自己的 cpu 模型特定事件列表:https ://elixir.bootlin.com/linux/v5.5.19/source/tools/perf/pmu-events ,并且有自述文件指出 perf 使用jevents(perf 有 8 MB 的 x86 json 事件列表,位于tools/perf/pmu-events/arch/x86)
此目录的内容允许用户通过其符号名称而不是原始事件代码指定其 CPU 中的 PMU 事件(参见下面的示例)。此目录中的主程序是“jevents”,它在 perf 二进制文件本身构建之前构建和执行。“jevents”程序尝试在目录树 tools/perf/pmu-events/arch/foo 中定位和处理 JSON 文件。
您可以从https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/下载 perf 源并使用一些源代码导航工具来检查 cmd_list 函数 builtin-list.c 文件(带有一些未记录的选项)。您还可以从这些来源构建 perf 工具,并且在 perf 构建的早期会编译 jevents ( HOSTCC pmu-events/jevents.o
, )。LINK pmu-events/jevents
当前的 cpu 模型是从表 pmu_events_map (pmu-events/pmu-events.c) 中检测到的 perf_pmu__find_map (util/pmu.c) 从 pmu_add_cpu_aliases 调用,从 pmu_lookup 调用,从 perf_pmu__find,从 perf_pmu__scan 从 print_pmu_events 从 cmd_list(perf list
内置命令的处理程序)。
从5.5 版本的 perf(从 linux 内核 5.5 开始,因为 perf 是 linux 内核的一部分),没有事件列表的原始转储和描述。有一个未记录的选项perf list --raw-dump
将打印每个可用监控单元的所有事件列表,例如pmu
:perf list --raw-dump pmu |tr ' ' '\n'
。此原始转储的输出在 perf 版本之间不稳定。
perf_events 子系统的内核部分在arch/x86/events或kernel/events文件夹中没有完整的事件列表,只有标准 perf 事件(在 sysfs 中列出)如周期或 cpu/branch-misses/ 到特定 cpu 模型的原始事件的映射。