Banyak OEM Android memodifikasi driver kernel ION karena berbagai alasan, seperti menambahkan tumpukan vendor dan menyesuaikan manajemen cache (untuk detail tentang modifikasi ini, lihat Mengintegrasikan pengalokasi memori ION ). Agar OEM dapat mempertahankan modifikasi tersebut saat menggunakan Generic Kernel Image (GKI) , Android Common Kernel v5.4 memperkenalkan kerangka kerja untuk memodulasi tumpukan ION khusus vendor sambil mempertahankan driver ION inti yang sudah terpasang. Gambar berikut menunjukkan tata letak gambar kernel .
Gambar 1. Driver kernel ION termodulasi
Tumpukan ION modular memiliki keuntungan sebagai berikut.
- Driver inti ION dapat menjadi bagian dari citra GKI, memungkinkan semua pengoptimalan kinerja independen perangkat dan perbaikan bug dapat menjangkau semua perangkat.
- Driver inti ION di kernel umum dapat menangani registrasi heap dan mengelola antarmuka ke ruang pengguna dan klien kernel. Modul heap vendor hanya diperlukan untuk mengimplementasikan operasi heap kustom.
- Driver inti ION (sebagai bagian dari GKI) dapat menyertakan kait untuk memudahkan pelacakan penggunaan memori, yang tidak mungkin dilakukan jika setiap OEM memiliki versi driver ION sendiri.
- Tumpukan ION vendor modular akan mempermudah transisi ke tumpukan
dmabuf
di masa mendatang.
Menerapkan
Modul heap ION dapat mendaftarkan operasi dmabuf
sendiri untuk menggantikan operasi yang didaftarkan oleh driver ION inti. Operasi dmabuf
(seperti get_flags()
) yang tidak didukung oleh driver ION inti akan mengembalikan -EOPNOTSUPP
jika implementasi heap tidak memiliki penggantian yang diperlukan.
Untuk meningkatkan kinerja, driver dmabuf
dapat melakukan pemeliharaan cache parsial (lihat daftar perubahan ). Klien kernel dapat menggunakan fungsi dma_buf_begin_cpu_access_partial
dan dma_buf_end_cpu_access_partial
untuk melakukan pemeliharaan cache parsial.
Android Common Kernel berisi implementasi modular sistem dan tumpukan pengalokasi memori bersebelahan (CMA) untuk digunakan sebagai referensi untuk modularisasi tumpukan.
Perubahan pada header ION UAPI
Header ION user space API (UAPI) berisi enum ion_heap_id
untuk digunakan dalam menentukan rentang ID heap untuk digunakan oleh heap vendor.
/**
* 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),
};
Selain itu, IOCTL
baru ( ION_IOC_ABI_VERSION
) dapat membantu klien ruang pengguna menentukan apakah tumpukan modular sedang digunakan.
Mengganti tumpukan sistem generik
Heap sistem ION sudah terpasang dan merupakan bagian dari citra GKI untuk memastikan bahwa fitur apa pun yang memerlukan akses ke heap generik/tidak bergantung pada perangkat dapat bergantung pada keberadaannya. Oleh karena itu, Anda tidak dapat mengganti ID heap ION_HEAP_SYSTEM
. Untuk membuat tumpukan sistem yang disesuaikan, gunakan ID tumpukan dalam rentang khusus ( ION_HEAP_CUSTOM_START
hingga ION_HEAP_CUSTOM_END
) untuk melakukan alokasi.