【问题标题】:ARMv7 instructions to access performance counters directly from assembly language直接从汇编语言访问性能计数器的 ARMv7 指令
【发布时间】:2020-10-31 11:53:45
【问题描述】:

我想收集性能计数器信息,例如来自 ARMv7 处理器的分支错误预测。我正在做一个项目,我需要能够计算错误预测 但是我正在使用的设备(我的 Chromebook)没有正确的 Linux 内核来使用“perf”实用程序。我无法在这台旧机器上安装支持 perf 的 Linux。本来可以支持的项目似乎在 Internet 上不可用,因为它们太旧了。我知道有一种方法可以使用 ARMv7 指令直接从汇编语言中访问性能计数器,但我不知道该怎么做。

【问题讨论】:

  • 使用正确的 mrs/msr 指令是个问题。也就是说,操作系统也可能会阻止这一点,所以要小心。
  • 您的确切 chromebook 型号及其 CPU 是什么?你的linux内核版本是多少?必须在内核中阻止 PMU 访问,并且您必须加载自己的内核模块或重新编译 linux 内核(或找到启用 perf 的预编译内核)才能在您的机器上使用 PMU。您还应该检查 oprofile,并且可能更容易购买一些小型 SBC,如 raspberry pi 3 或 4,以便使用流行的兼容 debian/ubuntu 的 ARM 板来进行硬件性能实验和计数(或购买远程/云访问一些手臂机器,更好的裸机)。

标签: arm performancecounter perf armv7 chromebook


【解决方案1】:

有一些直接在 ARM 上使用 PMU 性能计数器的示例,例如

armv7:http://neocontra.blogspot.com/2013/05/user-mode-performance-counters-for.html

armv8:http://zhiyisun.github.io/2016/03/02/How-to-Use-Performance-Monitor-Unit-(PMU)-of-64-bit-ARMv8-A-in-Linux.html

所以首先要做的是创建一个内核模块来启用对 PMU 计数器的用户模式访问。下面是设置 PMU 寄存器 PMUSERENR_EL0 以启用用户模式访问的代码。

/*Enable user-mode access to counters. */
asm volatile("msr pmuserenr_el0, %0" : : "r"((u64)ARMV8_PMUSERENR_EN_EL0|ARMV8_PMUSERENR_ER|ARMV8_PMUSERENR_CR));

/*   Performance Monitors Count Enable Set register bit 30:0 disable, 31 enable. Can also enable other event counters here. */ 
asm volatile("msr pmcntenset_el0, %0" : : "r" (ARMV8_PMCNTENSET_EL0_ENABLE));

/* Enable counters */
u64 val=0;
asm volatile("mrs %0, pmcr_el0" : "=r" (val));
asm volatile("msr pmcr_el0, %0" : : "r" (val|ARMV8_PMCR_E));

但是性能计数器是系统的特权部分,默认情况下它们只能从内核模式访问。您不能只在用户空间代码中使用汇编指令来使用它们,您将得到的唯一结果是 SIGSEGV 或其他权限变体被拒绝。要启用从用户空间的访问,一些工作应该在内核模式下完成。它可以是任何现有的 PMU 驱动程序:perf 或 oprofile(旧的 pmu 访问工具),或者它可以是一些自定义内核模块,它将启用用户空间对 PMU 寄存器的访问。但是要编译您的模块,您仍然需要为您的内核提供大部分内核开发基础设施(我希望标准 chromebook 内核没有内核,包括 "kbuild" 来进行模块构建,并且该内核可能不接受标准配置中的未签名模块)。

你能做什么:

  • 使用另一台机器,比过时的 chromebook 更新。您的项目可能有一些机器处于远程访问状态,您可以尝试购买一些小型且流行的带有 linux 的 ARM 单板计算机(如树莓派 3/4)。那个流行的板子将有更新的 arm cpu 核心,它会有 ubuntu 或 debian
  • 检查 oprofile 子系统,它可能在您的内核中启用。 Oprofile tools 比 perf 更老,但也可以访问 PMU 计数器。
  • 在启用 perf_events 子系统的情况下重新编译 linux 内核。您只需要在您的 chromebook 上启动的正确内核,以及任何编译器即可从 https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/ 重建 perf out-of-tree(使用任何版本的 perf)。或者直接使用perf_event_open syscall
  • 检查/lib/modules/`uname -r`/build 目录。如果存在,您可以尝试构建自定义内核模块以启用用户空间直接访问

pmcr_el0 和其他 PMU 寄存器上的 TRM:https://developer.arm.com/documentation/100442/0100/debug-registers/aarch64-pmu-registers/pmcr-el0--performance-monitors-control-register--el0https://developer.arm.com/docs/ddi0595/h/aarch64-system-registers/pmcr_el0https://developer.arm.com/docs/ddi0595/h/aarch32-system-registers/pmccntrhttps://developer.arm.com/documentation/ddi0535/c/performance-monitoring-unit 和一些概述https://people.inf.ethz.ch/markusp/teaching/263-2300-ETH-spring14/slides/08-perfcounters.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多