Gambar kernel generik (GKI) mungkin tidak berisi dukungan driver yang diperlukan untuk memungkinkan perangkat memasang partisi. Untuk memungkinkan perangkat memasang partisi dan melanjutkan booting, init
tahap pertama ditingkatkan untuk memuat modul kernel yang ada pada 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,
dan untuk image pemulihan/fastbootd pada perangkat A/B dan virtual A/B. Ini adalah initramfs
yang terdiri dari dua arsip cpio yang digabungkan oleh bootloader. Arsip cpio pertama, yang disimpan sebagai ramdisk vendor di partisi boot vendor, berisi komponen berikut:
- Modul kernel vendor
init
tahap pertama, terletak di/lib/modules/
. - file konfigurasi
modprobe
, terletak di/lib/modules/
:modules.dep
,modules.softdep
,modules.alias
,modules.options
. - File
modules.load
yang menunjukkan modul mana yang akan dimuat selama init tahap pertama, dan dalam urutan apa, dalam/lib/modules/
. - Modul kernel pemulihan vendor, untuk perangkat A/B dan Virtual A/B, di
/lib/modules/
-
modules.load.recovery
yang menunjukkan modul yang akan dimuat, dan urutannya, untuk perangkat A/B dan Virtual A/B, di/lib/modules
.
Arsip cpio kedua, yang disertakan bersama GKI sebagai ramdisk boot.img dan diterapkan di atas arsip pertama, berisi first_stage_init
dan pustaka yang bergantung padanya.
Pemuatan modul di init tahap pertama
init
tahap pertama dimulai dengan membaca file konfigurasi modprobe dari /lib/modules/
pada 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 masing-masing modul tersebut secara berurutan, mengikuti perintah konfigurasi yang ditentukan dalam file yang dimuat sebelumnya. Urutan yang diminta mungkin menyimpang untuk memenuhi ketergantungan keras atau lunak.
Bangun dukungan, inisiasi tahap pertama
Untuk menentukan modul kernel yang akan disalin ke cpio ramdisk vendor, daftarkan modul tersebut di BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Build menjalankan depmod
pada modul ini dan menempatkan file konfigurasi modprobe yang dihasilkan di vendor ramdisk cpio.
Build juga membuat file modules.load
dan menyimpannya di vendor ramdisk cpio. Secara default, ini berisi semua modul yang terdaftar di BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Untuk mengganti konten 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 lengkap
Seperti halnya pada Android 10 dan rilis yang lebih rendah, modul kernel yang tercantum dalam BOARD_VENDOR_KERNEL_MODULES
disalin oleh platform Android yang dibangun ke dalam partisi vendor di /vendor/lib/modules
. Pembuatan platform menjalankan depmod
pada modul-modul ini, dan menyalin file keluaran depmod
ke partisi vendor di lokasi yang sama. Mekanisme untuk memuat modul kernel dari /vendor
tetap sama seperti pada rilis Android sebelumnya. Terserah Anda bagaimana dan kapan memuat modul ini, meskipun biasanya hal ini dilakukan dengan menggunakan skrip init.rc
Wildcard 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 mencantumkan modul kernel di file build platform perangkat, mereka dapat menggunakan wildcard ( $(wildcard device/vendor/mydevice/*.ko
). Perhatikan bahwa wildcard tidak berfungsi dalam kasus terintegrasi build kernel, karena ketika make dipanggil dan makro diperluas di makefile, modul kernel belum dibuat, sehingga makro kosong.
Untuk mengatasi masalah ini, vendor mungkin meminta build kernel mereka untuk membuat arsip zip yang berisi modul kernel untuk disalin ke setiap partisi. Tetapkan jalur arsip zip tersebut di BOARD_*_KERNEL_MODULES_ARCHIVE
dengan *
adalah nama partisi (misalnya BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). Pembuatan platform Android mengekstrak arsip zip ini ke lokasi yang sesuai dan menjalankan depmod
pada modul.
Arsip zip modul kernel harus memiliki aturan make yang memastikan pembangunan platform dapat menghasilkan arsip bila diperlukan.
Pemulihan
Pada rilis Android sebelumnya, modul kernel yang diperlukan untuk pemulihan ditentukan di BOARD_RECOVERY_KERNEL_MODULES
. Di Android 11, modul kernel yang diperlukan untuk pemulihan masih ditentukan menggunakan makro ini. Namun, modul kernel pemulihan disalin ke vendor ramdisk cpio, bukan ramdisk cpio generik. Secara default, semua modul kernel yang terdaftar di BOARD_RECOVERY_KERNEL_MODULES
dimuat pada tahap pertama init
. Jika Anda hanya ingin sebagian dari modul ini dimuat, tentukan konten subset tersebut di BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
Dokumentasi terkait
Untuk mempelajari cara membuat partisi boot vendor (yang berisi ramdisk vendor yang disebutkan di halaman ini), lihat Partisi Boot .