อิมเมจเคอร์เนลทั่วไป (GKI) อาจไม่รองรับไดรเวอร์ที่จำเป็นในการทำให้อุปกรณ์สามารถต่อเชื่อมพาร์ติชันได้ init
ระยะที่ 1 ได้รับการปรับปรุงให้โหลดข้อบังคับของเคอร์เนลที่อยู่ในแรมดิสก์เพื่อให้อุปกรณ์สามารถต่อเชื่อมพาร์ติชันและบูตต่อไปได้ แรมดิสก์จะแบ่งออกเป็นแรมดิสก์ทั่วไปและแรมดิสก์ของผู้ให้บริการ โมดูลเคอร์เนลของผู้ให้บริการจัดเก็บไว้ใน RAM ของผู้ให้บริการ คุณสามารถกำหนดลำดับการโหลดโมดูลเคอร์เนลได้
ตำแหน่งโมดูล
แรมดิสก์คือระบบไฟล์สำหรับ init,
ระยะแรกและสำหรับภาพ recovery/fastbootd ในอุปกรณ์ A/B และ A/B เสมือน ไฟล์นี้ประกอบด้วย initramfs
ที่ประกอบไปด้วยไฟล์เก็บถาวร cpio 2 ไฟล์ที่เชื่อมต่อกันโดย bootloader ไฟล์เก็บถาวร cpio ไฟล์แรกซึ่งจัดเก็บเป็น RAMdisk ของผู้ให้บริการในพาร์ติชัน vendor-boot ประกอบด้วยคอมโพเนนต์ต่อไปนี้
- โมดูลเคอร์เนลของผู้ให้บริการ
init
ระยะที่ 1 ซึ่งอยู่ใน/lib/modules/
- ไฟล์
modprobe
config ซึ่งอยู่ใน/lib/modules/
modules.dep
,modules.softdep
,modules.alias
,modules.options
- ไฟล์
modules.load
ที่ระบุโมดูลที่จะโหลดระหว่างการเริ่มต้นระยะแรก และลำดับใน/lib/modules/
- โมดูลเคอร์เนลการกู้คืนผู้ให้บริการสำหรับอุปกรณ์ A/B และ Virtual A/B ใน
/lib/modules/
modules.load.recovery
ซึ่งระบุโมดูลที่จะโหลดและลำดับสำหรับอุปกรณ์ A/B และ A/B เสมือนใน/lib/modules
ไฟล์เก็บถาวร cpio ที่ 2 ซึ่งมาพร้อมกับ GKI เป็น RAMdisk ของ boot.img และวางไว้ด้านบนของไฟล์แรก มี first_stage_init
และไลบรารีที่ first_stage_init
ต้องใช้
การโหลดโมดูลใน init ขั้นตอนแรก
init
ในระยะแรกเริ่มต้นโดยการอ่านไฟล์การกำหนดค่า modprobe จาก /lib/modules/
ใน RAM จากนั้นจะอ่านรายการของโมดูลที่ระบุใน /lib/modules/modules.load
(หรือในกรณีการกู้คืน /lib/modules/modules.load.recovery
) และพยายามโหลดโมดูลแต่ละรายการตามลำดับตามการกำหนดค่าที่ระบุไว้ในไฟล์ที่โหลดก่อนหน้านี้ ลำดับที่ขออาจมีการเบี่ยงเบนไปจากการตอบสนองแบบแข็งหรือแบบชั่วคราว
การสนับสนุนการสร้าง การสร้างระยะแรก
หากต้องการระบุโมดูลเคอร์เนลที่จะคัดลอกไปยัง cpio ของแรมดิสก์ของผู้ให้บริการ ให้ระบุไว้ใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES
บิลด์จะทำงานdepmod
ในโมดูลเหล่านี้และวางไฟล์การกำหนดค่า modprobe ที่ได้ไว้ใน cpio ของ ramdisk ของผู้ให้บริการ
บิลด์จะสร้างไฟล์ modules.load
และจัดเก็บไว้ใน cpio ของแรมดิสก์ของผู้ให้บริการด้วย โดยค่าเริ่มต้น จะมีโมดูลทั้งหมดที่แสดงใน 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 และขยายมาโครในไฟล์ make จะไม่มีการสร้างข้อบังคับของเคอร์เนล ดังนั้นมาโครจึงว่างเปล่า
ผู้ให้บริการอาจใช้บิลด์เคอร์เนลเพื่อสร้างไฟล์เก็บถาวร ZIP ที่มีโมดูลเคอร์เนลที่จะคัดลอกไปยังพาร์ติชันแต่ละรายการเพื่อแก้ปัญหานี้
ตั้งค่าเส้นทางของไฟล์ ZIP นั้นใน BOARD_*_KERNEL_MODULES_ARCHIVE
โดยที่ *
คือชื่อของพาร์ติชัน (เช่น BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
) บิลด์แพลตฟอร์ม Android จะแตกไฟล์ ZIP นี้ไปยังตำแหน่งที่เหมาะสมและเรียกใช้ depmod
ในโมดูล
ไฟล์ ZIP ของโมดูลเคอร์เนลควรมีกฎ make ที่ช่วยให้มั่นใจได้ว่าการสร้างแพลตฟอร์มจะสร้างไฟล์เก็บถาวรได้เมื่อจำเป็น
การกู้คืน
ใน Android เวอร์ชันก่อนหน้า โมดูลเคอร์เนลที่จําเป็นสําหรับการกู้คืนจะระบุไว้ใน BOARD_RECOVERY_KERNEL_MODULES
ใน Android 12 ระบบจะยังคงระบุข้อบังคับของเคอร์เนลที่จําเป็นสําหรับการกู้คืนโดยใช้มาโครนี้ แต่ระบบจะคัดลอกโมดูลเคอร์เนลการกู้คืนไปยัง ramdisk cpio ของผู้ให้บริการ แทนที่จะเป็น ramdisk cpio ทั่วไป โดยค่าเริ่มต้น ระบบจะโหลดข้อบังคับของเคอร์เนลทั้งหมดที่แสดงใน BOARD_RECOVERY_KERNEL_MODULES
ในระหว่างระยะที่ 1 ของ init
หากต้องการโหลดเฉพาะชุดย่อยของข้อบังคับเหล่านี้ ให้ระบุเนื้อหาของชุดย่อยนั้นใน BOARD_RECOVERY_KERNEL_MODULES_LOAD
เอกสารประกอบที่เกี่ยวข้อง
ดูข้อมูลเกี่ยวกับการสร้างพาร์ติชันสำหรับบูตของผู้ให้บริการ (ซึ่งมีแรมดิสก์ของผู้ให้บริการที่กล่าวถึงในหน้านี้) ได้ที่พาร์ติชันสำหรับบูต