2016-09-23 27 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'並通過將地址除以該數來找到計數,我可以得到我所需要的。 –