我在PowerPC板(big-endian)上运行嵌入式linux-3.10.29。要调试我的以太网控制器,我需要检查一些系统寄存器。 SoC系统寄存器位于地址0xe0000000
(3584M)。所以我在linux配置中禁用了CONFIG_STRICT_DEVMEM并运行:
$ dd if=/dev/mem of=/home/mem.dump bs=1024 count=1k skip=3584k
dd: /dev/mem: Bad address
此命令应跳过/dev/mem
的第一个(3584k * 1024B =)3584MB,并将前导(1k * 1024B =)1MB复制到/home/mem.dump
。我还尝试在整个1MB内转储各种4kB范围,导致同样的问题。
这个内存空间被我的内核广泛地映射。虽然我不太确定这是一个问题。
# cat /proc/iomem
00000000-0fffffff : System RAM
80000000-8fffffff : /pci@e0008500
80000000-8007ffff : 0000:00:10.0
90000000-9fffffff : /pci@e0008500
90000000-900003ff : 0000:00:10.0
90000000-900003ff : sata_sil
e0004500-e0004507 : serial
e0004600-e0004607 : serial
f8000000-ffffffff : physmap-flash.0
f8000000-ffffffff : physmap-flash.0
# cat /proc/vmallocinfo
0xd1000000-0xd1002000 8192 ipic_init+0x98/0x198 phys=e0000000 ioremap
0xd1004000-0xd1006000 8192 mpc83xx_restart_init+0x1c/0x38 phys=e0000000 ioremap
0xd1006000-0xd1008000 8192 serial_dev_init+0x118/0x168 phys=e0004000 ioremap
0xd1008000-0xd100a000 8192 serial_dev_init+0x118/0x168 phys=e0004000 ioremap
0xd100a000-0xd100c000 8192 of_iomap+0x30/0x54 phys=e0005000 ioremap
0xd100c000-0xd100e000 8192 pcim_iomap+0x5c/0x7c phys=90000000 ioremap
0xd100e000-0xd1010000 8192 of_fsl_spi_probe+0x394/0x574 phys=e0007000 ioremap
0xd1010000-0xd1012000 8192 of_iomap+0x30/0x54 phys=e0024000 ioremap
0xd1012000-0xd1014000 8192 of_iomap+0x30/0x54 phys=e0025000 ioremap
0xd1014000-0xd1016000 8192 of_iomap+0x30/0x54 phys=e0024000 ioremap
0xd1016000-0xd1018000 8192 of_iomap+0x30/0x54 phys=e0025000 ioremap
0xd1018000-0xd101a000 8192 of_iomap+0x30/0x54 phys=e0003000 ioremap
0xd101a000-0xd101c000 8192 of_iomap+0x30/0x54 phys=e0003000 ioremap
0xd1080000-0xd9081000 134221824 devm_ioremap+0x44/0x9c phys=f8000000 ioremap
我有一个名为mem_util
的替代方案,而@tangrs教我devmem
提供相同的功能。但bad address
的这个dd
问题是什么?
[编辑]
$ strace dd if=/dev/mem of=/home/mem.dump bs=1024 count=1k skip=3584k
[...]
_llseek(0, 3758096384, [3758096384], SEEK_CUR) = 0
read(0, 0x100b1008, 1024) = -1 EFAULT (Bad address)