模組化 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驅動程式可以執行部分快取維護(請參閱變更清單)。核心客戶端可以使用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),
};

此外,新的IOCTL ( ION_IOC_ABI_VERSION ) 可以幫助使用者空間用戶端決定是否正在使用模組化堆。

覆蓋通用系統堆

ION 系統堆是內建的,並且是 GKI 映像的一部分,以確保任何需要存取通用/裝置無關堆的功能都可以依賴其存在。因此,您無法覆寫ION_HEAP_SYSTEM的堆 ID。若要建立自訂系統堆,請使用自訂範圍( ION_HEAP_CUSTOM_STARTION_HEAP_CUSTOM_END )內的堆 ID 來執行指派。