本文约2200字,今天在做爱芯元智AX615方案的系统移植相关的工作,更换了一块demo板,内存从之前的256M降到了128M,但是原来的程序居然可以直接适配,于是我去梳理了sdk的内存布局策略,这样好评估后续移植到我们的开发环境中是否需要对内存不同的硬件做区分处理以及快速排查后期开发中遇到的内存相关问题。以前的芯片方案中,不同容量的Flash和DDR在uboot、kernel等程序上是要做区分处理的。评估下来,发现爱芯这套内存布局策略的扩展性挺不错的,值得学习和借鉴。
我建了一个BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。
关注公众号, 即可获得与Linux相关的电子书籍(含《ARM 嵌入式系统基础教程》)以及常用开发工具,文末有文档清单。
声明:本文基于爱芯元智SDK 文档与编译脚本进行技术原理分析,仅用于学习与工程参考,不代表官方立场,不包含任何保密信息。
AX615平台内存布局的设计逻辑、分区规则、冲突点与优化思路,适合做移植、调参、内存问题定位参考。
一 整体定位:小容量 DDR 下的 “双区隔离” 架构
[1].AX615 典型配置:128MB / 256MB 片内 DDR,面向 IPC / 低功耗视觉场景。SDK 采用一刀切硬分割:
[2].Linux 系统区:通用内存、内核、驱动、APP、文件缓存
[3].CMM 连续物理内存区:专门给 VIDEO/ISP/NPU/VENC 等硬件模块使用
核心原则:视频硬件必须用连续物理内存,Linux 用虚拟内存,两者永不重叠。
二 DDR 物理布局全貌
0x4000_0000┌─────────────────────────────────────────────│ DDR_RETRAIN 4KB 训练参数├─────────────────────────────────────────────│ OS memory + Kernel ~32MB Linux 内核+可用内存├─────────────────────────────────────────────│ DTB 64KB 设备树├─────────────────────────────────────────────│ DTS Reserved 768KB sysdump/pstore/riscv/optee 预留│ ├─ SYSDUMP│ ├─ PSTORE│ ├─ RISCV (AOV)│ └─ OPTEE├─────────────────────────────────────────────│ OS memory ~28MB Linux 剩余可用├───────────────────────────────────────────── 0x4320_0000 (OS_MEM=50/60MB)│ CMM 78MB 视频/ISP/NPU 专用连续内存└───────────────────────────────────────────── 0x4800_0000 (128MB 顶)
关键规则:
[1].Linux 与 CMM 地址无缝衔接,无重叠、无空洞
[2].CMM 起始 = 0x40000000 + OS_MEM_SIZE
[3].DTS Reserved 嵌在 Linux 内部,不占 CMM
[4].128MB / 256MB 共用同一套布局偏移,只改总大小
三 编译脚本如何实现内存规划?
[1]. 总基址与大小
SYS_DRAM_BASE := 0x40000000SYS_DRAM_SIZE := 128 #MBSYS_DRAM_SIZE_L2 := 256 #MB
[2]. 最核心公式:自动切分 Linux / CMM
# 128MB 版本OS_MEM_SIZE := 60 #MBCMM_SIZE := SYS_DRAM_SIZE - OS_MEM_SIZECMM_START_ADDR := 0x40000000 + OS_MEM_SIZE
[3]. 启动参数自动生成
mem=60M cmmpool=anonymous,0,0x43200000,78Mmem=60M:告诉内核只认前 60MBcmmpool=:告诉 ax_sys.ko CMM 物理基址与大小
[4]. DTS 预留区固定布局
DTB: 0x41FF0000 64KBDTS Reserved: 0x42000000 768KB包含:sysdump、pstore、riscv、optee
四 内存规划的四层设计思路
[1].隔离性:硬件视频业务不干扰 Linux
VENC/ISP/IVPS/NPU 必须连续物理内存 + 不被置换 + 不碎片
CMM 完全脱离 Linux 内存管理,由 AXERA 私有的 CMM 内存池管理
[2].可移植性:128MB / 256MB 一套布局
偏移全部固定
只改:SYS_DRAM_SIZE + OS_MEM_SIZE + CMM_SIZE
DTB、reserved、optee、riscv 地址全部不变
[3].安全性:reserved-memory 保护敏感段
DTS 里的 reserved 段:
sysdump:异常现场保存
pstore:panic 日志
optee:安全区
riscv:AOV Always-On-Voice
内核不会申请、不会释放、不会映射这段内存。
[4].可调试性:自动输出 ddr_layout.txt
编译自动生成:
DDR Total(1): 0x40000000 -- 0x47FFFFFF (128MB)OS_MEM(1): 0x40000000 -- 0x431FFFFF (60MB)CMM(1): 0x43200000 -- 0x47FFFFFF (78MB)...
定位内存越界 / 踩脚必备。
五 Linux 内存内部结构
以 128MB DDR、OS_MEM=64MB 为例:
Linux 64MB├─ 不可见系统占用 8MB│ ├─ 内核代码/数据│ ├─ reserved-memory(DTS)│ └─ 固件段└─ 可见 MemTotal ~56MB├─ KO 驱动 ~8MB└─ APP 可用 ~46MB可优化点(官方明确给出)关闭 AOV → 节省 384KB关闭 syslogd/crond/telnet → 节省~600KB关闭 SD/USB/DHCP → 各节省 200–500KB关闭 Kernel symbol → 节省~700KB
六 CMM 内存:视频系统的 “专属内存池”
[1]. CMM 是什么?
Contiguous Memory Model
整块连续物理内存
不使用 Linux 页表、不交换、不碎片
分成:Partition → Pool → Block
[2]. 典型 CMM 用途
IFE/ISP 输入输出 FBC 帧
IVPS 缩放、裁剪、旋转
VENC 参考帧、码流 buffer
JENC
NPU 输入输出图
Audio 采集与播放 PCM 缓存
[3]. 最关键配置原则
分辨率越大、路数越多 → CMM 必须越大
七 最容易踩的内存坑
[1]. Linux 与 CMM 重叠 → 直接死机 / 重启
原因:OS_MEM_SIZE 算错 → CMM_START 错误检查:
cat /proc/cmdline | grep memcat /proc/ax_proc/mem_cmm_info
[2]. CMM 不足 → 黑屏、无法打开 VI/VENC
现象:AX_SYS_Malloc 失败、申请不到 block解决:
>>增大 CMM(减少 OS_MEM)
>>开启 VENC bRefRingbuf 节省一帧
>>开启 IVPS SW_LOW_MEM
[3]. Linux 内存不足 → APP 被 OOM 杀死
解决:
>>关闭无用服务
>>降低 min_free_kbytes
>>增大 OS_MEM(压缩 CMM)
[4]. DTB 地址被踩 → 内核起不来
DTB 固定在:0x41FF0000任何 bootloader 镜像加载不能覆盖此处。
当出现内存不足时,排查顺序如下:
[1].检查基础分配:cat /proc/meminfo确认MemTotal
[2].检查CMM使用:cat /proc/ax_proc/mem_cmm_info查看剩余
[3].检查Pool状态:cat /proc/ax_proc/pool观察FreeCnt
[4].检查水位线:cat /proc/zoneinfo确认内存压力
[5].检查碎片:cat /proc/buddyinfo评估碎片程度
八 总结:AX615 内存规划的核心思想
[1].硬分割:Linux 与 CMM 物理地址严格分开
[2].固定布局:128MB/256MB 一套偏移,便于移植
[3].专用预留:optee/riscv/sysdump 受保护,不被踩踏
[4].业务导向:视频吃CMM,系统吃Linux,按需调比例
[5].可观测:编译自动输出 ddr_layout.txt,问题定位极快
以上为全文内容。

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助