Инструкции ARMv7 для доступа к счетчикам производительности непосредственно из языка ассемблера - PullRequest
0 голосов
/ 10 июля 2020

Я хочу собирать информацию счетчика производительности, например, неверные предсказания ветвлений от процессоров ARMv7. Я работаю над проектом, в котором мне нужно иметь возможность подсчитывать ошибочные прогнозы, но устройство, которое я использую (мой Chromebook), не имеет правильного ядра Linux для использования утилиты perf. Я не могу установить Linux с поддержкой perf на эту старую машину. Проекты, которые поддерживали это, похоже, недоступны на Inte rnet, так как они очень старые. Я знаю, что есть способ использовать инструкции ARMv7 для доступа к счетчикам производительности непосредственно с языка ассемблера, но я не уверен, как это сделать.

1 Ответ

1 голос
/ 14 июля 2020

Есть несколько примеров использования прямых счетчиков производительности PMU на ARM, например

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 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" для сборки модуля, и это ядро ​​может не принимать неподписанные модули в стандартная конфигурация).

Что вы можете сделать:

  • Используйте другую машину, что-то более свежее, чем ваш устаревший хромбук. У вашего проекта может быть удаленный доступ к некоторым машинам, вы можете попробовать купить небольшой и популярный одноплатный компьютер ARM с linux (например, raspberry pi 3/4). На этой популярной плате будет более новое ядро ​​процессора ARM, а также ubuntu или debian
  • Проверьте подсистему oprofile, она может быть включена в вашем ядре. Инструменты Oprofile старше, чем perf, но также могут обращаться к счетчикам PMU.
  • Перекомпилировать linux ядро ​​с включенной подсистемой perf_events. Вам нужно только правильное ядро, которое будет загружаться на вашем chromebook, и любой компилятор, чтобы перестроить perf вне дерева из https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/ (используйте любую версию perf). Или используйте perf_event_open syscall напрямую
  • Проверьте каталог /lib/modules/`uname -r`/build. Если он существует, вы можете попытаться создать собственный модуль ядра, чтобы включить прямой доступ к пользовательскому пространству

TRM для pmcr_el0 и других регистров PMU: https://developer.arm.com/documentation/100442/0100/debug-registers/aarch64-pmu-registers/pmcr-el0--performance-monitors-control-register--el0 https://developer.arm.com/docs/ddi0595/h/aarch64-system-registers/pmcr_el0 https://developer.arm.com/docs/ddi0595/h/aarch32-system-registers/pmccntr https://developer.arm.com/documentation/ddi0535/c/performance-monitoring-unit и некоторый обзор https://people.inf.ethz.ch/markusp/teaching/263-2300-ETH-spring14/slides/08-perfcounters.pdf

...