设置海思芯片MMZ内存、OS内存详解

1、前言

(1)本文是基于hi3516dv300芯片的uboot和内核进行讲解;
(2)dv300芯片的板子上实际接了2G内存,dv300芯片实际最大也只支持2G内存;

2、hi3516dv300芯片的内存地址范围

在这里插入图片描述

(1)通过查阅数据手册可知《Hi3516DV300 专业型 Smart IP Camera SoC 用户指南》,dv300芯片的内存地址范围是0x8000_0000-0xFFFF_FFFF,最大能支持2G内存;
(2)海思芯片把内存分为mmz内存和os内存,最终linux系统能管理的内存是小于实际接的内存大小,因为要分一部分内存作为mmz;

3、海思芯片的内存管理

(1)在海思芯片中,将内存划分为OS内存和MMZ内存,板子上的2G内存一部分做OS内存,一部分做MMZ内存;
(2)OS内存:就是分配给linux内核管理的内存,分配给内核和应用程序使用;
(3)MMZ(Media Memory Zone,多媒体内存区域):是海思芯片独有的,因为海思芯片是专门用来做音视频编解码的芯片,需要使用大量内存,为了编解码的速度,海思驱动底层会管理一部分内存,专门用于音视频编解码;
总结:将实际物理内存分成两部分——OS内存和MMZ内存,两部分内存的管理是彼此独立的;

4、MMZ的原理介绍

(1)mmz: Media-Memory-Zone,媒体内存域,也就是分配池;
(2)mmb: Media-Memory-Block,媒体内存块;
(3)MMZ管理的物理内存区域不属于linux内核控制,是单独给媒体驱动(如解码器、DEMUX)使用的物理内存区域。 MMB是指从MMZ中分配的内存块;
(4)MMZ驱动管理用户创建的分配池,用户程序分配内存的时候可以指定要在哪个分配池中分配内存,分配器将查找满足要求的分配池并从中分配合适的内存块给程序使用;
(5)MMZ是可以存在多个分配池的,用户申请内存块时可以指定从哪个分配池获取,也可以不指定分配池,分配器自动分配一个满足条件的内存块;
(6)分配池的配置是在加载hi_osal.ko驱动时指定的,不同的SDK可能驱动的名字不一样;

5、MMZ驱动的模块参数

mmz=<name>,<gfp>,<phys_start_addr>,<size>:<name>,<gfp>,<phys_start_addr>:
字符含义
mmz=用来定义media-mem的分配池,是开始的标志
<name>字符串,是分配池的名字
<gfp>数字,表示分配池的属性,主要用于在有多种内存的单板上指定MMZ位于哪种内存上(比如DDR、 SDRAM、 DDR2、 DDR3),为0表示自动,目前一般都直接将该值置为0
<phys_start_addr>分配池的起始物理地址,16进制的数;
<size>分配池的大小,可以用两种表达方式:0x100000、1M
":"分隔符用于多个分配池之间的分隔

6、分配OS内存和MMZ内存的原则

(1)分配的OS内存和MMZ内存加起来的总大小不能超过实际物理内存的大小;
(2)OS内存和MMZ内存互相之间的内存地址不能重合,否则会产生内存踩踏;
(3)总的物理内存大小不变的情况下,OS内存和MMZ内存之间的分配是此消彼长,两者之间分配的份额需要取得平衡,以达到最优性能;

7、设置MMZ内存

7.1、加载hi_osal.ko驱动

mmz_buf0_start=0xD8000000;
mmz_buf0_size=60M;
mmz_start=0xDBC00000;		# mmz start addr
mmz_size=579M;			# 579M, mmz size

insmod hi_osal.ko anony=1 mmz_allocator=hisi mmz=anonymous,0,$mmz_start,$mmz_size:buf0,0,$mmz_buf0_start,$mmz_buf0_size || report_error
mmz=anonymous第一块MMZ内存的名字是anonymous
$mmz_start起始地址是0xDBC00000
$mmz_size内存大小是579M
buf0第一块MMZ内存的名字是buf0
$mmz_buf0_start起始地址是0xD8000000
$mmz_buf0_size内存大小是60M

(1)在海思提供的SDK包中会有加载驱动的脚本,比如dv300芯片的加载脚本就是load3516dv300,上面是摘抄的加载hi_osal.ko的脚本;
(2)加载hi_osal.ko时传入MMZ内存的起始地址和大小,驱动支持传入多块MMZ内存地址;

7.2、查看MMZ内存:/proc/media-mem

~ # cat /proc/media-mem 
+---ZONE: PHYS(0xD8000000, 0xDBBFFFFF), GFP=0, nBYTES=61440KB,    NAME="buf0"
+---ZONE: PHYS(0xDBC00000, 0xFFEFFFFF), GFP=0, nBYTES=592896KB,    NAME="anonymous"
   |-MMB: phys(0xDBC00000, 0xDBC07FFF), kvirt=0xF0DE8000, flags=0x00000001, length=32KB,    name="sys_scale_coef"
   |-MMB: phys(0xDBC08000, 0xDBC27FFF), kvirt=0x00000000, flags=0x00000000, length=128KB,    name="TDE_MEMPOOL_MMB"
   |-MMB: phys(0xDBC28000, 0xDBC43FFF), kvirt=0xF0FE0000, flags=0x00000001, length=112KB,    name="gdc_node_buf"
   |-MMB: phys(0xDBC44000, 0xDBC44FFF), kvirt=0xF0C95000, flags=0x00000001, length=4KB,    name="GDC int_pole_co"
   |-MMB: phys(0xDBC45000, 0xDBCBFFFF), kvirt=0xF1100000, flags=0x00000001, length=492KB,    name="VGS_NodeBuf"
   |-MMB: phys(0xDBCC0000, 0xDBCC0FFF), kvirt=0xF0CD9000, flags=0x00000001, length=4KB,    name="dis_node_buf"
   |-MMB: phys(0xDBCC1000, 0xDC0C0FFF), kvirt=0x00000000, flags=0x00000000, length=4096KB,    name="hifb_layer0"
   |-MMB: phys(0xDC0C1000, 0xDC0D0FFF), kvirt=0xF14D0000, flags=0x00000001, length=64KB,    name="HIFB COEF"
   |-MMB: phys(0xDC0D1000, 0xDC105FFF), kvirt=0xF1C80000, flags=0x00000001, length=212KB,    name="IVE_QUEUE"
   |-MMB: phys(0xDC106000, 0xDC106FFF), kvirt=0xF0EDD000, flags=0x00000003, length=4KB,    name="IVE_TEMP_NODE"
   |-MMB: phys(0xDC107000, 0xDC116FFF), kvirt=0xF1CE0000, flags=0x00000001, length=64KB,    name="SVP_NNIE_QUEUE"
   |-MMB: phys(0xDC117000, 0xDC11AFFF), kvirt=0xF12F8000, flags=0x00000003, length=16KB,    name="SVP_NNIE_MODLE_"

---MMZ_USE_INFO:
 total size=654336KB(639MB),used=5228KB(5MB + 108KB),remain=649108KB(633MB + 916KB),zone_number=2,block_number=12

(1)从上面可知,MMZ内存有两块:名字是buf0,大小是61440KB;名字是anonymous,大小是592896KB;
(2)刚好和我们在加载hi_osal.ko时指定的MMZ内存参数吻合;

8、设置OS内存

8.1、设置bootargs

~ # cat /proc/cmdline 
mem=1408M console=ttyS0,115200 root=/dev/mmcblk0p7 rootfstype=squashfs rootwait

(1)从bootargs中可以得知,OS内存分配了1408M,这里起始地址没有指明,分析内核源码可知,内存起始地址就是0x80000000;
(2)具体bootargs中指定的内存如何生效,参考博客:《linux内存管理——内存大小、起始地址的解析与修改》

8.2、查看OS内存:free

~ # free
             total         used         free       shared      buffers
Mem:       1419980       132636      1287344          448        23808
-/+ buffers:             108828      1311152
Swap:            0            0            0

9、内存管理示例图

-----|----------------|  0x80000000   # Memory managed by OS.              
1408M|                |                                                 
	 |      OS        |                                                 
-----|----------------|  0xD8000000   #Memory managed by MMZ block buf0.     
60M  |                |                                                 
	 |    MMZ:buf0   |                                                 
-----|----------------|  0xDBC00000   # Memory managed by MMZ block anonymous.      
579M | MMZ:anonymous  |
	 |                |  
-----|----------------|  0xFFF00000   # End of memory managed by MMZ.
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值