Banyak OEM Android memodifikasi driver kernel ION karena berbagai alasan, seperti menambahkan heap vendor dan menyesuaikan manajemen cache (untuk detail tentang modifikasi, lihat Mengintegrasikan memori ION alokator). Untuk memungkinkan OEM mempertahankan modifikasi tersebut saat menggunakan Generic Kernel Image (GKI), Android Kernel umum v5.4 memperkenalkan framework untuk memodularisasi ION khusus vendor heap dengan tetap mempertahankan driver ION inti. Gambar berikut menunjukkan {i>kernel image<i}.
Gambar 1. Driver kernel ION modular
Heap ION modular memiliki keuntungan berikut.
- Driver inti ION dapat menjadi bagian dari image GKI, yang memungkinkan semua pengoptimalan performa yang tidak tergantung perangkat dan perbaikan bug untuk menjangkau semua perangkat.
- Driver inti ION dalam kernel umum dapat menangani pendaftaran heap dan mengelola antarmuka ke {i>userspace<i} dan klien {i>kernel<i}. Modul heap vendor hanya diperlukan untuk mengimplementasikan operasi heap kustom.
- Driver inti ION (sebagai bagian dari GKI) dapat menyertakan hook untuk memudahkan memori pelacakan penggunaan, yang tidak mungkin dilakukan bila setiap OEM memiliki driver ION.
- Heap ION vendor modular harus membuat transisi berikutnya ke heap
dmabuf
semuanya.
Implementasi
Modul heap ION dapat mendaftarkan operasi dmabuf
-nya sendiri untuk mengganti operasi yang telah dijalankan
yang didaftarkan oleh driver ION inti. Operasi dmabuf
(seperti get_flags()
)
yang tidak didukung oleh driver ION inti akan menampilkan -EOPNOTSUPP
jika heap
tidak memiliki penggantian yang diperlukan.
Untuk meningkatkan performa, driver dmabuf
dapat melakukan cache sebagian
pemeliharaan (lihat
daftar perubahan).
Klien kernel dapat menggunakan dma_buf_begin_cpu_access_partial
dan
Fungsi dma_buf_end_cpu_access_partial
untuk melakukan pemeliharaan cache sebagian.
Kernel Umum Android berisi implementasi modular dari sistem dan heap contiguous memory allocator (CMA) untuk digunakan sebagai referensi heap modularisasi.
Perubahan pada header ION UAPI
Header API ruang pengguna (UAPI) ION berisi enum ion_heap_id
untuk digunakan di
dengan menentukan kisaran 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
yang memerlukan akses ke heap generik/independen perangkat dapat bergantung pada
keberadaannya. Karena itu, Anda tidak dapat mengganti ID heap ION_HEAP_SYSTEM
. Kepada
membuat heap sistem yang disesuaikan, menggunakan ID heap dalam rentang khusus
(ION_HEAP_CUSTOM_START
hingga ION_HEAP_CUSTOM_END
) untuk menjalankan alokasi.