許多 Android 原始設備製造商 (OEM) 會基於各種原因修改 ION 核心驅動程式,例如: 新增廠商堆積並自訂快取管理 (如需各 請參閱整合 ION 記憶體 配置器)。如要讓原始設備製造商 (OEM) 在使用一般核心映像檔時保留這些修改內容 (GKI)、Android 通用核心 5.4 版引進了特定供應商模組化 ION 的架構 同時保有核心 ION 驅動程式。下圖顯示 核心圖片版面配置
圖 1. 模組化 ION 核心驅動程式
模組化 ION 堆積有下列優點。
- ION 核心驅動程式可包含在 GKI 映像檔中, 將個別裝置的效能最佳化,並修正錯誤。 裝置。
- 通用核心中的 ION 核心驅動程式可處理堆積註冊和 管理使用者空間和核心用戶端的介面供應商堆積模組 只需要實作自訂堆積作業即可
- ION 核心驅動程式 (做為 GKI 的一部分) 可包含可輕鬆記憶體的掛鉤 因此,如果每個原始設備製造商 (OEM) 都有自己的 ION 驅動程式。
- 模組供應商 ION 堆積應日後再改用
dmabuf
堆積 讓您更容易
實作
ION 堆積模組可以註冊自己的 dmabuf
作業來覆寫這些作業
由核心 ION 驅動程式註冊。dmabuf
作業 (例如 get_flags()
)
但核心 ION 驅動程式不支援的堆積,會傳回 -EOPNOTSUPP
。
缺少必要的覆寫值
為提升效能,dmabuf
驅動程式可以執行部分快取
維護 (請參閱
變更清單)。
核心用戶端可以使用 dma_buf_begin_cpu_access_partial
和
執行部分快取維護作業的 dma_buf_end_cpu_access_partial
函式。
Android 通用核心包含系統的模組化實作項目 連續記憶體配置器 (CMA) 堆積,可做為堆積的參考 模組化
ION UAPI 標頭變更
ION userspace 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。目的地:
如要建立自訂系統堆積,請使用自訂範圍內的堆積 ID
(ION_HEAP_CUSTOM_START
至 ION_HEAP_CUSTOM_END
) 執行分配作業。