Linux下如何将DMA区域的数据写入文件?(基于Petalinux Yocto内核)
可行,以下是几种实现方案
1. 用devmem命令临时读取(调试场景)
devmem是Linux自带的物理内存读写工具,前提是你要知道预留内存的物理起始地址和大小:
- 先从
/proc/iomem里找到reserved-memory对应的地址范围,或者直接查看设备树源码里的reserved-memory节点配置 - 读取指定长度的数据到文件:
也可以结合devmem <物理起始地址> w | head -n <总字数> > output.bindd和/dev/mem(注意:默认内核可能限制/dev/mem访问,需启动时添加mem=xxx参数,或在Petalinux内核配置里关闭CONFIG_STRICT_DEVMEM):dd if=/dev/mem of=output.bin bs=<块大小> count=<块数> skip=<起始地址偏移/块大小>
2. 编写字符驱动(生产环境推荐)
如果需要稳定、高频读取这块内存,建议写一个简单的字符驱动:
- 驱动中通过
ioremap()将预留物理内存映射到内核虚拟地址 - 实现
read()函数,把映射区域的数据拷贝到用户空间 - 驱动加载后,用户态直接通过设备节点读取数据到文件:
Petalinux里可将该驱动做成内核模块或内置进内核,配合设备树的cat /dev/reserved_mem_dev > output.binreserved-memory节点完成资源绑定。
3. 用户态内存映射(自定义程序)
用户态程序可通过mmap()映射/dev/mem到用户空间,直接读取数据写入文件,示例伪代码:
int fd = open("/dev/mem", O_RDONLY); void *addr = mmap(NULL, 内存大小, PROT_READ, MAP_SHARED, fd, 物理起始地址); // 读取addr指向的内容并写入目标文件 munmap(addr, 内存大小); close(fd);
关于你尝试的/proc/device-tree/reserved-memory
这个路径下只是设备树的文本配置描述,并非实际的内存数据区域,所以复制这里的内容无效,你需要访问的是物理内存本身而非设备树配置信息。
内容的提问来源于stack exchange,提问作者Makuta
相关产品推荐
相关产品推荐

