看起来
root@testbox:~# dd if=/dev/mem bs=1 count=4 skip=2149646336 | hd
应该几乎等于
root@testbox:~# devmem 2149646336 32
但是,虽然devmem
效果很好,但该dd
调用给我带来了段错误。对于许多其他 bs,skip 组合(在我尝试解决这个问题时偶然发现的) dd 成功返回,但数据与我期望的完全不同。所有这些都表明,当我使用 dd 时,我实际上并没有解决我认为我正在解决的问题。也许是一些内存映射问题?我是一个硬件专家,所以我只考虑物理地址。
一些血淋淋的细节:
我正在构建一个嵌入式系统,其中 Linux 运行在带有片上 ARM A53 内核的 Xilinx FPGA 上。我经常使用 devmem 来读取或写入 FPGA 逻辑中的内存映射寄存器。我想使用 dd 而不是 devmem 通过一个命令读取一长串地址,并将数据保存到文件或通过管道将其传输到另一个进程。
我的 FPGA 设计有一个内部 RAM 块,可读写,映射到字节地址0x80210000
。
我写了一个shell脚本,如下所示:
devmem 0x80210000 32 0x5AB000CD
devmem 0x80210004 32 0x5AB001CD
devmem 0x80210008 32 0x5AB002CD
devmem 0x8021000C 32 0x5AB003CD
... etc etc <250 more lines> ...
devmem 0x802103F8 32 0x5AB0FECD
devmem 0x802103FC …
Run Code Online (Sandbox Code Playgroud)