許多Android OEM出於各種原因修改ION內核驅動程序,例如添加供應商堆和自定義緩存管理(有關這些修改的詳細信息,請參閱集成ION內存分配器)。為了使OEM在使用通用內核映像(GKI)時保留此類修改,Android Common Kernel v5.4引入了一個框架,用於模塊化特定於供應商的ION堆,同時保持內置的ION核心驅動程序。下圖顯示了內核映像佈局。
圖1.模塊化的ION內核驅動程序
模塊化ION堆具有以下優點。
- ION核心驅動程序可以成為GKI映像的一部分,從而使所有與設備無關的性能優化和錯誤修復可以覆蓋所有設備。
- 通用內核中的ION核心驅動程序可以處理堆註冊並管理與用戶空間和內核客戶端的接口。只有實現自定義堆操作才需要供應商堆模塊。
- ION核心驅動程序(作為GKI的一部分)可以包括掛鉤,以簡化內存使用情況的跟踪,而每個OEM都有自己的ION驅動程序版本時,這是不可能的。
- 模塊化供應商ION堆應該使將來向
dmabuf
堆的任何過渡都更加容易。
實施中
ION堆模塊可以註冊自己的dmabuf
操作,以覆蓋由核心ION驅動程序註冊的操作。如果堆實現缺少必要的替代,則核心ION驅動程序不支持的dmabuf
操作(例如get_flags()
)將返回-EOPNOTSUPP
。
為了提高性能, dmabuf
驅動程序可以執行部分緩存維護(請參閱changelist )。內核客戶端可以使用dma_buf_begin_cpu_access_partial
和dma_buf_end_cpu_access_partial
函數執行部分緩存維護。
Android公用內核包含系統的模塊化實現和連續的內存分配器(CMA)堆,以用作堆模塊化的參考。
對ION UAPI標頭的更改
ION用戶空間API(UAPI)標頭包含ion_heap_id
枚舉,用於定義供供應商堆使用的堆ID範圍。
/**
* ion_heap_id - list of heap IDs that Android can use
*
* @ION_HEAP_SYSTEM ID for the ION_HEAP_TYPE_SYSTEM
* @ION_HEAP_DMA_START Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
* @ION_HEAP_DMA_END End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
* @ION_HEAP_CUSTOM_START Start of reserved ID range for heaps of custom type
* @ION_HEAP_CUSTOM_END End of reserved ID range for heaps of custom type
*/
enum ion_heap_id {
ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),
ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),
ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),
ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};
另外,新的IOCTL
( ION_IOC_ABI_VERSION
)可以幫助用戶空間客戶端確定是否正在使用模塊化堆。
覆蓋通用系統堆
ION系統堆是內置的,並且是GKI映像的一部分,以確保需要訪問通用/獨立於設備的堆的任何功能都可以依賴於它的存在。因此,您無法覆蓋ION_HEAP_SYSTEM
的堆ID。要創建自定義的系統堆,請使用自定義範圍( ION_HEAP_CUSTOM_START
到ION_HEAP_CUSTOM_END
)中的堆ID進行分配。