ION ABI 變更

ION 核心模組的主要重構作業會影響裝置出貨核心 4.14 以上版本,許多廠商圖形記憶體配置器 (gralloc) 硬體抽象層 (HAL) 實作項目都會呼叫分配共用記憶體緩衝區。本頁面提供有關將舊版供應商程式碼遷移至新版 ION 的指引,並討論未來可能發生的應用程式二進位介面 (ABI) 中斷情形。

關於 ION

ION 是上游核心工作中 staging 樹狀結構的一部分。在測試期間,ION 的使用者空間對核心 ABI 可能會在主要核心版本之間中斷。雖然 ION ABI 中斷不會直接影響一般應用程式或已推出的裝置,但供應商遷移至新的主要核心版本時,可能會遇到會影響供應商程式碼呼叫 ION 的變更。此外,當 Android 系統團隊與上游合作,將 ION 移出測試樹時,未來可能會發生 ABI 中斷情形。

android-4.14 中的變更

核心 4.12 大幅重構 ION 核心程式碼,清理並移除與其他核心架構重疊的 ION 部分。因此,許多舊版 ION 類別不再具有關聯性,因此已移除。

移除 ION 用戶端和句柄

在核心 4.12 之前,開啟 /dev/ion 會分配 ION 用戶端ION_IOC_ALLOC ioctl 會配置新的緩衝區,並將其傳回至使用者空間,做為 ION 句柄 (只有為其配置的 ION 用戶端才會認為有意義的不明確整數)。如要將緩衝區對應至使用者空間,或與其他程序共用,請使用 ION_IOC_SHARE ioctl 將 ION 句柄重新匯出為 dma-buf fd。

在核心 4.12 中,ION_IOC_ALLOC ioctl 會直接輸出 dma-buf fds。中間 ION 句柄狀態已移除,連同所有用於消耗或產生 ION 句柄的 ioctl。由於 dma-buf 檔案描述符並未與特定 ION 用戶端繫結,因此不再需要 ION_IOC_SHARE ioctl,且所有 ION 用戶端基礎架構都已移除。

新增快取一致性 ioctl

在核心 4.12 之前,ION 提供 ION_IOC_SYNC ioctl,用於將檔案描述元與記憶體同步。這個 ioctl 的說明不完整,且不夠靈活。因此,許多供應商實作了自訂 ioctl 來執行快取維護作業。

核心 4.12 將 ION_IOC_SYNC 替換為 linux/dma-buf.h 中定義的 DMA_BUF_IOCTL_SYNC ioctl。在每個 CPU 存取開始和結束時呼叫 DMA_BUF_IOCTL_SYNC,並使用旗標指定這些存取作業是屬於讀取和/或寫入。雖然 DMA_BUF_IOCTL_SYNCION_IOC_SYNC 更冗長,但它可讓使用者空間進一步控制基礎快取維護作業。

DMA_BUF_IOCTL_SYNC 是核心穩定 ABI 的一部分,無論 dma-buf fds 是否由 ION 分配,均可使用。

將廠商程式碼遷移至 android-4.12 以上版本

對於 userspace 用戶端,Android 系統團隊強烈建議使用 libion,不要使用開放式編碼 ioctl() 呼叫。自 Android 9 起,libion 會在執行階段自動偵測 ION ABI,並嘗試遮蔽核心之間的任何差異。不過,在 4.12 版核心之後,任何產生或消耗 ion_user_handle_t 句柄的 libion 函式都將無法運作。您可以使用下列 dma-buf 檔案描述符的等效作業取代這些函式,這些函式可在目前所有核心版本上運作。

舊版 ion_user_handle_t 呼叫 等效的 dma-buf fd 呼叫
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) 不適用 (使用 dma-buf fds 時不需要這個呼叫)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) 不適用 (使用 dma-buf fds 時不需要這個呼叫)
ion_sync_fd(ion_fd, buf_fd)
If (ion_is_legacy(ion_fd))
    ion_sync_fd(ion_fd, buf_fd);
else
    ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

對於核心內用戶端,由於 ION 不再匯出任何核心面向的 API,因此先前使用核心內 ION 核心 API 搭配 ion_import_dma_buf_fd() 的驅動程式,必須轉換為使用核心內 dma-buf API 搭配 dma_buf_get()

未來 ION ABI 中斷

在 ION 移出暫存區樹狀結構之前,日後的核心版本可能需要再次破壞 ION ABI。Android 系統團隊不認為這些異動會影響搭載下一個 Android 版本的裝置,但這類異動可能會影響搭載後續 Android 版本的裝置。

舉例來說,上游社群建議將單一 /dev/ion 節點分割為多個堆節點 (例如 /dev/ion/heap0),讓裝置能夠為每個堆應用不同的 SELinux 政策。如果在日後的核心版本中導入這項變更,就會破壞 ION ABI。