参考:android内存管理之ion - 知乎 (zhihu.com)
ion简介
ion是一个内存管理框架,产生于安卓内核,后面linux合近内核中。主要用于多媒体,gpu等需要连续大片物理内存的场景。
ion主要用途
1.内核模块之间通信。
2.内核到用户空间之间内存共享。
3.用户空间到内核之间内存共享。
4.用户空间不同进程内存共享。
ion框架图
自底向上详解
- 操作系统将内存堆分为很多块,而ion常用的有这四种。也就是他可以使用这四种类型的堆内存。使用时调用的是该内存堆类型的分配,释放,等操作函数。不受限于kmalloc或者vmalloc这种。前提需要注册ion_heap_ops。
- ion 核心即是ion 框架也是ion device。全局只有一个,通过访问该设备进行资源分配,操作等。
- ion driver根据dts创建ion heaps ,ion device,并创建一些用于debug的节点
- 不同的进程通过访问ion device分配客户端,一个进程只有一个client。
不同内存堆都有什么区别
- ION_HEAP_TYPE_SYSTEM:使用vmalloc分配的,物理内存不连续,虚拟地址连续。
- ION_HEAP_TYPE_SYSTEM_CONTIG:使用kmalloc分配,物理地址连续。
- ION_HEAP_TYPE_CARVEOUT:从预留的堆中分配连续物理内存。
- ION_HEAP_TYPE_CHUNK:分配的是固定大小的内存,按2^n * 4K(页面大小)对齐。
- ION_HEAP_TYPE_DMA:通过DMA API操作。
- ION_HEAP_TYPE_CMA_RESERVED:通过 CMA(Contiguous Memory Allocator)分配内存。
重要的数据结构
- ion_device设备驱动数据结构,ion是基于(也可以说是继承)misc(杂项设备)的,所以正常情况是挂载到 /dev 目录下。
- ion_device 管理了所有的client ,ion_heap,buffer,ion_share_handle(因为他不属于某个client)