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;
}

オペレーティングシステムのバージョン:

  • ノートブック: Linux debian-gnu-linux-10 4.19.0-18-arm64
  • db410c: Linux 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フラグを追加すると、パフォーマンスの結果が大きく異なります。

おすすめ記事