我正在使用带有自定义内核(4.2.0-36-generic)的最新 Ubuntu Linux,其中我禁用了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
成功复制了前 2GB 内存,但随后尝试bs=1G count=2 skip=2
再次获取下一个 2GB 则会冻结系统。
您是否会建议任何解决方案,以便可以转储完整内存或其他方式直接在内存中搜索术语?
答案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