เคอร์เนลอิมเมจทั่วไป (GKI) อาจไม่มีการรองรับไดรเวอร์ที่จำเป็นเพื่อให้อุปกรณ์สามารถเมานต์พาร์ติชันได้ เพื่อให้อุปกรณ์สามารถติดตั้งพาร์ติชันและทำการบูทต่อได้ init
ขั้นแรกจะได้รับการปรับปรุงเพื่อโหลดโมดูลเคอร์เนลที่มีอยู่บน ramdisk ramdisk แบ่งออกเป็น ramdisk ทั่วไปและผู้จำหน่าย โมดูลเคอร์เนลของผู้จำหน่ายจะถูกจัดเก็บไว้ใน ramdisk ของผู้จำหน่าย สามารถกำหนดค่าลำดับการโหลดโมดูลเคอร์เนลได้
ตำแหน่งของโมดูล
ramdisk คือระบบไฟล์สำหรับ init,
ขั้นแรก และสำหรับอิมเมจการกู้คืน/fastbootd บนอุปกรณ์ A/B และอุปกรณ์ A/B เสมือน เป็น initramfs
ที่ประกอบด้วยไฟล์เก็บถาวร cpio สองไฟล์ที่เชื่อมต่อกันโดย bootloader ไฟล์เก็บถาวร cpio แรก ซึ่งจัดเก็บเป็น ramdisk ของผู้จำหน่ายในพาร์ติชันสำหรับบูตของผู้จำหน่าย มีส่วนประกอบเหล่านี้:
- โมดูลเคอร์เนลผู้ขาย
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 และ Virtual A/B ใน/lib/modules
ไฟล์เก็บถาวร cpio ที่สอง ซึ่งมาพร้อมกับ GKI เป็น ramdisk ของ boot.img และนำไปใช้ที่ด้านบนของไฟล์แรก ประกอบด้วย first_stage_init
และไลบรารีที่ไฟล์นั้นขึ้นอยู่กับ
การโหลดโมดูลในขั้นตอนแรก
init
ขั้นแรกเริ่มต้นด้วยการอ่านไฟล์การกำหนดค่า modprobe จาก /lib/modules/
บน ramdisk ถัดไป จะอ่านรายการโมดูลที่ระบุใน /lib/modules/modules.load
(หรือในกรณีของการกู้คืน /lib/modules/modules.load.recovery
) และพยายามโหลดแต่ละโมดูลเหล่านั้นตามลำดับ โดยปฏิบัติตาม การกำหนดค่าที่ระบุในไฟล์ที่โหลดก่อนหน้านี้ คำสั่งซื้อที่ร้องขออาจเบี่ยงเบนไปจากเพื่อตอบสนองการขึ้นต่อกันแบบแข็งหรือแบบอ่อน
สร้างการสนับสนุน การเริ่มต้นขั้นแรก
หากต้องการระบุโมดูลเคอร์เนลที่จะคัดลอกไปยังผู้จำหน่าย ramdisk cpio ให้แสดงรายการไว้ใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES
บิลด์รัน depmod
บนโมดูลเหล่านี้ และวางไฟล์คอนฟิกูเรชัน modprobe ที่เป็นผลลัพธ์ไว้ใน ramdisk cpio ของผู้จำหน่าย
บิลด์ยังสร้างไฟล์ modules.load
และจัดเก็บไว้ในผู้จำหน่าย ramdisk 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 และรุ่นที่ต่ำกว่า โมดูลเคอร์เนลที่อยู่ใน BOARD_VENDOR_KERNEL_MODULES
จะถูกคัดลอกโดยแพลตฟอร์ม Android ที่สร้างลงในพาร์ติชันผู้ขายที่ /vendor/lib/modules
การสร้างแพลตฟอร์มจะรัน depmod
บนโมดูลเหล่านี้ และคัดลอกไฟล์เอาต์พุต depmod
ไปยังพาร์ติชันผู้จำหน่ายที่ตำแหน่งเดียวกัน กลไกในการโหลดโมดูลเคอร์เนลจาก /vendor
ยังคงเหมือนเดิมกับ Android รุ่นก่อน ๆ คุณเป็นผู้ตัดสินใจว่าจะโหลดโมดูลเหล่านี้อย่างไรและเมื่อใด แม้ว่าโดยทั่วไปแล้วจะกระทำโดยใช้สคริปต์ init.rc
สัญลักษณ์ตัวแทนและการสร้างเคอร์เนลแบบรวม
ผู้จำหน่ายที่รวมอุปกรณ์เคอร์เนลบิวด์เข้ากับแพลตฟอร์ม Android อาจประสบปัญหาในการใช้มาโคร BOARD
ที่กล่าวถึงข้างต้นเพื่อระบุโมดูลเคอร์เนลที่จะคัดลอกไปยังอุปกรณ์ หากผู้จำหน่ายต้องการหลีกเลี่ยงการแสดงรายการโมดูลเคอร์เนลในไฟล์สร้างแพลตฟอร์มของอุปกรณ์ พวกเขาสามารถใช้ wildcard ( $(wildcard device/vendor/mydevice/*.ko
) โปรดทราบว่า wildcard จะไม่ทำงานในกรณีที่มีการผสานรวม การสร้างเคอร์เนล เนื่องจากเมื่อมีการเรียกใช้ make และมาโครถูกขยายใน makefiles โมดูลเคอร์เนลยังไม่ได้ถูกสร้างขึ้น ดังนั้นมาโครจึงว่างเปล่า
เพื่อแก้ไขปัญหานี้ ผู้จำหน่ายอาจให้เคอร์เนลสร้างไฟล์ zip ที่มีโมดูลเคอร์เนลที่จะคัดลอกลงในแต่ละพาร์ติชัน กำหนดเส้นทางของไฟล์ zip นั้นใน BOARD_*_KERNEL_MODULES_ARCHIVE
โดยที่ *
คือชื่อของพาร์ติชัน (เช่น BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
) โครงสร้างแพลตฟอร์ม Android แยกไฟล์ zip นี้ไปยังตำแหน่งที่เหมาะสมและรัน depmod
บนโมดูล
ไฟล์ zip ของโมดูลเคอร์เนลควรมีกฎการสร้างเพื่อให้แน่ใจว่าการสร้างแพลตฟอร์มสามารถสร้างไฟล์เก็บถาวรได้เมื่อจำเป็น
การกู้คืน
ใน Android รุ่นก่อนหน้า โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนระบุไว้ใน BOARD_RECOVERY_KERNEL_MODULES
ใน Android 11 โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนยังคงระบุโดยใช้มาโครนี้ อย่างไรก็ตาม โมดูลเคอร์เนลการกู้คืนจะถูกคัดลอกไปยังผู้จำหน่าย ramdisk cpio แทนที่จะเป็น ramdisk cpio ทั่วไป ตามค่าเริ่มต้น โมดูลเคอร์เนลทั้งหมดที่อยู่ใน BOARD_RECOVERY_KERNEL_MODULES
จะถูกโหลดระหว่าง init
ระยะแรก หากคุณต้องการโหลดเฉพาะชุดย่อยของโมดูลเหล่านี้ ให้ระบุเนื้อหาของชุดย่อยนั้นใน BOARD_RECOVERY_KERNEL_MODULES_LOAD
เอกสารที่เกี่ยวข้อง
หากต้องการเรียนรู้เกี่ยวกับการสร้างพาร์ติชันสำหรับเริ่มระบบของผู้จำหน่าย (ซึ่งมี ramdisk ของผู้จำหน่ายที่กล่าวถึงในหน้านี้) โปรดดูที่ พาร์ติชันสำหรับบูต