android 内存管理 ion,Android学习之ION memory manager
ION是google在Android4.0 ICS为了解决内存碎片管理而引入的通用内存管理器,它会更加融合kernel。目前QCOM MSM, NVDIA
Tegra, TI OMAP, MRVL PXA都用ION替换PMEM。
ION与PMEM类似,管理一或多个内存池,其中有一些会在boot
time的时候预先分配,以备给特殊的硬件使用(GPU,显示控制器等)。
它通过ION
heaps来管理这些pool。它可以被userspace的process之间或者内核中的模块之间进行内存共享
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: 由客户自己定义
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/<
name>>$cat /sys/kernel/debug/ion/ion-heap-1
client pid size
test_ion 2890 16384
每个由pid标识的client也有一个debugfs目录/sys/kernel/debug/ion/<>$cat /sys/kernel/debug/ion/2890
heap_name: size_in_bytes
ion-heap-1: 40960 11
Kernel Driver间如何共享memory
kernel中使用ion_client_create来获得一个ion
client的句柄,
struct ion_client
*ion_client_create(struct ion_device *dev,unsigned int heap_mask, const
char *debug_name)
驱动通过userspace传递来的dev(/dev/ion)来获得一个ion client,
然后调用以下函数,把fd转换成driver认识的ion_handle objects
struct
ion_handle *ion_import_fd(struct ion_client *client, int fd_from_user);
如果像视频编解码硬件类似的driver需要操作物理上连续的空间,则还需要把ion_handle转换为一个物理连续的buffer
int ion_phys(struct ion_client *client, struct ion_handle
*handle,ion_phys_addr_t *addr, size_t *len)
userspace
side
ion通过/dev/ion设备来与用户侧的程序交互。userspace通过调用ioctl来进行内存的操作。
当获得该设备文件的描述符后,通过操作ion_allocation_data来获得所要的内存空间
struct ion_allocation_data {
size_t len;
size_t align;
unsigned int flags; -->可以制定从多种heap
type来获得所要的空间,这里需要注意,指定了多个type时,分配的顺序是由boot时加载heap(ion_device_add_heap())的顺序的LIFO。
struct ion_handle *handle;
}
分配内存的ioctl
int ioctl(int client_fd,
ION_IOC_ALLOC, struct ion_allocation_data *allocation_data)
请注意,userspace的操作都是基于打开的/dev/ion的文件描述符,通过它结合android中的IPC
Binder来在多个process之间传递fd,来达到共享内存的目的!!
相应的共享管理,依旧采用referrence count机制。
目前总有六个ioctl cmd提供给userspace
ION_IOC_ALLOC: 分配内存
ION_IOC_FREE: 释放内存
ION_IOC_MAP: 获得一个只想mmap映射的内存的文件描述符
ION_IOC_SHARE:
创建一个指向共享的内存的文件描述符
ION_IOC_IMPORT: 引入一个共享的文件描述符
ION_IOC_CUSTOM:
调用平台自定义的ioctl
其中ION_IOC_MAP/ION_IOC_SHARE使用一套代码完成,linaro建议只使用ION_IOC_SHARE这个cmd,以便能够不用区分实际map与mmap。
3.ION与DMABUF的比较
dma_buf 与
ion_buffer类似
dma_buf_attachment与ion_handle类似
两者的主要关注的方面不同,如下图
从中可以看出,DMABUF的适用面更广可以支持更多的平台,而ION目前只支持android。ION可以支持userspace端更方便的使用(这是android
driver的通性),而DMABUF只有kernel端的API,通常只对driver/kernel开发者开放接口。
目前Linaro正在努力整合CMA和ION,以期能够更好的利用ION的用户接口来利用DMABUF的DMA Mapping功能。
android 内存管理 ion,Android学习之ION memory manager相关推荐
- android 播放英强博客,Android内存管理、监测剖析
Android内存管理机制 Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制. Low ...
- Android内存管理
Android是一个基于Linux实现的操作系统.但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别.所以Android需要一套 ...
- Android内存管理机制
好文摘录 原作: https://www.cnblogs.com/nathan909/p/5372981.html 1.基于Linux内存管理 Android系统是基于Linux 2.6内核开发的开源 ...
- Android内存管理-SoftReference的使用
Android内存管理-SoftReference的使用 发布时间:2010-09-15 作者:Android开发网原创 很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每 ...
- Android 内存管理机制
本文主要包括三大部分内容: 内存管理基础:从整个计算机领域简述主要的内存管理技术. Linux的内存管理机制:Android毕竟是基于Linux内核实现的操作系统,因此有必要了解一下Linux的内存管 ...
- Android内存管理机制官方详解文档
很早之前写过一篇<Android内存管理机制详解>点击量已7万+,现把Google官方文档整理输出一下,供各位参考. 一.内存管理概览 Android 运行时 (ART) 和 Dalvik ...
- android 内存管理
文章目录 android 内存管理 其他参考 内存相关测评参考 进程间的内存分配 内存类型 内存页面 Attention! 内存不足管理 内核交换守护进程(Kswapd) 请求分页(Kswapd) 更 ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )
文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )
文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...
最新文章
- anaconda python 版本对应关系
- 【学术相关】国内考博需要怎么准备?难度大吗?有什么建议?
- python的django框架与springboot_Python系统教学|为什么Django框架在Python开发很重要?...
- 论文浅尝 | 基于动态记忆的原型网络进行元学习以实现少样本事件探测
- Pytorch —— BN、LN、IN、GN
- 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)
- 配置React Native环境
- 三角函数中和差角公式的编辑方法
- R语言使用lm函数构建线性回归模型、线性回归模型的诊断、使用influence.measures函数识别有影响力的观察值
- Pack up your loved ones 带上至亲至爱
- 注册一个微信公众号的测试平台
- 【C# 教程系列第 11 篇】什么是抽象类、抽象方法
- Ebay跨境智星:全自动批量注册及下单软件
- Intelsat-29e卫星解体全损,威胁地球静止轨道安全
- 怎么解决网页中播放视频没有声音?
- 构建之法10,11,12章的读后感
- 大象机器人推出史上最紧凑的六自由度机械臂-mechArm
- 用php模拟斗地主发牌,php 模拟斗地主发牌简单易懂
- NMT优化--Ensemble Decoding
- EXCEL Comapre工具使用说明
热门文章
- LumiLIFE智能机器鱼强势来袭,仅凭外表就萌众人一脸血
- linux i3 命令,i3 窗口管理器入门
- 订单系统订单表设计方案
- 从奶农倒奶看中国经济发展
- 基于苹果CMS系统的双端视频播放APP源码+视频教程
- C++数据共享与保护static活期存款篇
- JavaWeb课程设计-学生信息管理系统(Jsp+Servlet+MySql
- 3D雕刻和一般3D建模有什么区别,最广泛的雕刻软件ZBrush好学吗?
- 安装一个好用的Ubuntu桌面
- win10服务器系统好处,Win7对比win10的3大优势!难怪停止服务后,依然有人坚持使用...