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

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 ที่กล่าวถึงในหน้านี้) ได้ที่พาร์ติชัน การบูต