問題は、Linux が仮想アドレス空間でプログラムを実行することです。したがって、コードで直接使用するすべてのアドレス (0xdeadbeef など) は、メモリ管理ユニットによって物理アドレスに変換される仮想アドレスであり、必ずしも仮想アドレスと同じであるとは限りません。これにより、複数の独立したプロセスとページングなどの他のものを簡単に分離できます。
問題は、あなたの場合、物理アドレスが仮想アドレス 0xdeadbeef にマップされていないため、カーネルが実行を中止することです。
すでに見つけた呼び出し mmap は、カーネルに特定のファイルを (特定のオフセットから) プロセスの仮想アドレスに割り当てるように要求します。mmap の戻りアドレスは、まったく異なるアドレスになる可能性があることに注意してください。そのため、取得した仮想アドレスについて何も仮定しないでください。
したがって、メモリデバイスのオフセットが物理アドレスである mmap と /dev/mem の例があります。カーネルがプロセスの仮想アドレスに与えたオフセットからファイルを割り当てることができた後、直接アクセスであるかのようにメモリ領域にアクセスできます。
エリアが不要になったら、そのエリアをマンマップすることを忘れないでください。そうしないと、メモリ リークに似た問題が発生します。
/dev/mem メソッドの問題の 1 つは、プロセスを実行しているユーザーがこのデバイスにアクセスする必要があることです。これにより、セキュリティの問題が発生する可能性があります (たとえば、 Samsung は最近、ハンドヘルド デバイスにそのようなセキュリティ ホールを導入しました)。
より安全な方法は、私が見つけた記事 ( The Userspace I/O HOWTO ) で説明されている方法です。これは、ユーザーのプロセスがアクセスできるメモリ領域を引き続き制御できるためです。