อิมเมจเคอร์เนลทั่วไป (GKI) อาจไม่มีการรองรับไดรเวอร์ที่จำเป็นเพื่อให้สามารถติดตั้งพาร์ติชันในอุปกรณ์ได้ หากต้องการให้อุปกรณ์ติดตั้งพาร์ติชันและบูตต่อไปได้ ระบบจะปรับปรุง init ระยะแรกให้โหลดโมดูลเคอร์เนลที่อยู่ใน ramdisk โดยจะแยก ramdisk ออกเป็น ramdisk ทั่วไปและ ramdisk ของผู้ผลิต โมดูลเคอร์เนลของผู้ผลิตจะจัดเก็บไว้ใน ramdisk ของผู้ผลิต คุณกำหนดลำดับการโหลดโมดูลเคอร์เนลได้
ตำแหน่งโมดูล
ramdisk คือระบบไฟล์สำหรับระยะแรก init, และสำหรับ
อิมเมจการกู้คืน/fastbootd ในอุปกรณ์ A/B และอุปกรณ์ A/B เสมือน โดยเป็น initramfs ที่ประกอบด้วยไฟล์เก็บถาวร cpio 2 ไฟล์ซึ่งตัว Bootloader จะเชื่อมต่อกัน ไฟล์เก็บถาวร cpio ไฟล์แรกซึ่งจัดเก็บเป็น ramdisk ของผู้ผลิตในพาร์ติชัน vendor-boot จะมีคอมโพเนนต์ต่อไปนี้
- โมดูลเคอร์เนลของผู้ผลิต
initระยะแรก ซึ่งอยู่ใน/lib/modules/ - ไฟล์กำหนดค่า
modprobeซึ่งอยู่ใน/lib/modules/ได้แก่modules.dep,modules.softdep,modules.alias,modules.options - ไฟล์
modules.loadที่ระบุโมดูลที่จะโหลดระหว่าง init ระยะแรกและลำดับการโหลดโมดูล ซึ่งอยู่ใน/lib/modules/ - โมดูลเคอร์เนลการกู้คืนของผู้ผลิตสำหรับอุปกรณ์ A/B และอุปกรณ์ A/B เสมือน ซึ่งอยู่ใน
/lib/modules/ modules.load.recoveryซึ่งระบุโมดูลที่จะโหลดและลำดับการโหลดโมดูลสำหรับอุปกรณ์ A/B และอุปกรณ์ A/B เสมือน ซึ่งอยู่ใน/lib/modules
ไฟล์เก็บถาวร cpio ไฟล์ที่ 2 ซึ่งมาพร้อมกับ GKI เป็น ramdisk ของ boot.img และใช้กับไฟล์แรก จะมี first_stage_init และไลบรารีที่ไฟล์ดังกล่าวใช้งานอยู่
การโหลดโมดูลใน init ระยะแรก
init ระยะแรกจะเริ่มต้นด้วยการอ่านไฟล์กำหนดค่า modprobe จาก /lib/modules/ ใน ramdisk จากนั้นจะอ่านรายการ
โมดูลที่ระบุไว้ใน /lib/modules/modules.load (หรือในกรณี
ของการกู้คืน /lib/modules/modules.load.recovery) และพยายาม
โหลดโมดูลแต่ละโมดูลตามลำดับ โดยทำตามการกำหนดค่าที่ระบุไว้ใน
ไฟล์ที่โหลดก่อนหน้านี้ ระบบอาจเบี่ยงเบนจากลำดับที่ขอเพื่อตอบสนองทรัพยากร Dependency ที่จำเป็นหรือทรัพยากร Dependency ที่แนะนำ
การรองรับบิลด์, init ระยะแรก
หากต้องการระบุโมดูลเคอร์เนลที่จะคัดลอกลงใน cpio ของ ramdisk ของผู้ผลิต ให้ระบุโมดูลเหล่านั้นใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES บิลด์จะเรียกใช้ depmod ในโมดูลเหล่านี้และวางไฟล์การกำหนดค่า modprobe ที่ได้ลงใน cpio ของ ramdisk ของผู้ผลิต
บิลด์จะสร้างไฟล์ modules.load และจัดเก็บไว้ใน cpio ของ ramdisk ของผู้ผลิตด้วย โดยค่าเริ่มต้น ไฟล์นี้จะมีโมดูลทั้งหมดที่ระบุไว้ใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES หากต้องการลบล้างเนื้อหาของไฟล์ดังกล่าว ให้ใช้ BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD ดังที่แสดงในตัวอย่างนี้
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \ device/vendor/mydevice-kernel/first.ko \ device/vendor/mydevice-kernel/second.ko \ device/vendor/mydevice-kernel/third.ko
การรองรับบิลด์, Android แบบเต็ม
เช่นเดียวกับใน Android รุ่น 10 และรุ่นก่อนหน้า การสร้างแพลตฟอร์ม Android จะคัดลอกโมดูลเคอร์เนลที่ระบุไว้ใน BOARD_VENDOR_KERNEL_MODULES ลงในพาร์ติชันของผู้ผลิตที่ /vendor/lib/modules การสร้างแพลตฟอร์มจะเรียกใช้ depmod ในโมดูลเหล่านี้ และคัดลอกไฟล์เอาต์พุต depmod ลงในพาร์ติชันของผู้ผลิตในตำแหน่งเดียวกัน กลไกการโหลดโมดูลเคอร์เนลจาก /vendor จะยังคงเหมือนกับใน Android รุ่นก่อนหน้า คุณเป็นผู้กำหนดวิธีและเวลาที่จะโหลดโมดูลเหล่านี้ แม้ว่าโดยทั่วไปแล้วจะดำเนินการโดยใช้สคริปต์ init.rc
ไวลด์การ์ดและการสร้างเคอร์เนลแบบผสานรวม
ผู้ผลิตที่รวมการสร้างเคอร์เนลของอุปกรณ์เข้ากับการสร้างแพลตฟอร์ม Android อาจพบปัญหาในการใช้มาโคร BOARD ที่กล่าวถึงข้างต้นเพื่อระบุโมดูลเคอร์เนลที่จะคัดลอกลงในอุปกรณ์ หากผู้ผลิตต้องการหลีกเลี่ยงการระบุโมดูลเคอร์เนลในไฟล์การสร้างแพลตฟอร์มของอุปกรณ์ ก็สามารถใช้ไวลด์การ์ด ($(wildcard device/vendor/mydevice/*.ko) ได้ โปรดทราบว่าไวลด์การ์ดใช้ไม่ได้ในกรณีของการสร้างเคอร์เนลแบบผสานรวม เนื่องจากเมื่อมีการเรียกใช้ make และมาโครจะขยายใน makefile โมดูลเคอร์เนลจะยังไม่ได้รับการสร้าง ดังนั้นมาโครจึงว่างเปล่า
หากต้องการหลีกเลี่ยงปัญหานี้ ผู้ผลิตอาจให้บิลด์เคอร์เนลสร้างไฟล์เก็บถาวรแบบ Zip ที่มีโมดูลเคอร์เนลที่จะคัดลอกลงในแต่ละพาร์ติชัน
ตั้งค่าเส้นทางของไฟล์เก็บถาวร zip นั้นใน BOARD_*_KERNEL_MODULES_ARCHIVE
โดยที่ * คือชื่อของพาร์ติชัน (เช่น
BOARD_VENDOR_KERNEL_MODULES_ARCHIVE) การสร้างแพลตฟอร์ม Android
จะแตกไฟล์เก็บถาวร zip นี้ลงในตำแหน่งที่เหมาะสมและเรียกใช้ depmod
ในโมดูล
ไฟล์เก็บถาวร zip ของโมดูลเคอร์เนลควรมีกฎการสร้างที่ช่วยให้การสร้างแพลตฟอร์มสร้างไฟล์เก็บถาวรได้เมื่อจำเป็น
การฟื้นตัว
ใน Android รุ่นก่อนหน้า โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนจะระบุไว้ใน BOARD_RECOVERY_KERNEL_MODULES ใน Android 12 โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนจะยังคงระบุโดยใช้มาโครนี้ อย่างไรก็ตาม ระบบจะคัดลอกโมดูลเคอร์เนลการกู้คืนลงใน cpio ของ ramdisk ของผู้ผลิต ไม่ใช่ cpio ของ ramdisk ทั่วไป โดยค่าเริ่มต้น ระบบจะโหลดโมดูลเคอร์เนลทั้งหมดที่ระบุไว้ใน BOARD_RECOVERY_KERNEL_MODULES ระหว่าง init ระยะแรก หากต้องการโหลดเฉพาะโมดูลบางส่วน ให้ระบุเนื้อหาของโมดูลเหล่านั้นใน BOARD_RECOVERY_KERNEL_MODULES_LOAD
เอกสารประกอบที่เกี่ยวข้อง
หากต้องการดูข้อมูลเกี่ยวกับการสร้างพาร์ติชัน boot ของผู้ผลิต (ซึ่งมี ramdisk ของผู้ผลิตที่กล่าวถึงในหน้านี้) โปรดดู พาร์ติชัน boot