hisi mmz内存管理

article/2025/11/8 12:17:46

一、概述

如图所示,在海思平台上将内存分为两个部分:os内存和mmz内存。os内存指:由linux操作系统管理的内存;mmz内存:由mmz驱动模块进行管理供媒体业务单独使用的内存,在驱动加载时可以指定该模块管理内存的大小:
insmod mmz.ko mmz=anonymous,0,0x4fa00000,6Manony=1 || report_error

                                        

         该驱动主要由两个文件组成:media-mem.c和mmz-userdev.c,加载驱动后相应的设备文件:/dev/mmz_userdev,应用层通过打开该设备文件进行ioctl(申请mmz内存、释放mmz内存、重映射mmz内存到内核等)和直接mmap操作,而媒体底层驱动模块则直接调用mmz驱动的导出接口进行相应操作。

二、数据结构

1、mmz区域描述符
hil_media_memory_zone描述了一个mmz区域的所有信息,可以有多个mmz区域,通过链表连接在一起。

struct hil_media_memory_zone 
{char name[HIL_MMZ_NAME_LEN+1]; //mmz区域名字:anonymousunsigned long gfp;   //区域标识:0unsigned long phys_start; //mmz区域起始物理地址:0x4fa00000unsigned long nbytes; //mmz区域大小:6Mstruct list_head list; //mmz链表unsigned char *bitmap; //位图struct list_head mmb_list; //mmz区域的mmb链表,存放所有申请到的物理内存unsigned int alloc_type;unsigned long block_align;void (*destructor)(const void *);
};

2、mmb内存描述符
hil_media_memory_block描述了从mmz区域申请一块内存,同一个mmz区域内的所有mmb通过链表连接。
 

struct hil_media_memory_block 
{   #ifndef MMZ_V2_SUPPORTunsigned int id;#endifchar name[HIL_MMB_NAME_LEN+1]; //该mmb模块使用者名字struct hil_media_memory_zone *zone; //指向mmb所属的mmz区域struct list_head list; //mmb链表unsigned long phys_addr; //申请到的mmb起始物理地址void *kvirt;  //对应内核虚拟地址,从代码看未用unsigned long length; //申请的mmb大小unsigned long flags; //标识unsigned int order;int phy_ref; //引用计数int map_ref; //引用计数
};

3、mmz_userdev_info

该结构体保存打开该设备文件的进程信息,存放在file结构体的private_data成员里。

struct mmz_userdev_info 
{pid_t pid;         //打开设备文件的进程pidpid_t mmap_pid;struct semaphore sem; //信号量struct list_head list; //指向mmb_info链表
};

4、mmb_info

该结构体描述应用申请到mmb后的相关信息,同进程的mmb_info通过链表形式管理。
 

struct mmb_info 
{unsigned long phys_addr;    //申请到的物理内存,同mmb.phys.addrunsigned long align;        /* ifyou need your phys-memory have special align size */unsigned long size;     //申请的物理内存大小unsigned int order;void *mapped;       //指向mmap后的虚拟地址空间union {struct {unsigned long prot  :8; /*PROT_READ or PROT_WRITE */unsigned long flags :12;/* MAP_SHARED or MAP_PRIVATE */#ifdef __KERNEL__unsigned long reserved :8; /* reserved, do not use */unsigned long delayed_free :1;unsigned long map_cached :1;#endif};unsigned long w32_stuf;};char mmb_name[HIL_MMB_NAME_LEN+1];char mmz_name[HIL_MMZ_NAME_LEN+1];unsigned long gfp;      /*reserved, do set to 0 */#ifdef __KERNEL__int map_ref;int mmb_ref;   struct list_head list;    //mmb_info链表hil_mmb_t *mmb;     //指向申请到的mmb#endif
};

三、关系图

1、mmz和mmb关系
下图展示了mmz驱动管理mmz和mmb的关系。mmz驱动模块支持多个mmz区域,只要在加载mmz.ko时通过参数传递即可,一般情况下只有一个mmz区域。多个mmz区域之间通过链表的形式组织在一起,链表头为mmz_list;而每个mmz区域通过mmb_list维护mmb链表,管理该区域内所有已经申请了的物理内存区域;每个mmb通过zone成员知道自己属于哪个mmz区域。

         通过/proc/media-mem可以查看mmz和mmb使用情况:

+---ZONE: PHYS(0x4FA00000, 0x4FFFFFFF),GFP=0, nBYTES=6144KB,  NAME="anonymous"

  |-MMB: phys(0x4FA00000, 0x4FA81FFF), kvirt=0x  (null), flags=0x00000000, length=520KB,       name="DCCM_MSG_BUF"

  |-MMB: phys(0x4FA82000, 0x4FA84FFF), kvirt=0x  (null), flags=0x00000000, length=12KB,        name="SYS_scale_coef"

  |-MMB: phys(0x4FA85000, 0x4FA87FFF), kvirt=0x  (null), flags=0x00000000, length=12KB,        name="SYS_scale_coef"

  |-MMB: phys(0x4FA88000, 0x4FB07FFF), kvirt=0x  (null), flags=0x00000000, length=512KB,       name="TDE_MemPool"

   |-MMB: phys(0x4FB08000, 0x4FB3CFFF),kvirt=0x  (null), flags=0x00000000,length=212KB,      name="IVE_QUEUE"

  |-MMB: phys(0x4FB3D000, 0x4FB3DFFF), kvirt=0x  (null), flags=0x00000000, length=4KB,name="IVE_TEMP_NODE"

---MMZ_USE_INFO:

 total size=6144KB(6MB),used=1272KB(1MB +248KB),remain=4872KB(4MB + 776KB),zone_number=1,block_number=6

                       

2、mmb、mmb_info和mmb_userdev_info关系
         下图展示了mmz驱动和应用申请数据结构之间的关系:

当应用打开设备文件/dev/mmz_userdev时会申请一个属于该进程的mmb_userdev_info结构体,mmb_userdev_info成员list指向属于该进程的所有mmb_info,mmb_info的mmb成员指向为其分配的mmb,而*mmaped存放mmb物理内存(phy_addr)进行映射后的虚拟地址供用户空间使用。

由于mmz大部分为媒体业务独立使用,内存在媒体硬件模块流转,应用无需访问,这时不用映射,只有当应用需要访问时才需要进行映射。可以把mmz管理的整个内存看做存储盘上的一个大文件,应用层要访问mmz的物理内存通过mmap方式进行映射(类似文件),映射的文件偏移就是mmb.phy_addr,映射大小就是申请的mmb.length,通过mmap方式映射到内核后根据返回的虚拟地址就可以访问该mmb内存。
 


http://chatgpt.dhexx.cn/article/cjsURafW.shtml

相关文章

hisi DDR内存空间的分配

总的 DDR OSMMZ OS代表操作系统内存 MMZ为海思编解码等功能使用的内存 海思说明文档参考 1、DDR内存管理说明 1)所有DDR内存中,一部分由操作系统管理,称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用&#xf…

[HI3516DV300开发笔记]HiSi NNIE输入图像数据设置

本文上接: [HI3516DV300开发笔记]HiSi NNIE opencv解算openpose人体关键点输出 https://blog.csdn.net/abc517789065/article/details/103592190 在上文中,已经初步实现了移植openpose模型到HISI3516开发板并且检测出人体2D关键点位置 整个检测的逻辑…

buildroot构建hisi平台根文件系统和工具链

buildroot构建hisi平台根文件系统和工具链 前面使用了arm-hisiv300-linux 工具链来作为Buildroot的外部工具链进行编译,然后遇到了很多编译问题。 https://blog.csdn.net/duapple/article/details/128516133?spm1001.2014.3001.5501 这里不使用hisi的工具链&…

【HISI调试】hisi PQtool开机报错,提示无dll,找不到插件,比如:ISP calibration Tool等

创作时间:2022-03-24 目录: 1.问题现象 2.那怎么办呢? 3.安装好对应的MCR即可 正文: 1.问题现象 打开hisi PQtool,提示无dll 一路确定后,下拉插件框,找不到想到的插件,比如ISP calibration Too 2.那怎么办呢? 需要…

Hisi 3516DV300 方案

海思3516DV300是华为海思半导体推出的一款专用 Smart HD IP 摄像机 SOC,集成新一代 ISP、业界 最新的 H.265 视频压缩编码器,同时集成高性能 NNIE 引擎,使得 Hi3516DV300 在低 码率、高画质、智能处理和分析、低功耗等方面引领行业水平。集成…

【HISI系列】海思媒体处理平台架构分析

Date: 2019-3-9 前言 Hi35xx系列芯片作为高清/超高清安防监控主流芯片,现在已经广泛应用于安防监控产品中。本文重点分析: 海思媒体处理平台架构系统架构1、参考 Hi35XXX海思媒体处理平台架构介绍 海思MPP业务MMZ内存优化介绍 海思hi35xx 开发学习(1):海思媒体处理平台架构 …

Buildroot编译hisi平台根文件系统

Buildroot编译hisi平台根文件系统 文章目录 1. 下载Buildroot源码2. Menuconfig配置3. 编译Buildroot3.1 手动下载软件包3.2 kernel header 报错3.3 arm-hisiv300-linux-gcc-ar:cannot find plugin liblto_plugin.so3.4 /media/data/hisi/buildroot-2022.02.8/outpu…

yolov5转hisi的nnie(c and c++)

yolov5转hisi的nnie(c and c) 总述一. 训练前修改网络二. 导出模型三. 后处理1. c版2. 基于hisi SDK的纯c版(后续更新) 总述 刚躺了坑,记录一下,目的是将yolov5(6.1)转成海思可以推理的wk文件,…

HISI_3516_vi

主要的解释还是看这些大牛的,我这里只是想自己整理一遍:海思3518E开发笔记2.5——海思VI(video input)模块详解_Spark!的博客-CSDN博客_海思wdr目录海思video input模块架构介绍海思video input模块功能介绍结构体说明…

hisi Camera 开发--HiMPP媒体处理软件开发基本概念

1. HIMPP平台架构简介 海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供 MPI(MPP Program Interface)接口完成相应功能。该平台支持应用软件快速开发以下功能:输入…

Hisiphp

最近有个项目要用到后台,就选用了hisiphp这个框架,框架使用的是thinkphp5.1。现在将里面的应用记录下来,为了以后方便使用。 1,首先要开启,系统-系统开发-开发模式 2,进入系统--系统扩展--模块管理--设计新…

海思芯片介绍

1.芯片介绍 芯片SOC里集成了众多控制芯片,比如负责深度学习的NNIE硬核,负责图像处理的IVE硬核,视频编解码单元H265/H264Codec,以及图像处理单元ISP等 为了减少用户对于硬件的直接操作,海思为用户封装了许多对于硬件的操…

hisi平台异常重启问题分析

Hisi平台开发之异常重启问题分析 目录 1. 问题描述...................................................................................................................... 3 2. 问题跟踪排查......................................................................…

【HISI系列】之开发板调试基本知识

1. HISI 根文件系统简介 Linux 的目录结构的最顶层是一个被称为“ / ”的根目录。系统加载 Linux 内核之后,就会挂载一个设备到根目录上。存在于这个设备中的文件系统被称为根文件系统。所有的系统命令、系统配置以及其他文件系统的挂载点都位于这个根文件系统中。 …

HTTP Digest接入方式鉴权认证流程

HTTP Digest接入方式鉴权认证流程 一、摘要认证原理 摘要认证与基础认证的工作原理很相似,用户先发出一个没有认证证书的请求,Web服务器回复一个带有WWW-Authenticate头的响应,指明访问所请求的资源需要证书。但是和基础认证发送以Base 64编…

C++ libcurl Digest Auth

C libcurl Digest Auth postman操作如下: 附认证原理如下: MD5 md5; string HA1 md5("username:realm:password"); string HA2 md5("method:uri"); string response md5("HA1:nouce:nc:cnonce:qop:HA2"); 这里…

mysql sql语句digest收集与展示

1.前言 mysql慢查询,已经有现成的成熟的方案收集展示了:pt-query-digest结合box公司的anemometer,没用过的移步:《mysql慢查询可视化》(本章内容需要提前了解anemometer)。 但DBA们一定还遇到过这样的问题…

HTTP Digest authentication

什么是摘要认证 摘要认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2617中描述。其身份验证机制很简单,它采用杂凑式(hash&#xff09…

配置Apache Digest认证

Apache常见的用户认证可以分为下面三种: 基于IP,子网的访问控制(ACL)基本用户验证(Basic Authentication)消息摘要式身份验证(Digest Authentication) 消息摘要式身份验证(Digest Authentication) Digest Authentication在基本身份验证上面扩展了安全…

http Digest认证计算方法整理

摘要认证及实现HTTP digest authentication - 简书 HTTP Basic和Digest认证介绍与计算 - 诸子流 - 博客园 不要不知道上面说的URI是什么意思啊 图解HTTP 第 8 章 确认访问用户身份的认证 - 简书8.1 何为认证 为了弄清究竟是谁在访问服务器,就得让对方的客户端自报家…