首先介绍下相关概念:
GraphicBuffer
GraphicBuffer是Surface系统中一个高层次的显示内存管理类,它封装了和硬件相关的一些细节,简化了应用层的处理逻辑。
Surface是Andorid窗口的描述,是ANativeWindow的实现;同样GraphicBuffer是Android中图形Buffer的描述,是ANativeWindowBuffer的实现。而一个窗口,可以有几个Buffer。
GraphicBuffer的左膀右臂,GraphicBufferAllocator和GraphicBufferMapper!从Android 8.0开始,Android 操作系统框架在架构方面的一项重大改变,提出了treble 项目。Vendor的实现和Androd的实现分开,Android和HAL,采用HwBinder进行通信,减少Android对HAL的直接依赖。这里的Allocator和Mapper,就是对HAL结合的包装;IAllocator,IMapper的HAL的接口。V2_1::IMapper是一个对Gralloc HAL的2.1版本。
Gralloc
GraphicBufferAllocator在创建时,会首先调用hw_get_module取出一个hw_module_t类型的对象。从名字上看,它和硬件平台有关系。它会加载一个叫libgralloc.硬件平台名.so的动态库。比如,/system/lib/hw/libgraolloc.so.
这个库有什么用呢?简言之,就是为了分配一块用于显示的内存,但为什么需要这种层层封装呢?答案很简单: 封装的目的就是为了屏蔽不同硬件平台的差别。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2e418b6b7aec4488aad34ad1b64a3ae2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tMWUFaV1M=,size_16,color_FFFFFF,t_70#pic_center)
ION
Ion Buffer是一种内存分配器,是Android 4.0版本开始引入的,用以取代被诟病的PMEM,完美解决内存碎片管理。Ion管理着一个或多个内存池,其中有一些会在启动的时候预先分配,供一些特殊的设备使用,比如GPU,Display。 Ion定义了6种不同的heap类似,实现不同的分配策略:
enum ion_heap_type {
ION_HEAP_TYPE_SYSTEM,
ION_HEAP_TYPE_SYSTEM_CONTIG,
ION_HEAP_TYPE_CARVEOUT,
ION_HEAP_TYPE_CHUNK,
ION_HEAP_TYPE_DMA,
ION_HEAP_TYPE_CUSTOM,
ION_NUM_HEAPS = 16,
};
ION_HEAP_TYPE_SYSTEM 通过vmallc分配,vmalloc只保证内存在虚拟地址空间是连续的。
ION_HEAP_TYPE_SYSTEM_CONTIG 通过kmalloc分配,kmalloc保证物理地址也是连续的。
ION_HEAP_TYPE_CARVEOUT 从保留的carveout 中分配一个heap,分配的内存是物理连续的。
ION_HEAP_TYPE_CHUNK 分配一快大内存
ION_HEAP_TYPE_DMA 通过DMA API分配内存,DMA的Buffer
ION_HEAP_TYPE_CUSTOM 由用户自己定义,在enum中,必须是最后,这种heap比较特殊
参考: http://www.cocoachina.com/articles/35303#IMapper_820 https://www.kancloud.cn/alex_wsc/android_depp/412982
|