Dukungan modul kernel

Image kernel generik (GKI) mungkin tidak berisi dukungan driver yang diperlukan untuk memungkinkan perangkat memasang partisi. Untuk mengaktifkan perangkat agar dapat memasang partisi dan melanjutkan booting, init tahap pertama ditingkatkan untuk memuat modul kernel yang ada di ramdisk. Ramdisk dibagi menjadi ramdisk generik dan vendor. Modul kernel vendor disimpan di ramdisk vendor. Urutan pemuatan modul kernel dapat dikonfigurasi.

Lokasi modul

Ramdisk adalah sistem file untuk init, tahap pertama dan untuk image recovery/fastbootd di perangkat A/B dan A/B virtual. initramfs adalah initramfs yang terdiri dari dua arsip cpio yang digabungkan oleh bootloader. Arsip cpio pertama, yang disimpan sebagai ramdisk vendor di partisi vendor-boot, berisi komponen berikut:

  • Modul kernel vendor init tahap pertama, yang terletak di /lib/modules/.
  • File konfigurasi modprobe, yang berada di /lib/modules/: modules.dep, modules.softdep, modules.alias, modules.options.
  • File modules.load yang menunjukkan modul mana yang akan dimuat selama inisialisasi tahap pertama, dan dalam urutan apa, di /lib/modules/.
  • Modul kernel pemulihan vendor, untuk perangkat A/B dan A/B Virtual, di /lib/modules/
  • modules.load.recovery yang menunjukkan modul yang akan dimuat, dan urutannya, untuk perangkat A/B dan A/B Virtual, di /lib/modules.

Arsip cpio kedua, yang disertakan dengan GKI sebagai ramdisk boot.img dan diterapkan di atas yang pertama, berisi first_stage_init dan library yang menjadi dependensinya.

Pemuatan modul dalam inisialisasi tahap pertama

init tahap pertama dimulai dengan membaca file konfigurasi modprobe dari /lib/modules/ di ramdisk. Selanjutnya, ia membaca daftar modul yang ditentukan dalam /lib/modules/modules.load (atau dalam kasus pemulihan, /lib/modules/modules.load.recovery) dan mencoba memuat setiap modul tersebut secara berurutan, mengikuti konfigurasi yang ditentukan dalam file yang dimuat sebelumnya. Urutan yang diminta mungkin berbeda untuk memenuhi dependensi berat atau ringan.

Membangun dukungan, inisialisasi tahap pertama

Untuk menentukan modul kernel yang akan disalin ke vendor ramdisk cpio, cantumkan modul tersebut di BOARD_VENDOR_RAMDISK_KERNEL_MODULES. Build berjalan depmod pada modul ini dan menempatkan file konfigurasi modprobe yang dihasilkan di cpio ramdisk vendor.

Build juga membuat file modules.load dan menyimpannya di cpio ramdisk vendor. Secara default, file ini berisi semua modul yang tercantum di BOARD_VENDOR_RAMDISK_KERNEL_MODULES. Untuk mengganti isi file tersebut, gunakan BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD, seperti yang ditunjukkan dalam contoh ini:

BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
    device/vendor/mydevice-kernel/first.ko \
    device/vendor/mydevice-kernel/second.ko \
    device/vendor/mydevice-kernel/third.ko

Dukungan build, Android penuh

Seperti pada rilis Android 10 dan yang lebih rendah, modul kernel yang tercantum di BOARD_VENDOR_KERNEL_MODULES disalin oleh build platform Android ke partisi vendor di /vendor/lib/modules. Build platform menjalankan depmod pada modul ini, dan menyalin file output depmod ke partisi vendor di lokasi yang sama. Mekanisme untuk memuat modul kernel dari /vendor tetap sama seperti pada rilis Android sebelumnya. Anda yang memutuskan cara dan waktu pemuatan modul ini, meskipun biasanya dilakukan menggunakan skrip init.rc.

Karakter pengganti dan build kernel terintegrasi

Vendor yang menggabungkan build kernel perangkat mereka dengan build platform Android mungkin mengalami masalah saat menggunakan makro BOARD yang disebutkan di atas untuk menentukan modul kernel yang akan disalin ke perangkat. Jika vendor ingin menghindari pencantuman modul kernel dalam file build platform perangkat, mereka dapat menggunakan karakter pengganti ($(wildcard device/vendor/mydevice/*.ko). Perhatikan bahwa karakter pengganti tidak berfungsi dalam kasus build kernel terintegrasi, karena saat make dipanggil dan makro diperluas dalam makefile, modul kernel belum dibangun, sehingga makro kosong.

Untuk mengatasi masalah ini, vendor dapat membuat build kernel yang membuat arsip zip berisi modul kernel yang akan disalin ke setiap partisi. Tetapkan jalur arsip zip tersebut di BOARD_*_KERNEL_MODULES_ARCHIVE dengan * adalah nama partisi (seperti BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). Build platform Android mengekstrak arsip zip ini ke lokasi yang sesuai dan menjalankan depmod di modul.

Arsip zip modul kernel harus memiliki aturan pembuatan yang memastikan build platform dapat membuat arsip saat diperlukan.

Pemulihan

Pada rilis Android sebelumnya, modul kernel yang diperlukan untuk pemulihan ditentukan dalam BOARD_RECOVERY_KERNEL_MODULES. Di Android 12, modul kernel yang diperlukan untuk pemulihan masih ditentukan menggunakan makro ini. Namun, modul kernel pemulihan disalin ke cpio ramdisk vendor, bukan cpio ramdisk generik. Secara default, semua modul kernel yang tercantum di BOARD_RECOVERY_KERNEL_MODULES dimuat selama init tahap pertama. Jika Anda hanya ingin memuat sebagian modul ini, tentukan konten subset tersebut di BOARD_RECOVERY_KERNEL_MODULES_LOAD.

Untuk mempelajari cara membuat partisi booting vendor (yang berisi ramdisk vendor yang disebutkan di halaman ini), lihat Partisi booting.