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

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