これはおそらく、私の C 知識の欠如による問題ですが、誰かが可能な解決策を提供できることを願っています。一言で言えば、メモリに格納されている構造体を読み込もうとしていますが、その物理メモリ アドレスがあります。また、これは 64 ビット Linux システム (Debian (Wheezy) Kernel 3.6.6) で実行されており、言語として C を使用したいと考えています。
たとえば、問題の構造体の現在のアドレスは、物理アドレス: 0x3f5e16000 にあります。
ここで、最初に /dev/mem へのポインターを使用してこのアドレスにアクセスしようとしました。ただし、1024MB を超えるアドレスへのアクセスは許可されていないことを知り、var/log/messages にエラー メッセージが表示され、それに関するすべての情報が表示されます。現在、ユーザー空間アプリからのアクセスが試行されていますが、カーネル モジュールの作成が必要な場合は喜んで検討します。
興味深いことに、「kprobe」として知られるものも発見しました。これにより、1024MB を超える /dev/mem 制限を回避できるとされています。しかし、システムに潜在的なセキュリティの問題を持ち込むことは本当に望んでいません。これを達成するためのより簡単な方法があるに違いないと確信しています。kprobe に関する情報は、 http ://www.libcrack.so/2012/09/02/bypassing-devmem_is_allowed-with-kprobes/ にあります。
私はいくつかの読書を行い、mmapを使用して物理アドレスをユーザー空間にマップして読み取れるようにすることへの参照を見つけましたが、Cでのこれの実装を理解していないことを告白しなければなりません.
物理メモリへのアクセス、または物理アドレスからユーザー空間の仮想アドレスへのデータのマッピングに関する情報を誰かが提供できれば、非常に感謝しています。
私が何をしているのか正確に少し曖昧な場合は、私を許してください.私は鈍感でも何でもありません。
メモリ内の構造は、実行中のカーネル モジュールによってメモリに読み込まれる 4 つの int と 10 の long のブロックです。
私が使用しているアドレスは間違いなく物理アドレスであり、非ページに設定されています。カーネルモジュールは物理アドレスへの変換を実行し、アドレスの演算子は使用していません。
それが構造体の最初の要素であるため、物理的な場所からintを読み取る方法として質問を言い換えるべきかどうか疑問に思っています。それが物事を明確にするのに役立つことを願っています!
編集-さらに読んだ後、この問題の解決策の1つは、カーネルモジュールを構築し、mmap
関数を使用して物理アドレスをカーネルモジュールがアクセスできる仮想アドレスにマップすることです。誰でも mmap を使用してこれを達成するためのアドバイスを提供できますか?