2016-09-23 24 views
2

我正在使用最新的Ubuntu Linux和自定义内核(4.2.0-36-generic),其中我禁用了CONFIG_STRICT_DEVNEM,因为我需要转储并搜索内存中的某些术语在一个项目中。访问/ dev/mem会冻结Ubuntu

但是,当使用dd if=/dev/mem在屏幕上打印它时,dd if=/dev/mem of=/home/user/Documents/file.dump将其保存为文件或dd if=/dev/mem | hexdump -C | grep 'term'直接找到我要查找的内容,系统冻结并在此过程中重新引导。

我检查了df -h,我的光盘有足够的可用空间。此外,在写入2.1Gb至2.5Gb之后,在8Gb RAM之外并且到达以4开始的地址(如果这些有所不同)之前,进程总是停止。另外,检查/var/log/syslog/var/log/kern.log在冻结前没有显示任何相关信息。

此外,使用参数bs=1G count=2成功复制存储的第一2GB但随后试图bs=1G count=2 skip=2让未来再2GB再次冻结的系统。

你会提出任何解决方案,因此可以转储完整内存或其他方式直接在内存中搜索条件吗?

+0

[在unix.stackexchange.com上检查此网址](http://unix.stackexchange.com/a/119776/25786)。我认为'fmem'部分将成为 – ppeterka

+0

@ppeterka立即尝试。谢谢 –

+0

并行运行'tail -f/var/log/kern.log'和'tail -f/var/log/messages'来查看崩溃之前内核是否输出消息。然后,在重新启动后查看这些文件。另外,[更改内核的调试级别](https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks),以便更容易地查看问题所在。考虑在http://unix.stackexchange.com/或http://askubuntu.com/上提问。 –

回答

0

正如ilkkachu在unix.stackexchange.com上回答的那样,我试图访问PCI/ACPI或某些此类硬件所使用的内存区域。因此我只需要访问“安全”内存区域。

到目前为止,我可以放心地访问(usable)领域上/var/log/kern.log如图所示:

[ 0.000000] BIOS-e820: [mem 0x0000000020200000-0x000000003fffffff] usable 
[ 0.000000] BIOS-e820: [mem 0x0000000040000000-0x00000000401fffff] reserved 
[ 0.000000] BIOS-e820: [mem 0x0000000040200000-0x00000000c97e8fff] usable 
[ 0.000000] BIOS-e820: [mem 0x00000000c97e9000-0x00000000c9e81fff] reserved 
[ 0.000000] BIOS-e820: [mem 0x00000000c9e82000-0x00000000ca101fff] ACPI NVS 
[ 0.000000] BIOS-e820: [mem 0x00000000ca102000-0x00000000ca106fff] ACPI data 
[ 0.000000] BIOS-e820: [mem 0x00000000ca107000-0x00000000ca149fff] ACPI NVS 
[ 0.000000] BIOS-e820: [mem 0x00000000ca14a000-0x00000000cabb4fff] usable 
[ 0.000000] BIOS-e820: [mem 0x00000000cabb5000-0x00000000caff1fff] reserved 
[ 0.000000] BIOS-e820: [mem 0x00000000caff2000-0x00000000caffffff] usable 

这些区域也可以作为 “系统内存” 的/proc/iomem中找到:

$ grep "System RAM" /proc/iomem 
00001000-0009d7ff : System RAM 
00100000-1fffffff : System RAM 
20200000-3fffffff : System RAM 
40200000-c97e8fff : System RAM 

因此,我能够通过dd这些安全的存储区域执行多个命令,例如(对于20200000-3fffffff):

dd if=/dev/mem of=Filename bs=230467520 count=1 skip=1 ibs=1075838980 

(请注意,ibs比内存区域的起始位置高几位,并且bs比它的大小要小一些,因为正好获得所有“安全”区域,导致系统再次崩溃。)

UPDATE:

更新:我可以肯定地设置为 “系统内存”, “RAM缓存” 和 “保留” dd内存区域。

+0

你使用的'dd'参数有点奇怪。对于第一个我会使用'dd if =/dev/mem of = Filename bs = 4096 count = 8224 skip = 8224'(bs = 0x1000,skip is 0x2020 and count is 0x4000-0x2020。4000 is 0x3fff + 1) –

+0

正确。使用'bs = 1024 ibs = 1024'并通过将地址除以该数来找到计数,我可以得到我所需要的。 –