当前位置:网站首页>设置海思芯片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.
边栏推荐
- 基于DMS的数仓智能运维服务,知多少?
- 使用 PowerShell 将 Windows 转发事件导入 SQL Server
- C专家编程 第1章 C:穿越时空的迷雾 1.7 编译限制
- 一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
- 甲方不让用开源【监控软件】?大不了我自己写一个
- Yuan xiaolin: Volvo focus on travel security, and put it perfectly
- AI+BI+可视化,Sugar BI架构深度剖析
- Not to be ignored!Features and advantages of outdoor LED display
- 简易网络传输方法
- 使用uniapp 封装一个request 请求
猜你喜欢

详谈RDMA技术原理和三种实现方式

我在滴滴做开源

How much do you know about the intelligent operation and maintenance service of data warehouse based on DMS?

【Unity入门计划】制作RubyAdventure01-玩家的创建&移动

【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer

可复现、开放科研、跨学科合作:数据驱动下的科研趋势及应用方案

C专家编程 第3章 分析C语言的声明 3.7 typedef struct foo{... foo;}的含义

TCP 可靠吗?为什么?

黄致绮 荣获第六季完美童模全球总决赛 全国总冠军

spark入门学习-2
随机推荐
C专家编程 第2章 这不是Bug,而是语言特性 2.4 少做之过
CopyOnWriteArrayList详解
元宇宙系列--Value creation in the metaverse
C专家编程 第1章 C:穿越时空的迷雾 1.8 ANSI C标准的结构
C专家编程 第3章 分析C语言的声明 3.6 typedef int x[10]和#define x int[10]的区别
CPU个数_核心数_线程数之间的关系
从零开始搭建MySQL主从复制架构
STM32的HAL和LL库区别和性能对比
leetcode:187. 重复的DNA序列
【系统学习编程-编程入门-全民编程 视频教程】
ffplay视频播放原理分析
【Unity入门计划】基本概念(8)-瓦片地图 TileMap 02
83. Remove Duplicates from Sorted List
C专家编程 第3章 分析C语言的声明 3.7 typedef struct foo{... foo;}的含义
To add digital wings to education, NetEase Yunxin released the overall solution of "Internet + Education"
[QT] Qt project demo: data is displayed on the ui interface, double-click the mouse to display specific information in a pop-up window
C专家编程 第3章 分析C语言的声明 3.3 优先级规则
C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
使用.NET简单实现一个Redis的高性能克隆版(一)
罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤