Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Dukungan Modul Kernel

Gambar kernel generik (GKI) mungkin tidak berisi dukungan driver yang diperlukan untuk mengaktifkan perangkat untuk memasang partisi. Untuk mengaktifkan perangkat untuk me-mount partisi dan melanjutkan boot, 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 filesystem untuk init, tahap pertama init, dan untuk image pemulihan / fastbootd pada perangkat A / B dan virtual A / B. Ini adalah initramfs terdiri dari dua arsip cpio yang digabungkan oleh bootloader. Arsip cpio pertama, yang disimpan sebagai ramdisk vendor di partisi boot-vendor, berisi komponen-komponen ini:

  • 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 tahap pertama init, dan bagaimana urutannya, di /lib/modules/ .
  • Modul kernel pemulihan vendor, untuk perangkat A / B dan Virtual A / B, di /lib/modules/
  • modules.load.recovery yang menunjukkan modul untuk dimuat, dan dalam urutan seperti apa, untuk perangkat A / B dan Virtual A / B, 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 pustaka tempatnya bergantung.

Pemuatan modul di init tahap pertama

Tahap pertama init dimulai dengan membaca file konfigurasi modprobe dari /lib/modules/ di ramdisk. Selanjutnya, ia membaca daftar modul yang ditentukan di /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. Pesanan yang diminta dapat menyimpang dari untuk memenuhi ketergantungan keras atau lunak.

Bangun dukungan, init tahap pertama

Untuk menentukan modul kernel yang akan disalin ke vendor ramdisk cpio, daftarkan di BOARD_VENDOR_RAMDISK_KERNEL_MODULES . Build menjalankan depmod pada modul ini dan meletakkan 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 itu, 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

Bangun dukungan, Android lengkap

Seperti halnya di 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 . 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 untuk rilis Android sebelumnya. Itu keputusan Anda bagaimana dan kapan memuat modul-modul ini, meskipun biasanya 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 menggunakan makro BOARD 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 wildcard ( $(wildcard device/vendor/mydevice/*.ko ). Perhatikan bahwa wildcard tidak berfungsi dalam kasus terintegrasi kernel build, karena ketika make dipanggil dan makro diperluas di makefiles, modul kernel belum dibangun, jadi makro kosong.

Untuk mengatasi masalah ini, vendor mungkin meminta build kernel mereka membuat arsip zip yang berisi modul kernel untuk disalin ke setiap partisi. Setel jalur arsip zip itu di BOARD_*_KERNEL_MODULES_ARCHIVE mana * adalah nama partisi (seperti BOARD_VENDOR_KERNEL_MODULES_ARCHIVE ). Build 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 build platform dapat menghasilkan arsip saat diperlukan.

Pemulihan

Dalam 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 selama init tahap pertama. Jika Anda hanya ingin sebagian dari modul ini dimuat, tentukan konten dari subset tersebut di BOARD_RECOVERY_KERNEL_MODULES_LOAD .

Untuk mempelajari tentang membuat partisi boot vendor (yang berisi ramdisk vendor yang disebutkan di halaman ini), lihat Partisi Boot .