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

1.android之ION内存管理器(1)-- 简介

为什么需要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

/kernel/common.git

ION codes reside in drivers/gpu/ion

Specific usage examples on omap4:

/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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值