PCIデバイスのメモリ領域を読み取ろうとしています。 (私が探しているものがデバイスからのオフセットであることを知っています。)まず、PCIデバイスメモリがマップされたシステムメモリアドレスを取得しようとしています。そのために私はこうするlspci-vvv私は得る:
00:1a.8 Memory controller
Subsystem: Dell Device
Flags: bus master, fast devsel, latency 64, IRQ 139
Memory at 601d198000 (64-bit, non-prefetchable) [size=16K]
Memory at 601d000000 (64-bit, non-prefetchable) [size=1M]
Capabilities: <access denied>
Kernel driver in use: nvm-mem-drv
これまではとてもよかったです。今ddの助けを借りて、そのメモリに何があるのかを確認しようとしています。
dd if=/dev/mem iflag=skip_bytes skip=412803399680 bs=512 count=1 | hexdump -C
驚くべきことに、私が得るものは次のとおりです。
dd: '/dev/mem' の読み込み中にエラーが発生しました。無効な住所0+0レコード入力0+0レコード出力コピー0バイト、9,3556e-05秒、0,0kB/s
この方法が他のプラットフォームでも効果があったので、「驚くべきことに」この方法を設定しました。
今質問はなぜDD住所が間違っていますか?最初に目立つのは、このプラットフォームのアドレスが他のプラットフォームのアドレスよりも長いことです(正確に2桁)。だから私はおそらく私が何を経験しているのかと思いました。飛び越えるオーバーフロー - 512チャンクに「スキップ」を指定して問題を解決しようとしましたが、そのメソッドも返されます。無効な住所。だから私はここで少し迷子になりました。 lspciが私をだましているのでしょうか、それとも何が起こっていますか? :|
PS:また、カーネルCONFIG_STRICT_DEVMEMが設定されていないことを確認しました。他の住所はよく読むことができます。