Banyak OEM Android memodifikasi driver kernel ION karena berbagai alasan, seperti menambahkan heap vendor dan menyesuaikan pengelolaan 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 framework untuk memodularisasi heap ION khusus vendor sekaligus mempertahankan driver ION inti yang di-build. Gambar berikut menunjukkan tata letak image kernel.
Gambar 1. Driver kernel ION yang dimodulasi
Heap ION modular memiliki keunggulan berikut.
- Driver core ION dapat menjadi bagian dari image GKI, yang memungkinkan semua pengoptimalan performa dan perbaikan bug yang tidak bergantung pada perangkat untuk menjangkau semua perangkat.
- Driver core ION di kernel umum dapat menangani pendaftaran heap dan mengelola antarmuka ke klien kernel dan ruang pengguna. Modul heap vendor hanya diperlukan untuk menerapkan operasi heap kustom.
- Driver core ION (sebagai bagian dari GKI) dapat menyertakan hook untuk pelacakan penggunaan memori yang lebih mudah, yang tidak dapat dilakukan jika setiap OEM memiliki versi driver ION mereka sendiri.
- Heap ION vendor modular akan mempermudah transisi mendatang ke heap
dmabuf
.
Implementasi
Modul heap ION dapat mendaftarkan operasi dmabuf
-nya sendiri untuk mengganti operasi
yang terdaftar oleh driver ION inti. Operasi dmabuf
(seperti get_flags()
)
yang tidak didukung oleh driver ION inti akan menampilkan -EOPNOTSUPP
jika implementasi
heap tidak memiliki penggantian yang diperlukan.
Untuk meningkatkan performa, driver dmabuf
dapat melakukan pemeliharaan cache
sebagian (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.
Kernel Umum Android berisi implementasi modular dari sistem dan heap contiguous memory allocator (CMA) yang digunakan sebagai referensi untuk modularisasi heap.
Perubahan pada header UAPI ION
Header API ruang pengguna (UAPI) ION 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
(ION_IOC_ABI_VERSION
) baru dapat membantu klien ruang pengguna
menentukan apakah heap modular sedang digunakan.
Mengganti heap sistem generik
Heap sistem ION bawaan dan merupakan bagian dari image GKI untuk memastikan bahwa setiap
fitur yang memerlukan akses ke heap generik/yang tidak bergantung pada perangkat dapat bergantung pada
eksistensinya. Karena itu, Anda tidak dapat mengganti ID heap ION_HEAP_SYSTEM
. Untuk
membuat heap sistem yang disesuaikan, gunakan ID heap dalam rentang kustom
(ION_HEAP_CUSTOM_START
hingga ION_HEAP_CUSTOM_END
) untuk menjalankan alokasi.