อิมเมจเคอร์เนลทั่วไป (GKI) อาจไม่มีการรองรับไดรเวอร์ที่จำเป็นสำหรับ
ทำให้อุปกรณ์ต่อเชื่อมพาร์ติชันได้ วิธีเปิดใช้อุปกรณ์เพื่อต่อเชื่อมพาร์ติชันและ
ในการเปิดเครื่องต่อ ในช่วงแรก init
ได้รับการปรับปรุงให้โหลด
โมดูลเคอร์เนลแสดงบน RAM ramdisk จะแบ่งออกเป็นแบบทั่วไปและ
ramdisks ของผู้ให้บริการ โมดูลเคอร์เนลของผู้ให้บริการจัดเก็บไว้ใน RAM ของผู้ให้บริการ
เรียงลำดับโมดูลเคอร์เนลที่โหลดได้
ตำแหน่งโมดูล
ramdisk คือระบบไฟล์สำหรับ init,
ระยะแรกและ
อิมเมจการกู้คืน/fastbootd ในอุปกรณ์ A/B และอุปกรณ์ A/B เสมือน เป็น
initramfs
ประกอบด้วยที่เก็บถาวร cpio 2 รายการที่เชื่อมกัน
Bootloader ที่เก็บถาวร cpio แรก ซึ่งเก็บไว้เป็น RAM ผู้ให้บริการ
ในพาร์ติชันผู้ให้บริการบูตมีองค์ประกอบต่อไปนี้
- โมดูลเคอร์เนลของผู้ให้บริการ
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 ไฟล์ที่สอง ซึ่งมาพร้อมกับ GKI
เป็น RAM ของ Boot.img และนำไปใช้ที่ด้านบนของ
ลำดับแรก จะมี first_stage_init
และไลบรารีที่เกี่ยวข้อง
การโหลดโมดูลใน init ขั้นตอนแรก
init
ในระยะแรกเริ่มต้นโดยการอ่านการกำหนดค่า modprobe
ไฟล์จาก /lib/modules/
ใน RAM ต่อไป อุปกรณ์จะอ่านรายการ
ที่ระบุไว้ใน /lib/modules/modules.load
(หรือในกรณี
การกู้คืน /lib/modules/modules.load.recovery
) และพยายาม
โหลดแต่ละโมดูลตามลำดับ ตามการกำหนดค่าที่ระบุไว้ใน
ไฟล์ที่โหลดก่อนหน้านี้ คำสั่งซื้อที่ขออาจถูกเบี่ยงเบนจาก เป็น
ตอบสนองการขึ้นต่อกันแบบเข้มงวดหรือแบบซอฟต์
สร้างการสนับสนุน, init ขั้นตอนแรก
หากต้องการระบุโมดูลเคอร์เนลที่จะคัดลอกไปยัง ramdisk cpio ของผู้ให้บริการ โปรดแสดงรายการ
พวกเขาใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES
บิลด์จะทำงาน
depmod
บนโมดูลเหล่านี้และใส่การกำหนดค่า modprobe ที่ได้
ใน ramdisk cpio ของผู้ให้บริการ
บิลด์นี้ยังสร้างไฟล์ 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
) โปรดทราบว่าไวลด์การ์ดจะไม่
จะทำงานในกรณีของบิลด์เคอร์เนลที่ผสานรวม เพราะเมื่อมีการเรียกใช้ get และ
มีการขยายมาโครในไฟล์ที่จำเป็น ไม่ได้มีการสร้างโมดูลเคอร์เนล ดังนั้นมาโคร
ว่างเปล่า
ผู้ให้บริการอาจสร้างเคอร์เนลเพื่อสร้างไฟล์ ZIP เพื่อแก้ปัญหานี้
ที่เก็บถาวรที่มีโมดูลเคอร์เนลที่จะคัดลอกไปยังแต่ละพาร์ติชัน
กำหนดเส้นทางของชุดไฟล์ Zip ใน BOARD_*_KERNEL_MODULES_ARCHIVE
โดยที่ *
คือชื่อของพาร์ติชัน (เช่น
BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
) บิลด์ของแพลตฟอร์ม Android
แตกไฟล์ ZIP นี้ลงในตำแหน่งที่เหมาะสมและเรียกใช้ depmod
ในโมดูลต่างๆ
ไฟล์ ZIP ของโมดูลเคอร์เนลควรมีกฎ "สร้าง" ที่จะช่วยให้แพลตฟอร์ม สามารถสร้างที่เก็บถาวรได้เมื่อจำเป็น
แย่งลูกคืนมา
ใน Android รุ่นก่อนหน้า โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนคือ
ที่ระบุใน BOARD_RECOVERY_KERNEL_MODULES
ใน Android 12
โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนยังคง
ที่ระบุโดยใช้มาโครนี้ แต่จะมีการคัดลอกโมดูลเคอร์เนลการกู้คืนไปยัง
ramdisk cpio ของผู้ให้บริการ แทนที่จะเป็น ramdisk cpio ทั่วไป โดยค่าเริ่มต้นทั้งหมด
โหลดโมดูลเคอร์เนลที่แสดงใน BOARD_RECOVERY_KERNEL_MODULES
แล้ว
ในช่วง init
ระยะแรก หากต้องการตั้งค่าเฉพาะบางส่วน
โมดูลที่จะโหลด ให้ระบุเนื้อหาของชุดย่อยนั้นใน
BOARD_RECOVERY_KERNEL_MODULES_LOAD
เอกสารประกอบที่เกี่ยวข้อง
ดูข้อมูลเกี่ยวกับการสร้างพาร์ติชันบูตของผู้ให้บริการ (ซึ่งมีผู้ให้บริการ) ramdisk ที่กล่าวถึงในหน้านี้) โปรดดู รองเท้าบู๊ต พาร์ติชัน