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