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