Android ION 内存管理
ION的设计初衷
Android为了更好的针对移动设备内存的管理,设计出了ION内存管理机制,主要是为了解决以下几个问题:
- 预留大块连续内存,比如camera,display,GPU等模块
- 避免内存随便花
- 用户控件和硬件之间实现”零拷贝”(zero-copy)的内存共享 做Android系统的,特别是跟Display,camera模块相关的
ION的官方介绍和历史由来查看下面的介绍:
https://lwn.net/Articles/480055/
ION的实现
Android系统的ION实现依赖于不同的CPU/GPU
硬件,Android提供了ION的框架供CPU厂商(NXP, Qualcomm, MTK, 海思等)在自己的BSP
里面实现ION
机制。
默认的ION驱动会提供以下三种不同的ION heaps
实现:
- ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc_user()
- ION_HEAP_TYPE_SYSTEM_CONFIG: memory allocated via kzalloc
- ION_HEAP_TYPE_CARVEOUT: carveout memory is physically contiguous and set aside at boot
CPU厂商会根据自己CPU的特性实现更多的ION heaps
,比如NVIDIA
提交了一种ION_HEAP_TYPE_IOMMU
的heap。
不管哪一种ION heaps
实现,都必须实现如下核心接口
|
|
简单概括一下
allocate()
和free()
分别用来从heap中分配或者释放一个ion_buffer对象- 连续的物理内存,
phys()
用来得到ion_buffer
对象的物理内存地址和大小 map_kernel()
和unmap_kernel()
分别用来把物理内存映射到内核虚拟地址空间map_user()
用来把物理内存映射到用户空间,当用户空间的文件描述符被释放的时候会自动取消映射,所以没有提供类似于unmap_user()
的函数
用户空间进程使用ION的情形
主要数据结构
在整个Android操作系统中,可以发现,比较好的框架,先去了解数据结构,就能猜到是如何实现的整个架构。
ion_device
ion_device
是ION驱动的最基础的一个对象,用来描述一个ion设备,其实在一个Android操作系统中,一般只有一个实例存在,用来统一管理ION Heaps,由CPU厂商自己的代码来创建。
|
|
struct ion_device
是ION的核心结构体,但是在用户空间是不可见的,是由CPU厂商的代码通过ion_device_create()
函数分配、初始化。
- dev成员,是一个
struct miscdevice
类型的杂项字符设备,用来连同内核和用户空间,open/ioctl - heaps成员,用来描述所有的
struct ion_heap
实例 - clients成员,用来管理所有
struct ion_client
ion_client
struct ion_client
是由ion_client_create()
创建,是通过struct ion_device
来创建的。
|
|
- node成员,用于将
struct ion_client
实例加入到struct ion_device
中ion_device::clients
- device成员,指向设备的
ion_device
- handles成员,是一个红黑树的根,用来管理它所拥有的handle,即
struct ion_handle
实例。一个struct ion_handle
实例代表一个buffer。ion_buffer
是从struct ion_heap
中分配的。
ion_heap
struct ion_heap
表示ION中的heap,被ion_device中的ion_device::heaps
所管理
|
|
ion_handle
struct ion_handle
其实就是buffer,用户永健用它来表示自己的buffer,通过ion_handle_create()
函数分配获得实例
|
|
- ref成员,是
struct kref
结构体类型,在kernel中被广泛的用来表示引用计数,用来记录handle被引用的次数,当引用计数为0时自动销毁。 - client成员,指向这个handle所属的client
- buffer成员,指向真正的buffer
ion_buffer
这个结构体很重要,通过ION分配的内存就是通过它表示的。
|
|
- ref成员,是
struct kref
结构体实例,维护了本ion_buffer
的引用计数。当引用计数为 0 时会释放该 buffer,即struct ion_heap_ops::free
会被调用。分配用ION_IOC_ALLOC
型 ioctl 系统调用,相应的释放用ION_IOC_FREE
型 ioctl 系统调用。 - size 成员,当然是本 buffer 所表示的空间的大小,用字节表示。
- priv_virt 成员,是所分配内存的虚拟地址啦,它常与
struct sg_table
,或者封装它的结构,有关。它不是我们在内核中读写时所需的内核虚拟地址啦,内核虚拟地址使用 vaddr 成员来表示的。一般而言,物理内存不连续的,使用本字段;否则使用下面的 priv_phys 字段,如struct ion_heap_ops contig_heap_ops
。 - priv_phys 成员,表示所分配的内存的物理地址。它适用于分配的物理内存是连续的 ion heap。这种连续的物理内存:在将其映射到用户空间时,即获取用户空间虚拟地址,可以使用
remap_pfn_range()
[memory.c] 这个方便的接口;在将其映射到内核空间时,即获取内核虚拟地址,可以使用vmap()
[vmalloc.c] 这个方便的接口。例子详见struct ion_heap_ops contig_heap_ops [exynos_ion.c]
。priv_virt 成员和 priv_phys 成员组成了一个联合体,其实都表示地址,只不过不同的场景下具体用的不一样而已。 - kmap_cnt 成员,记录本 buffer 被映射到内核空间的次数。
- vaddr 成员,是本 buffer 对应的内核虚拟地址。当 kmap_cnt 不为 0 时有效。可以通过
ion_map_kernel()
[ion.c] 来获取本 buffer 对应的内核虚拟地址。ion_map_kernel()
[ion.c] 实际上调用的是相应struct ion_heap_ops::map_kernel
回调函数获取相应的虚拟地址的。 - dmap_cnt 成员,记录本 buffer 被 mapped for DMA 的次数。
- sg_table 成员,是
struct sg_table
结构体类型的指针。本字段与 DMA 操作有关,而且仅仅在 dmap_cnt 成员变量不为 0 时是有效的。可以通过ion_buffer_create()
[ion.c] 来初始化本成员变量,该函数实际上是调用相应 ion_heap 所属的struct ion_heap_ops::map_dma
回调函数获取本字段的值的。 - dirty 成员,表示 bitmask。即以位图表示本 buffer 的哪一个 page 是 dirty 的,即不能直接用于 DMA。dirty 表示 DMA 的不一致性,即 CPU 缓存中的内容与内存中的实际内容不一样。
用一张图来展示这些数据结构之间的基本关系。后面一起来看看如何在用户空间和内核空间来使用ION 共享内存机制。
您的赞赏是对我最大的肯定
Android ION 内存管理相关推荐
- android之ION内存管理器(1)-- 简介
by JHJ(jianghuijun211@gmail.com) 为什么需要ION 回顾2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到ke ...
- Linux下ion内存,ION内存管理剖析.doc
1.android之ION内存管理器(1)-- 简介 为什么需要ION 2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到kernel主线中. ...
- Android之内存管理-内存监测-内存优化
推荐文章:Android进程与内存及内存泄漏 Android之内存管理 1.1 Dalvik Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础.其指令集基于寄存 ...
- Android 之 内存管理
概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...
- Android手机内存管理与性能优化
Android手机内存管理与性能优化&JNI.NDK高级编程(JNI.Dalvik.内存监测) 课程分类:Android 适合人群:中级 课时数量:34小节课时 用到技术:Dalvik,DDM ...
- Android之ION内存管理分析
备注:图片中的双向箭头表示他们是链表,前后链接起来的,单向箭头表示指针指向谁. 感兴趣可以加QQ群85486140,大家一起交流相互学习下! 做Camera都快2年了,对buffer流转,bu ...
- linux内存管理之 ION 内存管理器浅析Ⅰ(system heap)
目录 1 什么是ION 2 ION中不同 type 的 heap 3 ION分配(以system heap为例) 3.1 ion_alloc() 3.2 ion_system_heap_allocat ...
- linux ion 分配地址,Android ION内存分配
ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display controller以及camera等,在系统启动的时候,会为他们预留一些memory pools ...
- ION内存管理器介绍
1. ION介绍 ION是google在Android4.0为了解决内存碎片化管理而引入的通用内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc),虚拟 ...
最新文章
- 【转】使用Javascript改变HTML内容
- python里dir是什么意思_python中dir什么作用
- shipyard-----------docker容器的可视化管理
- linux 总数 进程_Linux运用一些常用命令,优秀的PHPer都需掌握
- Trie树的C++实现
- 六石管理学:提出分形进度的概念
- Qt加载gif动态图
- 给文字添加超链接,没有你想的那么难
- multisim红绿灯元器件在哪里_实验二Multisim交通灯仿真.ppt
- cf. ConneR and the A.R.C. Markland-N
- 程序猿想平稳度过35岁中年危机?不妨试着考个研
- easyPR车牌识别分析与测试结果
- 在html页面上引用脚本文件,如何在html中调用JS文件
- 因特网,万维网,互联网什么区别?
- Use After Free
- android的SDK、ADT下载地址
- Spring核心技术(十四)——ApplicationContext的额外功能
- SEO基础知识:什么是网站结构,为什么重要?
- JavaScript语言精粹--读书笔记三之replace()与正则
- 基于Python点餐外卖系统设计与实现 开题报告
热门文章
- 习题3-1至习题3-5
- python可视化库matplotlib_Python可视化库matplotlib(基础整理)
- 图像处理工具-Stirmark使用方法
- 远程调用:远程过程调用(RPC)和远程方法调用(RMI)
- 【序列建模】DIN深度兴趣网络
- MySQL函数(CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型)
- 计算机没网络本地连接接下来,电脑本地连接没有了网络连接的本地连接不见的解决方法...
- nginxgrafana监控面板显示nodatatoshow
- iOS框架介绍--EF字头
- 操作系统第五章 设备管理(上)笔记