Generic Kernel Image (GKI) อาจไม่มีการรองรับไดรเวอร์ที่จำเป็นเพื่อ
เปิดใช้อุปกรณ์ให้ติดตั้งพาร์ติชัน หากต้องการเปิดใช้อุปกรณ์เพื่อติดตั้งพาร์ติชันและ
บูตต่อไป เราได้ปรับปรุงinit
ระยะแรกเพื่อโหลด
โมดูลเคอร์เนลที่อยู่ใน Ramdisk Ramdisk จะแบ่งออกเป็น Ramdisk ทั่วไปและ Ramdisk ของผู้ให้บริการ โมดูลเคอร์เนลของผู้ให้บริการจะจัดเก็บอยู่ใน ramdisk ของผู้ให้บริการ คุณกำหนดค่า
ลำดับการโหลดโมดูลเคอร์เนลได้
ตำแหน่งโมดูล
Ramdisk คือระบบไฟล์สำหรับ init,
ระยะแรกและสำหรับอิมเมจ
การกู้คืน/fastbootd ในอุปกรณ์ A/B และอุปกรณ์ A/B เสมือน ซึ่งเป็น
initramfs
ที่ประกอบด้วยไฟล์เก็บถาวร cpio 2 รายการที่ Bootloader จะต่อกัน ที่เก็บถาวร cpio แรกซึ่งจัดเก็บเป็น vendor ramdisk
ในพาร์ติชัน vendor-boot มีคอมโพเนนต์ต่อไปนี้
- โมดูลเคอร์เนลของผู้ให้บริการ
init
ระยะแรกซึ่งอยู่ใน/lib/modules/
- ไฟล์กำหนดค่า
modprobe
ซึ่งอยู่ใน/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 และ Virtual A/B ใน/lib/modules
ไฟล์เก็บถาวร cpio ที่ 2 ซึ่งมาพร้อมกับ GKI
เป็น ramdisk ของ boot.img และใช้ทับ
ไฟล์แรกจะมี first_stage_init
และไลบรารีที่ขึ้นอยู่กับ first_stage_init
การโหลดโมดูลใน init ระยะแรก
init
ระยะแรกจะเริ่มต้นด้วยการอ่านไฟล์การกำหนดค่า modprobe
จาก /lib/modules/
ใน Ramdisk จากนั้นจะอ่านรายการ
โมดูลที่ระบุใน /lib/modules/modules.load
(หรือในกรณี
ของการกู้คืน /lib/modules/modules.load.recovery
) และพยายาม
โหลดแต่ละโมดูลตามลำดับ โดยทำตามการกำหนดค่าที่ระบุใน
ไฟล์ที่โหลดก่อนหน้านี้ ระบบอาจปรับลำดับที่ขอเพื่อ
ตอบสนองการขึ้นต่อกันแบบเข้มงวดหรือแบบยืดหยุ่น
สร้างการสนับสนุน การเริ่มต้นระยะแรก
หากต้องการระบุโมดูลเคอร์เนลที่จะคัดลอกลงใน cpio ของ ramdisk ของผู้ให้บริการ ให้แสดงรายการ
ใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES
บิลด์จะทำงาน
depmod
ในโมดูลเหล่านี้และวางไฟล์การกำหนดค่า modprobe ที่ได้
ไว้ใน cpio ของ vendor ramdisk
นอกจากนี้ บิลด์ยังสร้างไฟล์ modules.load
และจัดเก็บไว้ใน
vendor 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 และรุ่นที่ต่ำกว่า แพลตฟอร์ม Android
build จะคัดลอกโมดูลเคอร์เนลที่แสดงใน
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
โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนยังคง
ระบุโดยใช้มาโครนี้ อย่างไรก็ตาม ระบบจะคัดลอกโมดูลเคอร์เนลกู้คืนไปยัง
vendor ramdisk cpio แทนที่จะเป็น generic ramdisk cpio โดยค่าเริ่มต้น ระบบจะโหลดโมดูลเคอร์เนลทั้งหมดที่แสดงใน BOARD_RECOVERY_KERNEL_MODULES
ระหว่างinit
ระยะแรก หากต้องการโหลดเฉพาะโมดูลบางส่วน ให้ระบุเนื้อหาของโมดูลบางส่วนนั้นในBOARD_RECOVERY_KERNEL_MODULES_LOAD
เอกสารประกอบที่เกี่ยวข้อง
ดูข้อมูลเกี่ยวกับการสร้างพาร์ติชันการบูตของผู้ให้บริการ (ซึ่งมี vendor ramdisk ที่กล่าวถึงในหน้านี้) ได้ที่พาร์ติชัน การบูต