Dukungan modul kernel

{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 agar dapat 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 mencoba 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.

Untuk mempelajari cara membuat partisi {i>booting<i} vendor (yang berisi vendor ramdisk yang disebutkan di halaman ini), lihat Booting partisi.