四,ION堆
类似于其 PMEM身,ION 管理一个或多个内存池,其中一些在启动时被预留,以对抗碎片化或满足特殊硬件需求。GPU、显示控制器和相机是一些可能具有特殊内存需求的硬件模块。ION 将其内存池呈现为 ION 堆。每种类型的 Android 设备可以根据其内存需求配置不同的 ION 堆。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);
struct scatterlist *(*map_dma) (struct ion_heap *heap,
struct ion_buffer *buffer);//映射dma。
void (*unmap_dma) (struct ion_heap *heap,
struct ion_buffer *buffer);//解映射dma。
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 *heap, struct