当前位置:网站首页>设置海思芯片MMZ内存、OS内存详解
设置海思芯片MMZ内存、OS内存详解
2022-08-03 16:17:00 【正在起飞的蜗牛】
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、分配OS内存和MMZ内存的原则
(1)分配的OS内存和MMZ内存加起来的总大小不能超过实际物理内存的大小;
(2)OS内存和MMZ内存互相之间的内存地址不能重合,否则会产生内存踩踏;
(3)总的物理内存大小不变的情况下,OS内存和MMZ内存之间的分配是此消彼长,两者之间分配的份额需要取得平衡,以达到最优性能;
5、设置MMZ内存
5.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内存地址;
5.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内存参数吻合;
6、设置OS内存
6.1、设置bootargs
~ # cat /proc/cmdline
mem=1408M console=ttyS0,115200 root=/dev/mmcblk0p7 rootfstype=squashfs rootwait
(1)从bootargs中可以得知,OS内存分配了1408M,这里起始地址没有指明,分析内核源码可知,内存起始地址就是0x80000000;
(2)具体bootargs中指定的内存如何生效,参考博客:《linux内存管理——内存大小、起始地址的解析与修改》;
6.2、查看OS内存:free
~ # free
total used free shared buffers
Mem: 1419980 132636 1287344 448 23808
-/+ buffers: 108828 1311152
Swap: 0 0 0
7、内存管理示例图
-----|----------------| 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.
边栏推荐
猜你喜欢
随机推荐
QT QT 】 【 to have developed a good program for packaging into a dynamic library
C专家编程 第2章 这不是Bug,而是语言特性 2.1 这关语言特性何事,在Fortran里这就是Bug呀
C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
C语言03、数组
正向代理与反向代理
我在滴滴做开源
使用uniapp 封装一个request 请求
C专家编程 第1章 C:穿越时空的迷雾 1.6 它很棒,但它符合标准吗
C专家编程 第3章 分析C语言的声明 3.3 优先级规则
实时渲染流程操作复杂吗,如何实现?
黄致绮 荣获第六季完美童模全球总决赛 全国总冠军
spark入门学习-2
自动化部署+整合SSM项目
How much do you know about the intelligent operation and maintenance service of data warehouse based on DMS?
C语言04、操作符
Some optional strategies and usage scenarios for PWA application Service Worker caching
Common distributed theories (CAP, BASE) and consensus protocols (Gosssip, Raft)
高效的组织信息共享知识库是一种宝贵的资源
C专家编程 第1章 C:穿越时空的迷雾 1.11 轻松一下---由编译器定义的Pragmas效果
STM32的HAL和LL库区别和性能对比