pmccntr_el0을 읽는 동안 사용자 공간 프로그램이 "불법 명령"을 받았습니다(사용자 모드 액세스 활성화됨).

pmccntr_el0을 읽는 동안 사용자 공간 프로그램이 "불법 명령"을 받았습니다(사용자 모드 액세스 활성화됨).

내 목표는 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

이유를 알아내려면 사용자 모드 액세스 비트를 올바르게 활성화해야 합니다.

관련 정보