カーネルモジュールでメモリへのアクセスを許可する方法は? [閉鎖]

カーネルモジュールでメモリへのアクセスを許可する方法は? [閉鎖]

特定のアドレス(0x43C00000など)から読み書きできるメモリマップされた周辺機器があるとします。ペリフェラルと通信するために、Linuxオペレーティングシステムの同じメモリ位置からデータを読み取ることができるようにしたいです。問題のアドレスは物理アドレスであるため、そのアドレスの場所から読み取れるカーネルモジュールを作成できる必要があります。

カーネルに次のようなものがある場合

#define BASE_ADDR   0x43C00000
#define OFFSET      4

    int     * mem_addr;

    mem_addr = BASEADDR + OFFSET;

私の考えでは、これは周辺機器の2番目の書き込みブロック(0x43C00004)へのポインタを提供する必要があると思います。印刷

    printk(KERN_INFO "%p\n", mem_addr) 

これが正しいと言うようです。

今私が次のことをしようとすると

    printk(KERN_INFO "%d\n", *mem_addr);

私は周辺機器がメモリに書き込んでいるデータを読み、私が望むことを達成しなければならないと思いました。ただし、そのような文をモジュールに入れようとすると、Linuxはその文を終了します。私の/var/log/messagesを見ると、次のようになります。

Oops: 0000 [#1] SMP
Modules linked in; TEST_MOD(0+) ...

以下は、レジスタの状態に関する情報です。だから明らかに私はこのようにメモリを読み取ることはできません。カーネルモジュールにメモリ読み取り権限を付与する方法はありますか?

ベストアンサー1

その場所にカーネル仮想アドレスマッピングを設定する必要があります。

mem_addr = ioremap_nocache(BASEADDR + OFFSET, SIZE);

(同じ質問を2回やったようです。ここにリンクの説明を入力してください)。

おすすめ記事