Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

用於GKI的模塊化ION堆

許多Android OEM出於各種原因修改ION內核驅動程序,例如添加供應商堆和自定義緩存管理(有關這些修改的詳細信息,請參閱集成ION內存分配器)。為了使OEM在使用通用內核映像(GKI)時保留此類修改,Android Common Kernel v5.4引入了一個框架,用於模塊化特定於供應商的ION堆,同時保持內置的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_partialdma_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),
};

另外,新的IOCTLION_IOC_ABI_VERSION )可以幫助用戶空間客戶端確定是否正在使用模塊化堆。

覆蓋通用系統堆

ION系統堆是內置的,並且是GKI映像的一部分,以確保需要訪問通用/獨立於設備的堆的任何功能都可以依賴於它的存在。因此,您無法覆蓋ION_HEAP_SYSTEM的堆ID。要創建自定義的系統堆,請使用自定義範圍( ION_HEAP_CUSTOM_STARTION_HEAP_CUSTOM_END )中的堆ID進行分配。