网站 制作登录,校园文化建设网站素材,怎么做中英文双语网站,wordpress 建视频网站目录
what is ION?
ION原理
ION数据结构
用户空间 API
ION API what is ION?
ION是Google的内存管理器#xff0c;用来支持不同的内存分配机制#xff0c;如CARVOUT(PMEM)#xff0c;物理连续内存(kmalloc), 虚拟地址连续但物理不连续内存(vmalloc)#xff0c; IOM…目录
what is ION?
ION原理
ION数据结构
用户空间 API
ION API what is ION?
ION是Google的内存管理器用来支持不同的内存分配机制如CARVOUT(PMEM)物理连续内存(kmalloc), 虚拟地址连续但物理不连续内存(vmalloc) IOMMU等。ION将内核态形形色色的内存分配纳入统一的管理接口之中更重要的设计意图是为内存在不同用户态进程之间传递和访问提供了支持。本文是基于展讯sc8830ec设备的ION代码的分析。
ION 内存管理从android4.0开始被引入
ION 模块是可扩展的API都是统一的支持各种形式的内存分配方式可以表述不同的硬件资源和他们的一些限制
ION 支持连续与不连续内存的分配
ION 给Kernel and User space processes提供了相应的APIs
ION原理
ION通过通用的接口管理不同类型的内存下面是ION的框架: 下图是两个client共享内存的示意图。图中有2个heap每种heap都有自己的内存分配策略每个heap中分配了若干个buffer。client的handle管理到对应的buffer。两个client是通过文件描述符fd来实现内存共享的。 ION数据结构
ion_heap用来管理buffer定义如下
struct ion_heap {struct ion_device *dev;enum ion_heap_type type;struct ion_heap_ops *ops;......};
每一种类型的memory都对应一个ion_heap类型的对象ion_heap的对象存放在dev中内存的类型存放做type中ops为内存的操作函数指针。
当用户要操作内存时通过type找到dev中对应的heap然后调用ops完成内存操作。
struct ion_device {struct miscdevice dev;struct rb_root buffers;struct plist_head heaps;long (*custom_ioctl) (struct ion_client *client, unsigned int cmd, unsigned long arg);struct rb_root clients;};
ion_device是miscdevice的封装buffers是存放ion_buffer对象的根结点heaps为存放ion_heap对象的列表custom_ioctl为自定义的操作函数clients为客户端根结点。
struct ion_client {struct rb_node node;struct ion_device *dev;struct rb_root handles;pid_t pid;};
node为链接client的结点
dev指向保存client的设备
handles为ion_handle结构体对象的跟节点
pid为client对应的进程id
ION 通过handle来管理buffer每一个handle对应一个buffer。
struct ion_handle {struct ion_client *client;struct ion_buffer *buffer;struct rb_node node;int id;};
client指向ion_client对象
buffer指向对应的ion_buffer对象。
用户空间 API
ION通过/dev/ion设备来与用户侧的程序交互交换函数的定义如下
static const struct file_operations ion_fops {.owner THIS_MODULE,.open ion_open,.release ion_release,.unlocked_ioctl ion_ioctl,};
定义了几种 ioctl 接口可以与用户应用程序交互。
ION_IOC_ALLOC: 分配内存
ION_IOC_FREE: 释放内存
ION_IOC_MAP: 获取文件描述符进行mmap
ION_IOC_SHARE: 创建文件描述符来实现共享内存
ION_IOC_IMPORT: 获取文件描述符
ION_IOC_SYNC同步共享文件到内存
ION_IOC_CUSTOM: 调用用户自定义的ioctl
ION_IOC_SHARE 及ION_IOC_IMPORT是基于DMABUF实现的所以当共享进程获取文件描述符后可以直接调用mmap来操作共享内存。mmap实现由DMABUF子系统调用ION子系统中mmap回调函数完成。
内核驱动也可以注册为一个ION的客户端client可以选择使用哪种类型的heap来申请内存。
ion_client_create: 分配一个客户端。
ion_client_destroy: 释放一个客户端及绑定在它上面的所有ion handle.
ion handle: 这里每个ion handle映射到一个buffer中每个buffer关联一个heap。也就是说一个客户端可以操作多块buffer。 ION 定义了几种不同的heap实现不同的内存分配策略。
ION_HEAP_TYPE_SYSTEM:通过vmalloc分配内存
ION_HEAP_TYPE_SYSTEM_CONTIG:通过kmalloc分配内存
ION_HEAP_TYPE_CARVEOUT: 在保留内存块中reserve memory分配内存
ION_HEAP_TYPE_CHUNK,
ION_HEAP_TYPE_DMA:通过DMA API分配内存
ION_HEAP_TYPE_CUSTOM: 由客户自己定义
ION_NUM_HEAPS 16
每一中类型对应不同的分配策略如果有新的分配策略可以方便的加入新的heap类型 在ION_HEAP_TYPE_CUSTOM中可以定义自己实现的分配策略。
ion提供的接口定义不同类型的内存可以调用内存分配策略
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);......};
这些接口不是暴露给驱动或者用户应用程序的。
Buffer 申请及释放函数: ion_alloc: 申请ion内存返回ion handle ion_free: 释放ion handle
ION API
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