為 GKI 模組化 ION 堆積

許多 Android OEM 會基於各種原因修改 ION 核心驅動程式,例如新增供應商堆疊和自訂快取管理 (如要進一步瞭解這些修改,請參閱「整合 ION 記憶體配置器」)。為讓原始設備製造商 (OEM) 在使用通用核心映像檔 (GKI) 時保留這類修改,Android 通用核心 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 來執行配置作業。