高通msm平台为例,以下是这个平台定义的几个ion内存。

qcom,ion {

compatible = "qcom,msm-ion";

#address-cells = <1>;

#size-cells = <0>;

qcom,ion-heap@25 {

reg = <25>;

qcom,ion-heap-type = "SYSTEM";

};

qcom,ion-heap@21 {

reg = <21>;

qcom,ion-heap-type = "SYSTEM_CONTIG";

};

qcom,ion-heap@8 { /* CP_MM HEAP */

compatible = "qcom,msm-ion-reserve";

reg = <8>;

qcom,heap-align = <0x1000>;

linux,contiguous-region = ; //ION_CP_MM_HEAP_ID//msm_semem.c中分配

qcom,ion-heap-type = "SECURE_DMA";

};

qcom,ion-heap@27 { /* QSEECOM HEAP */

compatible = "qcom,msm-ion-reserve";

reg = <27>;

linux,contiguous-region = ;//ION_QSECOM_HEAP_ID//ta_log.c和Qseecom.c

qcom,ion-heap-type = "DMA";

};

qcom,ion-heap@28 { /* AUDIO HEAP */

compatible = "qcom,msm-ion-reserve";

reg = <28>;

linux,contiguous-region = ;

qcom,ion-heap-type = "DMA";

};

qcom,ion-heap@23 { /* OTHER PIL HEAP */

compatible = "qcom,msm-ion-reserve";

reg = <23>;

linux,contiguous-region = ;

qcom,ion-heap-type = "DMA";

};

qcom,ion-heap@26 { /* MODEM HEAP */

compatible = "qcom,msm-ion-reserve";

reg = <26>;

linux,contiguous-region = ;

qcom,ion-heap-type = "DMA";

};

}

这些内容从msm_ion.c 里读出来并根据这些内容创建 ion_platform_heap 数据结构。

struct ion_platform_heap {

enum ion_heap_type type;

unsigned int id;

const char *name;

ion_phys_addr_t base;

size_t size;

unsigned int has_outer_cache;

void *extra_data;

ion_phys_addr_t align;

void *priv;

};

从device tree读出来相应的id,name,base,size等内容然后保存在ion_platform_heap中。

打印的内容如下:

idx=0, type=0,id=25,name=system,base=0x0,size=0

idx=1, type=1,id=21,name=kmalloc,base=0x0,size=0

idx=2, type=6,id=8,name=mm,base=0xb9000000,size=114294784

idx=3, type=4,id=27,name=qsecom,base=0xb8000000,size=13631488

idx=4, type=4,id=28,name=audio,base=0xb7c00000,size=3227648

idx=5, type=4,id=23,name=pil_1,base=0x8c000000,size=6291456

idx=6, type=4,id=26,name=pil_2,base=0x86800000,size=92274688

ion_platform_heap.id : 等于device tree中reg的值。

ion_platform_heap.type : 读出来qcom,ion-heap-type的内容,加上ION_HEAP_TYPE_ 前缀的。

比如qcom,ion-heap-type=”SYSTEM”,然后加上ION_HEAP_TYPE_,这些定义在ion_heap_type枚举类型中。

enum ion_heap_type {

ION_HEAP_TYPE_SYSTEM, //qcom,ion-heap-type = "SYSTEM"

ION_HEAP_TYPE_SYSTEM_CONTIG, //qcom,ion-heap-type="SYSTEM_CONFIG"

ION_HEAP_TYPE_CARVEOUT,

ION_HEAP_TYPE_CHUNK,

ION_HEAP_TYPE_DMA,

ION_HEAP_TYPE_CUSTOM, /* must be last so device specific heaps always

are at the end of this enum */

ION_NUM_HEAPS = 16,

};

ion_platform_heap.name : 根据ion_platform_heap.id值和ion_heap_meta.id进行比较,把对应的 ion_heap_meta.name赋值给 ion_platform_heap.name。ion_heap_meta 定义如下。

static struct ion_heap_desc ion_heap_meta[] = {

{

.id = ION_SYSTEM_HEAP_ID,

.name = ION_SYSTEM_HEAP_NAME,

},

{

.id = ION_SYSTEM_CONTIG_HEAP_ID,

.name = ION_KMALLOC_HEAP_NAME,

},

{

.id = ION_CP_MM_HEAP_ID,

.name = ION_MM_HEAP_NAME,

.permission_type = IPT_TYPE_MM_CARVEOUT,

},

{

.id = ION_MM_FIRMWARE_HEAP_ID,

.name = ION_MM_FIRMWARE_HEAP_NAME,

},

{

.id = ION_CP_MFC_HEAP_ID,

.name = ION_MFC_HEAP_NAME,

.permission_type = IPT_TYPE_MFC_SHAREDMEM,

},

{

.id = ION_SF_HEAP_ID,

.name = ION_SF_HEAP_NAME,

},

{

.id = ION_QSECOM_HEAP_ID,

.name = ION_QSECOM_HEAP_NAME,

},

{

.id = ION_AUDIO_HEAP_ID,

.name = ION_AUDIO_HEAP_NAME,

},

{

.id = ION_PIL1_HEAP_ID,

.name = ION_PIL1_HEAP_NAME,

},

{

.id = ION_PIL2_HEAP_ID,

.name = ION_PIL2_HEAP_NAME,

},

{

.id = ION_CP_WB_HEAP_ID,

.name = ION_WB_HEAP_NAME,

},

{

.id = ION_CAMERA_HEAP_ID,

.name = ION_CAMERA_HEAP_NAME,

},

{

.id = ION_ADSP_HEAP_ID,

.name = ION_ADSP_HEAP_NAME,

}

};

然后根据每个ion_platform_heap,通过msm_ion_heap_create()函数来创建一个ion_heap。

每个ion_heap通过plist_add(&heap->node, &dev->heaps),把每个创建的ion_heap->node链接到

ion_device->heaps。

msm_ion_heap_create()函数中,根据每种ion_heap_type来初始化每个ion_heap。

ion_heap中ion_heap_ops是根据上面的DMA,或者SYSTEM等来初始化的。

这些创建完了之后,就可以通过ion_alloc()等函数分配使用ion内存。

比如Secure CMA,也就是secure_mem对应的内存,一般是video playback的时候使用的。

在代码中搜索,ION_CP_MM_HEAP_ID 就可以搜出来。

//比如kgsl_drm.c文件中

priv->ion_handle = ion_alloc(kgsl_drm_ion_client,

obj->size * priv->bufcount, PAGE_SIZE,

ION_HEAP(ION_CP_MM_HEAP_ID), ION_FLAG_SECURE);

//比如msm_smem.c文件中

heap_mask = ION_HEAP(ION_CP_MM_HEAP_ID);

ion_alloc(client->clnt, size, align, heap_mask, flags);

ION_SYSTEM_HEAP_ID 这种在 mdss_fb.c 中,或者再 msm_audio_ion.c 中都有使用。

这里可以看到ion系统没有真正使用两个qcom,ion-heap-type 为 “DMA”的部分,这两个部分分别是reg值为23和28的两个部分。(ION_PIL1_HEAP_ID,ION_PIL2_HEAP_ID)。这两个部分是没有通过ion_alloc函数获取相关的内存的。而是在

相应的device tree当中加上linux,contiguous-region,用这个来在platform设备注册的时候把相应的cma区域放到dev->cma_area中,然后在初始化的时候取出来使,看如下:

//有定义linux,contiguous-region,就会在注册platform设备的时候,通过linux,contiguous-region

//把相应的CMA区域放到dev->cma_area中了(具体看CMA说明)。然后在modem上电,分配内存的时候直接取出来

//dev->cma_area使用

qcom,pronto@a21b000 {

compatible = "qcom,pil-tz-generic";

...

linux,contiguous-region = ;

}

qcom,mss@4080000 {

compatible = "qcom,pil-q6v56-mss";

...

linux,contiguous-region = ;

}

由于这两个部分是CMA分配使用的,其实可以从msm8916-ion.dtsi文件中去掉也是可以的。

ION_SYSTEM_HEAP_ID的分配使用

Linux下ion内存,Linux内核驱动:ion memory相关推荐

  1. 轻松学会linux下查看内存频率,内核函数,cpu频率

    查看CPU: cat /proc/cpuinfo # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数# 查看物理C ...

  2. linux下查看内存频率,内核函数,cpu频率

    查看CPU: cat /proc/cpuinfo # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数# 查看物理C ...

  3. linux显卡驱动mxm,linux下我的FX5200显卡驱动安装

    linux下我的FX5200显卡驱动安装 发布时间:2008-09-20 16:42:33来源:红联作者:Keiboc 一.为什么要装驱动 一般情况下,只要你下载了LINUX的最新发行版本,比如Fed ...

  4. Linux下IIC子系统和触摸屏驱动

    Linux下IIC子系统和触摸屏驱动 1.IIC简介   I2C( Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备. ...

  5. linux下查看内存使用情况

    在Linux下查看内存我们一般用free命令: [root@scs-2 tmp]# free              total       used       free     shared   ...

  6. 【调试】Linux下超强内存检测工具Valgrind

    [调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...

  7. linux内存平均值,linux下查看内存使用情况[转载]

    在Linux下查看内存我们一般用free命令: [root@scs-2 tmp]# free total used free shared buffers cached Mem: 3266180 32 ...

  8. linux脚本查看系统内存,二个linux下查看内存使用情况的shell脚本()

    摘要 腾兴网为您分享:二个linux下查看内存使用情况的shell脚本(),政务易,悦作业,优化大师,王者荣耀等软件知识,以及单向历app,优路教育app,kimoji,开关电源设计软件,皮皮高清影视 ...

  9. linux跟踪内存检测原理,wooyun/Linux下基于内存分析的Rootkit检测方法.html at master · exitmsconfig/wooyun · GitHub...

    Linux下基于内存分析的Rootkit检测方法 - 路人甲 原文地址:http://drops.wooyun.org/tips/4731 0x00 引言 某Linux服务器发现异常现象如下图,确定被 ...

  10. linux系统小灯项目报告,linux下led小灯的驱动.doc

    linux下led小灯的驱动 我第一个字符设备驱动程序的痛苦经历 2009-12-26 21:07 写驱动程序是个痛苦成长的过程... 对驱动的编译,先要有支持的内核源码树,所以先得编译内核.由于过了 ...

最新文章

  1. 反转!BAT编程吸金榜来了,AI程序员刷爆了......
  2. redux和react-redux的使用详解
  3. mysql 故障处理_MySQL日志故障的处理和分析
  4. Mounty for NTFS免费软件实现MAC OS X下对NTFS分区进行读写
  5. 整理了一个目录,督促自己写文章
  6. excel表格行列显示十字定位_取消excel单元格十字定位(excle表格里的十字对准)
  7. Go-fastdfs分布式文件系统搭建
  8. 程序化交易是指所有利用计算机程序软件,程序化交易软件 电脑程式交易指买进、卖出股票(期货,外汇…)的讯号皆来于自电脑。 程式编写者将其投资理念以电脑语言表示,... - 雪球...
  9. 做自媒体原创视频多平台分发,视频一键发布多平台方法教程
  10. Python车牌识别、车牌抓取源代码
  11. linux中括号 美元符号怎么打,键盘输入美元符号
  12. 仓库盘点好方法,使用安卓盘点机PDA扫描商品条码进行超市盘点
  13. 喵懂区块链21期 | Monoxide:在突破不可能三角的边缘试探?
  14. 基于卷积神经网络的猫种类的识别
  15. 【字节搜索校招/社招/实习内推】
  16. 若伊Vue快速容器部署
  17. 深度学习中Concat层和Flatten层作用
  18. 【报告分享】2022百度职业资格考试培训行业洞察-百度营销研究院(附下载)
  19. WEB阶段7:综合练习-联系人管理系统-增删改查查询分页
  20. java分页展示_Java实现分页展示

热门文章

  1. java web flex 配置,Flex+Blazeds与Java_Web_Project整合开发配置有图有真相
  2. 我是不安分的人 , 你却想要一份安稳 。
  3. CentOS 7安装Mysql8.0
  4. 情迁QQ机器人 Lua机器人插件开发教程
  5. 亚马逊德国站卖家:提醒您税务及包装法合规事项!
  6. iwebshop 简介
  7. siesta在Linux运行,并行编译SIESTA
  8. PNG怎么转成PDF格式?这两种方法一定要尝试一下
  9. HTML5 CSS动画 animation使用
  10. RHCA-442调优