รองรับโมดูลเคอร์เนล

เคอร์เนลอิมเมจทั่วไป (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 ของผู้จำหน่ายที่กล่าวถึงในหน้านี้) โปรดดูที่ พาร์ติชันสำหรับบูต