Memodularisasi heap ION untuk GKI

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}.

Heap ION Modular

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.