😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍海思芯片内存管理 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰: 2024-08-12 09:03:58
本文未经允许,不得转发!!!
目录
- 🎄一、概述
- ✨1.1 芯片内存地址范围
- 🎄二、海思芯片内存管理
- 🎄三、怎样设置 OS内存 和 MMZ内存
- 🎄四、怎样查看 OS内存 和 MMZ内存
- ✨4.1 查看 OS 内存
- ✨4.2 查看 MMZ 内存
- 🎄五、总结
🎄一、概述
海思芯片的物理内存被划分为两个部分,一块供OS(Operating system
,操作系统)使用,另一块就是MMZ(Media Memory Zone
,多媒体内存区域)。
本文以海思SS626(22AP20 解码处理器)芯片为例,介绍海思芯片内存管理的相关概念。内存管理相关的SDK文档如下:
SS626ReleaseDoc\zh\00.hardware\chip\22AP20 解码处理器用户指南.pdf
SS626ReleaseDoc\zh\01.software\board\SS626V100 SDK 安装以及升级使用说明.pdf
SS626ReleaseDoc\zh\02.only for reference\software\内存布局调整指南.pdf
✨1.1 芯片内存地址范围
海思SS626的文档 SS626ReleaseDoc\zh\00.hardware\chip\22AP20 解码处理器用户指南.pdf
给出了内存地址范围:0x40000000 ~ 0x23FFFFFFF
,最大支持8G内存。
🎄二、海思芯片内存管理
海思芯片的物理内存被划分为两个部分,一块供OS(Operating system
,操作系统)使用,另一块就是MMZ(Media Memory Zone
,多媒体内存区域)。
OS
(Operating system)内存:就是分配给Linux内核管理的内存,分配给内核和应用程序使用;MMZ
(Media Memory Zone)内存:是海思芯片独有的,专门用来处理音视频的内存。因为海思芯片是专门用来做音视频编解码的芯片,需要使用大量内存,为了编解码的速度,海思驱动底层会管理一部分内存,专门用于音视频编解码;这部分内存无法使用 malloc 等应用接口申请,必须使用海思提供的SDK接口申请。
🎄三、怎样设置 OS内存 和 MMZ内存
设置 OS内存 和 MMZ内存有如下几个步骤:
- 1、在SS626中,OS内存起始地址为0x40000000。首先通过是uboot启动参数设置操作系统内存,例如
setenv bootargs 'mem=512M ... '
,表示分配给操作系统内存为512M。设置完进入系统后,可以通过下面命令查看 bootargs 信息:# cat /proc/cmdline mem=1024M console=ttyAMA0,115200n8 root=/dev/mmcblk0p3 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:1M(boot),15M(kernel),300M(rootfs),1M(mdc),3400M(data)
- 2、修改加载驱动的
loadxxxx
脚本,该脚本里有几个与内存相关的参数,mem_total
表示总的物理内存,mem_start
表示物理内存起始地址(22AP20 解码处理器用户指南.pdf
有说明),os_mem_size
表示OS内存总大小,mmz_start
表示mmz内存物理起始地址,mmz_size
表示mmz内存总大小。#DDR start:0x40000000;ipcm(0x40000000, 2M); LiteOS(0x40200000, 62M); Linux OS(0x44000000, 1024M); MMZ start:0x84000000 mem_total=4096 # 4096, total mem mem_start=0x40000000 # phy mem start ipcm_mem_size=2 # 2M, ipcm size liteos_mem_size=62 # 62M, liteos size os_mem_size=1024 # 1024M, os memmmz_start=0x84000000; # mmz start addr; 0x40000000+2M+62M+1024M=0x84000000 mmz_size=3008M; # 3008M, mmz size; mem_total - (mmz_start - mem_start)= 4096M-1088M = 3008M
- 3、加载 ot_osal.ko 驱动时,通过参数设置mmz内存。MMZ内存由osal内核模块管理(amp/a55_linux/mpp/out/ko目录下的
ot_osal.ko),加载osal模块时,通过模块参数指定其起始地址及大小。insmod ot_osal.ko anony=1 mmz_allocator=ot mmz=anonymous,0,$mmz_start,$mmz_size || report_error # 格式:mmz=<name>,<gfp>,<phys_start_addr>,<size>:<name>,<gfp>,<phys_start_addr>: # mmz= : 开始设置mmz内存 # <name>:名称,这里是 anonymous # <gfp>:mmz的属性,目前一般都直接将该值置为0 # <phys_start_addr>:mmz 内存物理起始地址 # <size>:mmz内存总大小 # 如果有多个mmz分配池,可以公共冒号隔开
- 4、请注意,MMZ内存地址范围不能与OS内存重叠,且两者之和不能超过物理内存大小。
🎄四、怎样查看 OS内存 和 MMZ内存
✨4.1 查看 OS 内存
系统起来后,查看 os 内存,可以使用free
、cat /proc/meminfo
命令,下面是运行后显示的结果:
运行 free
命令查看os内存情况:
~ # freetotal used free shared buff/cache available
Mem: 907180 125328 741436 20 40416 752816
Swap: 0 0 0
运行 cat /proc/meminfo
命令查看os内存情况:
~ # cat /proc/meminfo
MemTotal: 907180 kB
MemFree: 744148 kB
MemAvailable: 755528 kB
Buffers: 4568 kB
Cached: 31240 kB
SwapCached: 0 kB
Active: 15856 kB
Inactive: 24828 kB
Active(anon): 52 kB
Inactive(anon): 4844 kB
Active(file): 15804 kB
Inactive(file): 19984 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 4944 kB
Mapped: 10000 kB
Shmem: 20 kB
KReclaimable: 4608 kB
Slab: 29220 kB
SReclaimable: 4608 kB
SUnreclaim: 24612 kB
KernelStack: 2176 kB
PageTables: 620 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 453588 kB
Committed_AS: 110776 kB
VmallocTotal: 262930368 kB
VmallocUsed: 15384 kB
VmallocChunk: 0 kB
Percpu: 704 kB
CmaTotal: 4096 kB
CmaFree: 0 kB
✨4.2 查看 MMZ 内存
可以使用 cat /proc/umap/media-mem
命令查看 mmz 内存。
下面是运行 cat /proc/umap/media-mem
后的结果显示:
ZONE
行:展示一个内存区域的信息,(0x84000000, 0x13FFFFFFF)
是物理起始地址-终止地址,nBYTES=3080192KB
是这个ZONE内存总大小,NAME="anonymous"
是名称。MMB
:Media-Memory-Block,媒体内存块,后面描述了每块的信息。MMZ_USE_INFO
:mmz使用情况,总大小、已使用、剩余、mmz个数、mmb个数。
🎄五、总结
👉本文介绍了海思芯片内存管理相关知识,包括OS内存、MMZ内存的概念,怎样设置OS内存、MMZ内存,怎样查看OS内存、MMZ内存。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
参考:
1、海思sdk文档
2、设置海思芯片MMZ内存、OS内存详解