一、概述

如图所示,在海思平台上将内存分为两个部分: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区域名字:anonymous

unsigned long gfp;   //区域标识:0

unsigned long phys_start; //mmz区域起始物理地址:0x4fa00000

unsigned long nbytes; //mmz区域大小:6M

struct 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_SUPPORT

unsigned int id;

#endif

char 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;         //打开设备文件的进程pid

pid_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.addr

unsigned 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内存。

hisi mmz模块驱动讲解相关推荐

  1. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)...

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)--初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  2. 华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动

    定制Android之4G-LTE模块驱动 一.        简介 本文讲述在Android内核中,添加中国移动4G-LTE制式华为MU909模块驱动,实现通过4G上网业务,电话业务,短信业务. CP ...

  3. pythondifflib详解_python difflib模块示例讲解

    difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块. class diffl ...

  4. Linux移植EC20 4G模块驱动简易教程

    关于4G模块常见的品牌与型号: 品牌 型号 市场价格 芯片组 状态 HUAWEI ME909s-821 210-260 海思芯片,只有五模 在售 HUAWEI ME909s-521 400左右 高通芯 ...

  5. RK3126 人体感应模块驱动

    其实人体感应模块驱动比较简单,就是一个GPIO口的检测,这里主要是想提供一个接口,给上层去比较容易的控制,一般我们可以写成JNI封装,我嫌太麻烦了,直接使用共享文件的方式,往/data/data/co ...

  6. dac104s085芯片驱动讲解

    dac104s085芯片驱动讲解 dac104s085芯片时10位的4路dac数据输出芯片 一般应用于将数字信号转换为模拟信号,通常用于波形输出 驱动分析 1:拿到芯片手册一般做的时浏览芯片手册,把重 ...

  7. USB-WIFI RTL8188CU模块驱动

    RTL8188CU模块概述 Realtek的8188cu模块WiFi是通过usb接口挂载设备.以下是我对模块使用的所有开发工作. Linux内核驱动适配和编译 由于芯片驱动官方已经最高支持kernel ...

  8. python中selenium模块驱动谷歌详解

    python中selenium模块驱动谷歌详解 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中 ...

  9. 电平是什么?单片机的I/0口输入和输出,1和0是什么?什么是TTL电平?TTL电平分析?TTL、CMOS、RS232、RS485电平差异?usb转ttl?CH340模块驱动安装?电平之间的转换?

    电平是什么 理想的数字电路电平是这样的: 输入小于1/2VCC(电源电压)就是低电平,反之是高电平.实际的器件是做不到的,也不实用,如果输入电压在1/2VCC附近有干扰,就会发生错误的输入信号.现在常 ...

  10. ESP32设备驱动-TEA5767收音机模块驱动

    TEA5767收音机模块驱动 1.TEA5767介绍 TEA5767HN 是一款用于低压应用的单芯片电子调谐 FM 立体声收音机,具有完全集成的中频 (IF) 选择性和解调功能,频率范围从76-108 ...

最新文章

  1. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(改变图例位置、移除图例)实战(density plot)
  2. 生成excel表格并下载
  3. IAR无法goto的解决办法
  4. ACM/CF赛制getstart模板
  5. SwitchHosts下载安装使用
  6. 学硕计算机可考大数据博士吗,专硕考博比学硕考博难度更大吗?听听上岸的人怎么说...
  7. 看美文,记单词(5)
  8. 实现Promise的resolve/reject/then/all/race/finally/catch方法
  9. [转]file_get_contents(php://input)
  10. aac mediarecorder录制_Android音视频录制之MediaRecorder+camera
  11. FFMPEG安装与视频格式flv转换mp4
  12. 构造函数创造对象--创建四大天王的对象
  13. 前台jQuery实现图片轮播
  14. 特种部队小组2+蒲公英联机平台联机教程
  15. 解决win10升级补丁后共享打印机0x0000011b报错问题最简单解决方法,不需要卸载补丁
  16. 1 buffers were freed while being dequeued
  17. 关于QPS高并发,你了解多少?
  18. 好片推荐---《WALL·E》(又名《机器人瓦力》
  19. Unity幸运转盘项目实战
  20. 精读:REDQUEEN: Fuzzing with Input-to-State Correspondence

热门文章

  1. [Python]小甲鱼Python视频第020课(函数:内嵌函数和闭包)课后题及参考解答
  2. 【pygame游戏编程】第四篇-----打字测速游戏
  3. 8,EasyNetQ-多态发布和订阅
  4. 学生阅读作业三——对习而学教学方式的思考
  5. SQL查询1-12月的数据
  6. web项目开发的基本流程
  7. 深入解析Invoke and BeginInvoke, 同步与异步解析
  8. 在java中什么管理内存_Java是如何管理内存
  9. 基于 python + WebDriverAgent 的“跳一跳”小程序高分教程 1
  10. Highcharts构建空饼图