Modularisasi ION Heaps untuk GKI

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 .

Tumpukan ION Modular

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.