為 GKI 模組化 ION 堆積

許多 Android 原始設備製造商 (OEM) 會基於各種原因修改 ION 核心驅動程式,例如: 新增廠商堆積並自訂快取管理 (如需各 請參閱整合 ION 記憶體 配置器)。如要讓原始設備製造商 (OEM) 在使用一般核心映像檔時保留這些修改內容 (GKI)、Android 通用核心 5.4 版引進了特定供應商模組化 ION 的架構 同時保有核心 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_STARTION_HEAP_CUSTOM_END) 執行分配作業。