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_SYNC
比 ION_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。