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

อิมเมจเคอร์เนลทั่วไป (GKI) อาจไม่รองรับไดรเวอร์ที่จำเป็นในการทำให้อุปกรณ์สามารถต่อเชื่อมพาร์ติชันได้ init ระยะที่ 1 ได้รับการปรับปรุงให้โหลดข้อบังคับของเคอร์เนลที่อยู่ในแรมดิสก์เพื่อให้อุปกรณ์สามารถต่อเชื่อมพาร์ติชันและบูตต่อไปได้ แรมดิสก์จะแบ่งออกเป็นแรมดิสก์ทั่วไปและแรมดิสก์ของผู้ให้บริการ โมดูลเคอร์เนลของผู้ให้บริการจัดเก็บไว้ใน RAM ของผู้ให้บริการ คุณสามารถกำหนดลำดับการโหลดโมดูลเคอร์เนลได้

ตำแหน่งโมดูล

แรมดิสก์คือระบบไฟล์สำหรับ init, ระยะแรกและสำหรับภาพ recovery/fastbootd ในอุปกรณ์ A/B และ A/B เสมือน ไฟล์นี้ประกอบด้วย initramfs ที่ประกอบไปด้วยไฟล์เก็บถาวร cpio 2 ไฟล์ที่เชื่อมต่อกันโดย bootloader ไฟล์เก็บถาวร cpio ไฟล์แรกซึ่งจัดเก็บเป็น RAMdisk ของผู้ให้บริการในพาร์ติชัน vendor-boot ประกอบด้วยคอมโพเนนต์ต่อไปนี้

  • โมดูลเคอร์เนลของผู้ให้บริการ init ระยะที่ 1 ซึ่งอยู่ใน /lib/modules/
  • ไฟล์ modprobe config ซึ่งอยู่ใน /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 และ A/B เสมือนใน/lib/modules

ไฟล์เก็บถาวร cpio ที่ 2 ซึ่งมาพร้อมกับ GKI เป็น RAMdisk ของ boot.img และวางไว้ด้านบนของไฟล์แรก มี first_stage_init และไลบรารีที่ first_stage_init ต้องใช้

การโหลดโมดูลใน init ขั้นตอนแรก

init ในระยะแรกเริ่มต้นโดยการอ่านไฟล์การกำหนดค่า modprobe จาก /lib/modules/ ใน RAM จากนั้นจะอ่านรายการของโมดูลที่ระบุใน /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 ระบบจะยังคงระบุข้อบังคับของเคอร์เนลที่จําเป็นสําหรับการกู้คืนโดยใช้มาโครนี้ แต่ระบบจะคัดลอกโมดูลเคอร์เนลการกู้คืนไปยัง ramdisk cpio ของผู้ให้บริการ แทนที่จะเป็น ramdisk cpio ทั่วไป โดยค่าเริ่มต้น ระบบจะโหลดข้อบังคับของเคอร์เนลทั้งหมดที่แสดงใน BOARD_RECOVERY_KERNEL_MODULES ในระหว่างระยะที่ 1 ของ init หากต้องการโหลดเฉพาะชุดย่อยของข้อบังคับเหล่านี้ ให้ระบุเนื้อหาของชุดย่อยนั้นใน BOARD_RECOVERY_KERNEL_MODULES_LOAD

ดูข้อมูลเกี่ยวกับการสร้างพาร์ติชันสำหรับบูตของผู้ให้บริการ (ซึ่งมีแรมดิสก์ของผู้ให้บริการที่กล่าวถึงในหน้านี้) ได้ที่พาร์ติชันสำหรับบูต