{i>Generic kernel image<i} (GKI) mungkin tidak berisi
dukungan {i>driver<i} yang diperlukan untuk
memungkinkan perangkat
untuk memasang partisi. Untuk memungkinkan perangkat
memasang partisi dan
untuk melanjutkan booting, init
tahap pertama disempurnakan untuk memuat
modul {i>kernel<i} yang ada
pada sebuah ramdisk. RAMdisk dibagi
menjadi generik dan
{i>ramdisk<i} vendor Modul kernel vendor disimpan di ramdisk vendor. Tujuan
urutan modul {i>kernel<i} yang dimuat dapat dikonfigurasi.
Lokasi modul
Ramdisk adalah sistem file untuk init,
tahap pertama dan untuk
image pemulihan/fastbootd pada perangkat A/B dan A/B virtual. Ini adalah
initramfs
terdiri dari dua arsip cpio yang disambungkan oleh
{i>bootloader<i}. Arsip cpio pertama, yang disimpan sebagai {i>ramdisk<i} vendor
di partisi {i>booting<i} vendor, berisi komponen berikut:
- Modul kernel vendor
init
tahap pertama, yang terletak di/lib/modules/
. - File konfigurasi
modprobe
, yang terletak di/lib/modules/
:modules.dep
,modules.softdep
,modules.alias
,modules.options
. - File
modules.load
yang menunjukkan modul yang akan dimuat selama init tahap pertama, dan urutannya,/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 dengan urutan, untuk perangkat A/B dan Virtual A/B,/lib/modules
.
Arsip cpio kedua, yang disertakan dengan GKI
sebagai ramdisk dari boot.img dan diterapkan di atas
pertama, berisi first_stage_init
dan library yang menjadi tempatnya bergantung.
Pemuatan modul pada init tahap pertama
init
tahap pertama dimulai dengan membaca 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 upaya untuk
memuat setiap modul tersebut secara berurutan, mengikuti konfigurasi yang ditentukan dalam
file yang dimuat sebelumnya. Pesanan yang diminta dapat menyimpang dari ke
memenuhi dependensi {i>hard<i} atau {i>soft<i}.
Membangun dukungan, init tahap pertama
Untuk menentukan modul {i>kernel<i} yang akan disalin ke vendor ramdisk cpio, cantumkan
kunci tersebut di BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Build berjalan
depmod
pada modul ini dan menempatkan konfigurasi modprobe yang dihasilkan
file di vendor {i>
ramdisk cpio<i}.
Build ini juga membuat file modules.load
dan menyimpannya dalam
vendor {i>ramdisk cpio<i}. Secara {i>default<i} berisi semua
modul yang tercantum dalam
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Untuk mengganti konten
ke 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 di
BOARD_VENDOR_KERNEL_MODULES
disalin oleh platform Android
build ke dalam partisi vendor di /vendor/lib/modules
. Tujuan
build platform menjalankan depmod
pada modul ini, dan menyalin
depmod
file output ke dalam partisi vendor secara bersamaan
lokasi HTTP/HTTPS. Mekanisme untuk memuat modul kernel dari /vendor
tetap sama seperti rilis Android sebelumnya. Terserah Anda
bagaimana dan kapan memuat modul ini, meskipun
biasanya ini 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 menggunakan makro BOARD
yang disebutkan di atas untuk
menentukan modul {i>kernel<i} yang
akan disalin ke perangkat. Jika vendor ingin menghindari
mencantumkan modul {i>kernel<i} dalam file {i>build<i} platform perangkat, mereka dapat menggunakan
($(wildcard device/vendor/mydevice/*.ko
). Perhatikan bahwa {i>wildcard <i}tidak
berfungsi pada kasus build {i>kernel<i} terintegrasi, karena ketika make dipanggil dan
makro diperluas dalam makefile, modul {i>kernel<i} belum dibangun, sehingga makro
kosong.
Untuk mengatasi masalah ini, vendor mungkin meminta
{i>build kernel<i} mereka membuat {i>zip<i}
arsip yang berisi modul {i>kernel<i}
yang akan disalin ke setiap partisi.
Tetapkan jalur arsip zip tersebut di BOARD_*_KERNEL_MODULES_ARCHIVE
dengan *
adalah nama partisi (misalnya
BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). Build platform Android
mengekstrak arsip zip ini ke lokasi yang sesuai dan menjalankan depmod
tentang modul.
Arsip zip modul {i>kernel<i} harus memiliki aturan {i>make<i} yang memastikan bahwa bisa membuat arsip jika diperlukan.
Pemulihan
Dalam rilis Android sebelumnya, modul {i>kernel<i} yang
diperlukan untuk pemulihan adalah
yang ditentukan dalam BOARD_RECOVERY_KERNEL_MODULES
. Di Android 12,
modul {i>kernel<i} yang diperlukan
untuk pemulihan masih
yang ditentukan menggunakan makro ini. Namun, modul {i>kernel<i} pemulihan disalin ke
vendor {i>ramdisk cpio<i},
bukan {i>ramdisk cpio<i} generik. Secara default semua
modul kernel yang tercantum dalam BOARD_RECOVERY_KERNEL_MODULES
telah dimuat
selama init
tahap pertama. Jika Anda hanya ingin subset dari
untuk memuat modul, tentukan konten subset tersebut dalam
BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
Dokumentasi terkait
Untuk mempelajari cara membuat partisi {i>booting<i} vendor (yang berisi vendor ramdisk yang disebutkan di halaman ini), lihat Booting partisi.