Memodulasi Tumpukan ION 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 ). Untuk memungkinkan OEM mempertahankan modifikasi tersebut saat menggunakan Generic Kernel Image (GKI) , Android Common Kernel v5.4 memperkenalkan kerangka kerja untuk memodulasi tumpukan ION khusus vendor sekaligus menjaga driver ION inti bawaan. 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 gambar GKI, memungkinkan semua pengoptimalan kinerja independen perangkat dan perbaikan bug untuk 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 pelacakan penggunaan memori yang lebih mudah, yang tidak mungkin dilakukan jika setiap OEM memiliki versi driver ION mereka sendiri.
  • Tumpukan ION vendor modular harus membuat transisi di masa mendatang ke tumpukan dmabuf lebih mudah.

Menerapkan

Modul heap ION dapat mendaftarkan operasi dmabuf mereka sendiri untuk menimpa operasi yang didaftarkan oleh driver ION inti. Operasi dmabuf (seperti get_flags() ) yang tidak didukung oleh driver ION inti 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 dari sistem dan heap contiguous memory allocator (CMA) untuk digunakan sebagai referensi untuk modularisasi heap.

Perubahan pada tajuk 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 ( ION_IOC_ABI_VERSION ) baru dapat membantu klien ruang pengguna menentukan apakah tumpukan modular sedang digunakan.

Mengganti tumpukan sistem generik

Heap sistem ION sudah ada di dalamnya dan merupakan bagian dari image GKI untuk memastikan bahwa fitur apa pun yang memerlukan akses ke heap generik/independen perangkat dapat bergantung pada keberadaannya. Dengan demikian, Anda tidak dapat mengganti ID heap dari 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.