내 목표는 ARMv8 레지스터를 사용하여 CPU 사이클을 읽는 것이고, kmod와 내 테스트 프로그램은 내 ARM 노트북에서 제대로 실행됩니다. 그러나 db410c 보드에 kmod를 로드한 후 pmccntr_el0
바이너리 파일 액세스를 수행할 때 잘못된 명령을 받았습니다.
누구든지 이유를 이해하도록 도와줄 수 있나요? PMUSERENR_EL0_EN
비트를 통해 사용자 모드 액세스를 활성화했기 때문입니다 .
테스트 프로그램의 샘플 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdint.h>
static inline uint64_t
read_pmccntr(void)
{
uint64_t val;
asm volatile("mrs %0, pmccntr_el0" : "=r"(val));
return val;
}
int main(){
uint64_t counter = read_pmccntr();
printf("value:%lu\n",counter);
return 0;
}
운영 체제 버전:
- 노트북: 리눅스 debian-gnu-linux-10 4.19.0-18-arm64
- db410c: 리눅스 linaro-developer 5.15.0-stm-qcomlt-arm64
답변1
db410c는 이 명령을 지원합니까?
게다가 64비트를 사용하고 계시나요? pmccntr_el0은 32비트에서 지원되지 않는 것 같습니다.
다음 코드를 사용하여 db410c가 이 명령을 지원하지 않는 것이 문제인지 확인할 수 있습니다. (다음 코드는 32비트용입니다):
unsigned int cc;
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc));
return cc;
여기에서 성능을 모니터링하는 더 많은 방법을 찾을 수 있습니다. http://wiki.dreamrunner.org/public_html/Embedded-System/Cortex-A8/PerformanceMonitorControlRegister.html
또한 컴파일 타임에 -O3 플래그를 추가하면 성능 결과가 크게 달라집니다.
답변2
이유를 알아내려면 사용자 모드 액세스 비트를 올바르게 활성화해야 합니다.