by JHJ(jianghuijun211@gmail.com)

为什么需要ION

回顾2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到kernel主线中。但是PMEM(android实现的 一个内存分配器)使这个愿望破灭了。为什么PMEM不被linux 社区接受的原因在[3]中有讲到。从那开始,PMEM很明确会被完全抛弃,取而代之的是ION内存管理器。ION是google在Android4.0 ICS为了解决内存碎片管理而引入的通用内存管理器,它会更加融合kernel。目前QCOM MSM, NVDIA Tegra, TI OMAP, MRVL PXA都用ION替换PMEM。

如何获取source code

http://android.googlesource.com/kernel/common.git

ION codes reside in drivers/gpu/ion

Specific usage examples on omap4:

http://android.googlesource.com/kernel/omap.git

ION 框架[1]

ION 定义了四种不同的heap,实现不同的内存分配策略。

  • ION_HEAP_TYPE_SYSTEM : 通过vmalloc分配内存
  • ION_HEAP_TYPE_SYSTEM_CONTIG: 通过kmalloc分配内存
  • ION_HEAP_TYPE_CARVEOUT: 在保留内存块中(reserve memory)分配内存
  • ION_HEAP_TYPE_CUSTOM: 由客户自己定义

下图是两个client共享内存的示意图。图中有2个heap(每种heap都有自己的内存分配策略),每个heap中分配了若干个buffer。client的handle管理到对应的buffer。两个client是通过文件描述符fd来实现内存共享的。

ION APIs

用户空间 API

定义了6种 ioctl 接口,可以与用户应用程序交互。

  • ION_IOC_ALLOC: 分配内存
  • ION_IOC_FREE: 释放内存
  • ION_IOC_MAP: 获取文件描述符进行mmap  (? 在code中未使用这个定义)
  • ION_IOC_SHARE: 创建文件描述符来实现共享内存
  • ION_IOC_IMPORT: 获取文件描述符
  • ION_IOC_CUSTOM: 调用用户自定义的ioctl

ION_IOC_SHARE 及ION_IOC_IMPORT是基于DMABUF实现的,所以当共享进程获取文件描述符后,可以直接调用mmap来操作共享内存。mmap实现由DMABUF子系统调用ION子系统中mmap回调函数完成。

内核空间 API

内核驱动也可以注册为一个ION的客户端(client),可以选择使用哪种类型的heap来申请内存。

  • ion_client_create: 分配一个客户端。
  • ion_client_destroy: 释放一个客户端及绑定在它上面的所有ion handle.

ion handle: 这里每个ion handle映射到一个buffer中,每个buffer关联一个heap。也就是说一个客户端可以操作多块buffer。

Buffer 申请及释放函数:

  • ion_alloc: 申请ion内存,返回ion handle
  • ion_free: 释放ion handle

ION 通过handle来管理buffer,驱动需要可以访问到buffer的地址。ION通过下面的函数来达到这个目的

  • ion_phys: 返回buffer的物理地址(address)及大小(size)
  • ion_map_kernel: 给指定的buffer创建内核内存映射
  • ion_unmap_kernel: 销毁指定buffer的内核内存映射
  • ion_map_dma: 为指定buffer创建dma 映射,返回sglist(scatter/gather list)
  • ion_unmap_dma: 销毁指定buffer的dma映射

ION是通过handle而非buffer地址来实现驱动间共享内存,用户空间共享内存也是利用同样原理。

  • ion_share: given a handle, obtain a buffer to pass to other clients
  • ion_import: given an buffer in another client, import it
  • ion_import_fd: given an fd obtained via ION_IOC_SHARE ioctl, import it

Heap API

Heap 接口定义 [drivers/gpu/ion/ion_priv.h]

这些接口不是暴露给驱动或者用户应用程序的。

/**
* struct ion_heap_ops - ops to operate on a given heap
* @allocate:           allocate memory
* @free:               free memory
* @phys                get physical address of a buffer (only define on physically contiguous heaps)
* @map_dma             map the memory for dma to a scatterlist
* @unmap_dma           unmap the memory for dma
* @map_kernel          map memory to the kernel
* @unmap_kernel        unmap memory to the kernel
* @map_user            map memory to userspace
*/
struct ion_heap_ops {
int (*allocate) (struct ion_heap *heap, struct ion_buffer *buffer, unsigned long len,unsigned long align, unsigned long flags);
void (*free) (struct ion_buffer *buffer);
int (*phys) (struct ion_heap *heap, struct ion_buffer *buffer, ion_phys_addr_t *addr, size_t *len);
struct scatterlist *(*map_dma) (struct ion_heap *heap, struct ion_buffer *buffer);
void (*unmap_dma) (struct ion_heap *heap, struct ion_buffer *buffer);
void * (*map_kernel) (struct ion_heap *heap, struct ion_buffer *buffer);
void (*unmap_kernel) (struct ion_heap *heap, struct ion_buffer *buffer);
int (*map_user) (struct ion_heap *mapper, struct ion_buffer *buffer, struct vm_area_struct *vma);
};

ION debug

ION 在/sys/kernel/debug/ion/ 提供一个debugfs 接口。

每个heap都有自己的debugfs目录,client内存使用状况显示在/sys/kernel/debug/ion/<<heap name>>

$cat /sys/kernel/debug/ion/ion-heap-1
client              pid             size
test_ion             2890            16384

每个由pid标识的client也有一个debugfs目录/sys/kernel/debug/ion/<<pid>>

$cat /sys/kernel/debug/ion/2890
heap_name:    size_in_bytes
ion-heap-1:    40960 11

参考文献

1. https://wiki.linaro.org/BenjaminGaignard/ion

2. http://lwn.net/Articles/480055/

3. http://lwn.net/Articles/472984/

android之ION内存管理器(1)-- 简介相关推荐

  1. android之ion内存储器管理器,Android ION

    场景:android之ION内存储器管理器(1)- 简介 android之ION内存管理器(1)-- 简介 by JHJ(jianghuijun211@gmail.com) 为什么需要ION 回顾20 ...

  2. linux内存管理之 ION 内存管理器浅析Ⅰ(system heap)

    目录 1 什么是ION 2 ION中不同 type 的 heap 3 ION分配(以system heap为例) 3.1 ion_alloc() 3.2 ion_system_heap_allocat ...

  3. ION内存管理器介绍

    1. ION介绍 ION是google在Android4.0为了解决内存碎片化管理而引入的通用内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc),虚拟 ...

  4. Android之ION内存管理分析

    备注:图片中的双向箭头表示他们是链表,前后链接起来的,单向箭头表示指针指向谁.     感兴趣可以加QQ群85486140,大家一起交流相互学习下! 做Camera都快2年了,对buffer流转,bu ...

  5. Android 简单的内存管理器

    由于公司项目需要,需要增加内存管理的功能,于是写了这个简单例子,实现的功能很简单,就是获取系统中正在运行的所有进程,并获取到每个进程所占的内存大小,以及系统剩余内存大小,并展示出来,然后通过点击每个进 ...

  6. linux内存管理之 ION 内存管理器浅析Ⅱ(system contig heap)

    目录 1 system contig heap 与 system heap 2 system contig heap创建 3 system contig heap内存分配 4 system conti ...

  7. Linux下ion内存,ION内存管理剖析.doc

    1.android之ION内存管理器(1)-- 简介 为什么需要ION 2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到kernel主线中. ...

  8. Linux驱动学习--android中的内存管理机制ION(一)--简单介绍

    目录 一.引言 二.ION的介绍及使用 ------> ION介绍 ------> ION的使用 ------> HEAP种类 三.接口分析 ------> 主要数据结构 -- ...

  9. Android ION 内存管理

    ION的设计初衷 Android为了更好的针对移动设备内存的管理,设计出了ION内存管理机制,主要是为了解决以下几个问题: 预留大块连续内存,比如camera,display,GPU等模块 避免内存随 ...

最新文章

  1. 今晚8点直播 | 深入浅出理解A3C强化学习
  2. 如何零门槛搭建实时音视频通信平台
  3. Shell编程(week4_day1)--技术流ken
  4. i.MX 系列CPU HAB漏洞SecureBoot漏洞
  5. JZOJ 5197. 【NOIP2017提高组模拟7.3】C
  6. Marketing Cloud demo环境和API使用方法说明
  7. learn python app v3_‎App Store 上的“Learn Python and Scratch”
  8. Unity SRP自定义渲染管线 -- 4.Spotlight Shadows
  9. git依赖python_python爬虫之git的安装
  10. 从一名Java初级程序员成长为一名合格的架构师
  11. linux系统网络老掉线,Linux使用ADSL上网时经常掉线
  12. SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理
  13. 白马非马的面向对象分析
  14. php fflush函数的用法,fflush 函数
  15. 计算机证英语四六级证驾驶证,学校毕业要求有两个技能证书,计算机二级,四六级,到底算不算技能证?...
  16. springBoot使用RestTemplate报错:No instance available for xxx.xxx.xxx.xxx
  17. Excel中如何对多个sheet进行同样的操作
  18. 如何安装 Ubuntu 22.04 LTS 桌面版 ?
  19. rust投递箱连接箱子_箱子、栈和堆
  20. Pandas 统计分析基础 笔记2 任务4.2 掌握DataFrame的常用操作

热门文章

  1. windows 2000/XP/2003服务全集
  2. html之div整体缩小,如何整体放大或缩小div元素
  3. 最新爱词霸 Java + mysql (含源码+数据库)
  4. 掌握这些核心算法,拿不到10个offer你来找我,我锤你个不争气的
  5. 学无人机需要精通计算机吗,无人机航测没有那么难,掌握软件应用及流程就可以上路了...
  6. 私域流量运营平台有哪些?
  7. php动画效果,动画效果总结
  8. hfish蜜罐搭建及简单使用
  9. c语言什么事结构体,C语言结构体定义是什么
  10. kubernetes Affinity亲和性