Memodularisasi heap ION untuk GKI

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.

Heap ION Modular

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.