android之ion内存储器管理器,Android ION
场景:android之ION内存储器管理器(1)- 简介
android之ION内存管理器(1)-- 简介
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/<>
$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
参考文献
1. https://wiki.linaro.org/BenjaminGaignard/ion
2. http://lwn.net/Articles/480055/
3. http://lwn.net/Articles/472984/
android之ion内存储器管理器,Android ION相关推荐
- android用什么包管理器,android – 包管理器已经死了
我收到一个安装了大量应用程序的用户的邮件,当我的应用程序使用此代码收集活动信息时,他有问题: getPackageManager().queryIntentActivities(mAinIntent, ...
- android 跳转电池管理器,android – 如何在MIUI设备中打开管理应用程序电池使用设置...
您可以尝试以下几种方法: 我个人没有5.1设备但是通过模拟器试了一下 Intent batterySaver = new Intent(); battSaverIntent.setComponent( ...
- android之ION内存管理器(1)-- 简介
by JHJ(jianghuijun211@gmail.com) 为什么需要ION 回顾2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到ke ...
- android fragment 管理器,Android Fragment 與 Fragment管理器
Android Fragment 與 Fragment管理器 首先談談Fragement的需求 過去開發人員認為界面之間的跳轉只需要使用多個activity組成就行了: 例如下圖中,在Activity ...
- Android时间触发,设置闹钟管理器Android中的时间 - 立即触发闹钟
这里我试图通过使用AlarmManger类设置闹钟.它与我工作正常,但当我设置闹钟时间后小时或分钟时间选择器,它会立即启动时,我保存该报警.闹钟.我需要警报熄灭,直到我设定时间. 下面是我的代码正在工 ...
- linux内存管理之 ION 内存管理器浅析Ⅰ(system heap)
目录 1 什么是ION 2 ION中不同 type 的 heap 3 ION分配(以system heap为例) 3.1 ion_alloc() 3.2 ion_system_heap_allocat ...
- ION内存管理器介绍
1. ION介绍 ION是google在Android4.0为了解决内存碎片化管理而引入的通用内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc),虚拟 ...
- android的线程管理器,[Android开源]:一款安全、轻巧、简单的线程池管理器EasyThread...
EasyThread通过对原生的线程池进行封装,可让你更方便的进行线程任务操作. 特性 简单轻巧:方法数不过百,无额外次级依赖. 配置灵活:可方便.灵活的对每次所启动的任务,配置线程名.线程优先级等. ...
- android 布局管理器,【Android开发】布局管理器-表格布局
在XML布局文件中定义表格布局管理器的基本语法: 属性列表 > 需要添加的UI组件 多个TableRow TableLayout支持的XML属性: android:collapseColumns ...
最新文章
- 实现el-dialog的拖拽,全屏,缩小功能
- LOJ#2353 货币兑换
- 文献学习(part80-A)--Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?
- Javascript实现的左右滑动菜单
- Java原生序列化、Avro、RPC与Log4j
- 开源组件 Ehcache中被曝严重漏洞,影响多款Jira产品
- lwip协议栈实现服务器端主动发送,lwip协议栈源码详解说明 - 全文
- Docker引擎客户端工具docker的总结
- P问题、NP问题、NPC问题和NP-hard问题详解
- Python 阿拉伯数字转换成英文
- 日记 [2006年06月06日] 庞加莱猜想
- 提问(小白问题):为什么这里调试的时候无法输入
- 【唐诗学习】一、古诗概述
- Qt QStringLiteral
- 利用高德地图通过给定坐标点画带箭头方向的路径
- 【编码】数据库编码报错
- [CF765F]Souvenirs
- 做北京linux培训哪家好?
- Axure9 最新授权码,持续更新中
- Win10磁盘占用达到100%,优化一下就解决了
热门文章
- 【笔记】专访大象声科汪德亮:利用深度学习解决「鸡尾酒会问题 」
- [NOIP1996 提高组] 挖地雷(C++,DP)
- 联邦学习开源框架FATE助力腾讯神盾沙箱,携手打造数据安全合作生态
- 北京积分落户2018年与2019年分析
- 购物商城订单分库分表应该如何设计
- python xlrd_python学习之xlrd的使用
- Javaweb课程设计(简单的个人博客)
- 专家称:人工智能有意识还得很多年
- 好巧,七夕最新8月书单出炉!送给你程序员
- uni-app - 城市选择索引列表 / 通过 A-Z 排序的城市列表(uview 组件库 IndexList 索引列表)