私は最新の Ubuntu Linux をカスタム カーネル (4.2.0-36-generic) で使用していますが、プロジェクト中にメモリ内のいくつかの用語をダンプして検索する必要があるため、 を無効にしていますCONFIG_STRICT_DEVNEM
。
ただし、次の場合:
dd if=/dev/mem
画面に印刷するには、dd if=/dev/mem of=/home/user/Documents/file.dump
ファイルとして保存するか、dd if=/dev/mem | hexdump -C | grep 'term'
探しているものを直接見つけるために、
処理中にシステムがフリーズし、再起動します。
をチェックしたところdf -h
、ディスクには十分な空き容量があります。また、プロセスは常に、8Gb RAM から 2.1Gb ~ 2.5Gb を書き込んだ後、4 で始まるアドレスに到達する前に停止します (これらが何らかの違いをもたらす場合)。さらに、 をチェックする/var/log/syslog
と、/var/log/kern.log
フリーズする前に関連するものは何も表示されません。
また、パラメータを使用すると、bs=1G count=2
メモリの最初の 2 GB は正常にコピーされますが、bs=1G count=2 skip=2
次の 2 GB を再度取得しようとすると、システムがフリーズします。
メモリ全体をダンプしたり、メモリ内の用語を直接検索したりできるような解決策を提案していただけますか?
答え1
PCI/ACPI などのハードウェアによって使用されるメモリ領域に遭遇する可能性があると思います。アクセスされたくないメモリ マップ デバイスがある可能性があります。どのアドレスが問題の原因になっているのか正確にはわかりませんが、4 GB 制限のすぐ下に特別な領域が配置されているのが普通です。
4 GB のメモリを搭載したマシンでは、カーネルは起動時に次のように出力します。
BIOS-e820: 0000000000000000 - 000000000009e400 (usable)
BIOS-e820: 000000000009e400 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 00000000cf690000 (usable)
BIOS-e820: 00000000cf690000 - 00000000cf6e0000 (reserved)
BIOS-e820: 00000000cf6e0000 - 00000000cf6e3000 (ACPI NVS)
BIOS-e820: 00000000cf6e3000 - 00000000cf6f0000 (ACPI data)
BIOS-e820: 00000000cf6f0000 - 00000000cf700000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 0000000100000000 (reserved)
BIOS-e820: 0000000100000000 - 0000000130000000 (usable)
使用可能なメモリの一部が で 4 GB の制限を超えており、と の0x100000000
間には穴があるようです。0xcf700000
0xfec00000
「使用可能な」メモリに対応する領域も に表示され/proc/iomem
、「システム RAM」としてマークされています。(ファイルには、他のメモリ領域に関する情報も含まれています。) これらの領域から読み取る方が安全である可能性があります。
$ grep "System RAM" /proc/iomem
00001000-0009e3ff : System RAM
00100000-cf68ffff : System RAM
100000000-12fffffff : System RAM