ArmSoM 适用说明与来源
本文是 ArmSoM 适配前的平台参考,来源为中文 V1.0.0。原文范围:RK3588,Linux 5.10。没有英文 PDF;英文、俄文、德文均完整译自中文,德文复用英文文章的同一配图。尚未核实具体 ArmSoM 板卡、SDK/BSP 或驱动组合,未进行硬件验证。请核对实际 SoC、板卡内存布局、SDK/BSP、内核配置和驱动实现。代码、地址、日志及数据是原文示例,不是 ArmSoM 实测。
校对记录 · ArmSoM Docs · Rockchip Linux
本文介绍内存泄漏、数据流错误及内存映射失败的 DMA-BUF 调试手段。原稿无技术配图,不添加虚构原图。
| 原文芯片 | 原文内核 |
|---|---|
| RK3588 | Linux 5.10 |
1. 简介
DMABUF是多媒体设备之间共享内存的一种特定buffer结构,不同设备可以通过DMABUF的fd进行跨进程共享内存,实现零拷贝提高性能,支持异步访问降低模块耦合度。
2. DMABUF 调试Linux修改
2.1 DMABUF_DEBUG
Linux-5.10开始支持DMABUF debug,支持此功能需要修改arch/arm64/configs/rockchip_defconfig
CONFIG_DMABUF_DEBUG=y
打开该宏定义,每个DMABUF会默认设置name,以pid+taskname的形式,16个字符。如
416-allocator@4.
2.2 DMABUF_PROCFS
Linux-5.10开始支持DMABUF procfs,支持此功能需要修改arch/arm64/configs/rockchip_defconfig
CONFIG_RK_DMABUF_PROCFS=y
打开该宏定义,在/proc/节点下创建一个rk_dmabuf的子结点,该子节点支持多种调试节点,如
dev # 显示所有DMABUF已经attach的device
sgt # 显示所有DMABUF的ScatterListTable,显示其IOVA
size # 显示所有DMABUF的total size
peak # 显示所有DMABUF的total size的峰值
节点含义:dev 显示 attach 的设备;sgt 显示 ScatterListTable 及 IOVA;size 显示总大小;peak 显示总大小峰值。
2.3 DMABUF_DEBUG_ADVANCED
是DMABUF procfs的一个子功能,用于获取DMABUF的内存物理地址,支持此功能需要修改arch/arm64/configs/rockchip_defconfig
CONFIG_DMABUF_DEBUG_ADVANCED=y
打开该宏定义,所有DMABUF都会通过fake device去attach/map,从而获取到它的sgt,协助/proc/rk_dmabuf_sgt完整显示所有DMABUF的IOVA。
3. QA
3.1 RK3588 视频播放DMABUF内存泄漏?
打开调试宏,在进入主界面
console:/ # cat /proc/rk_dmabuf/size
Total: 65552 KiB
播放视频、退出播放、删除历史内容、回到主界面
console:/ # cat /proc/rk_dmabuf/size
Total: 83948 KiB
3.2 RK3588 视频播放DMABUF内存峰值?
通过mpp的调试节点,查看播放视频的DMABUF的总内存大小
console:/ # cat /proc/mpp_service/sessions-summary
fdc38100.rkvdec-core Total: 699760 KiB
通过DMABUF的调试节点,查看DMABUF峰值内存
console:/ # cat /proc/rk_dmabuf/peak
Peak: 1544 MiB
清零重新观察
console:/ # echo 0 > /proc/rk_dmabuf/peak
