Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
直接从汇编语言访问性能计数器的ARMv7指令_Arm_Performancecounter_Perf_Armv7_Chromebook - Fatal编程技术网

直接从汇编语言访问性能计数器的ARMv7指令

直接从汇编语言访问性能计数器的ARMv7指令,arm,performancecounter,perf,armv7,chromebook,Arm,Performancecounter,Perf,Armv7,Chromebook,我想从ARMv7处理器收集性能计数器信息,例如分支预测失误。我正在做一个项目,我需要能够计算预测失误 但是我正在使用的设备(我的Chromebook)没有合适的Linux内核来使用“perf”实用程序。我无法在这台旧机器上安装支持perf的Linux。本来可以支持的项目,由于太旧,在互联网上似乎不可用。我知道有一种方法可以使用ARMv7指令直接从汇编语言访问性能计数器,但我不知道该怎么做。例如,在ARM上有一些直接使用PMU性能计数器的示例 armv7: armv8: 因此,第一件事是创建一个内

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

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

armv7:

armv8:

因此,第一件事是创建一个内核模块,以允许用户模式访问PMU计数器。下面是设置PMU寄存器PMUSERENR_EL0以启用用户模式访问的代码

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

你能做什么:

  • 使用另一台机器,比你过时的chromebook更新。您的项目可能有一些远程访问的机器,您可以尝试购买一些小型且流行的带有linux的ARM单板计算机(如raspberry pi 3/4)。这个受欢迎的板将有更新的arm cpu内核,它将有ubuntu或debian
  • 检查oprofile子系统,它可能已在内核中启用。早于性能,但也可以访问PMU计数器
  • 在启用perf_事件子系统的情况下重新编译linux内核。您只需要在chromebook上启动的正确内核,以及从树中重建perf的任何编译器(使用任何版本的perf)。或者直接使用
    perf\u event\u open
    syscall
  • 检查
    /lib/modules/`uname-r`/build
    目录。如果存在,您可以尝试构建自定义内核模块,以启用用户空间直接访问

pmcr_el0和其他PMU寄存器上的TRM:以及一些概述

如果使用正确的mrs/msr指令,则是一个问题。也就是说,操作系统可能会阻止这一点,所以要小心。你的chromebook的确切型号和cpu是什么?你的linux内核版本是什么?必须在内核中阻止PMU访问,并且您必须加载自己的内核模块或重新编译linux内核(或使用perf enables查找预编译内核)才能在您的计算机上使用PMU。您还应该检查oprofile,可能购买一些小型SBC(如raspberry pi 3或4)会更容易,以便使用流行的debian/ubuntu兼容ARM板来进行硬件性能测试和计数(或者购买远程/云访问某些ARM机器,更好的裸机)。
/*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));