You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何将DMA区域的数据写入文件?(基于Petalinux Yocto内核)

可行,以下是几种实现方案

1. 用devmem命令临时读取(调试场景)

devmem是Linux自带的物理内存读写工具,前提是你要知道预留内存的物理起始地址和大小:

  • 先从/proc/iomem里找到reserved-memory对应的地址范围,或者直接查看设备树源码里的reserved-memory节点配置
  • 读取指定长度的数据到文件:
    devmem <物理起始地址> w | head -n <总字数> > output.bin
    
    也可以结合dd和/dev/mem(注意:默认内核可能限制/dev/mem访问,需启动时添加mem=xxx参数,或在Petalinux内核配置里关闭CONFIG_STRICT_DEVMEM):
    dd if=/dev/mem of=output.bin bs=<块大小> count=<块数> skip=<起始地址偏移/块大小>
    

2. 编写字符驱动(生产环境推荐)

如果需要稳定、高频读取这块内存,建议写一个简单的字符驱动:

  • 驱动中通过ioremap()将预留物理内存映射到内核虚拟地址
  • 实现read()函数,把映射区域的数据拷贝到用户空间
  • 驱动加载后,用户态直接通过设备节点读取数据到文件:
    cat /dev/reserved_mem_dev > output.bin
    
    Petalinux里可将该驱动做成内核模块或内置进内核,配合设备树的reserved-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:02