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

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

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

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

  • ขั้นตอนแรก init ผู้ขายเคอร์เนลโมดูลที่ตั้งอยู่ใน /lib/modules/ /
  • modprobe config ไฟล์ที่อยู่ใน /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 และอุปกรณ์ 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 ) และความพยายามที่จะโหลดแต่ละโมดูลผู้ที่อยู่ในคำสั่งดังต่อไปนี้ การกำหนดค่าที่ระบุในไฟล์ที่โหลดก่อนหน้านี้ คำสั่งที่ร้องขออาจเบี่ยงเบนไปจากเพื่อตอบสนองการพึ่งพาแบบแข็งหรือแบบอ่อน

สร้างการสนับสนุน เริ่มต้นขั้นแรก

เพื่อระบุโมดูลเคอร์เนลที่จะถูกคัดลอกลง cpio ผู้ขาย ramdisk รายการพวกเขาใน BOARD_VENDOR_RAMDISK_KERNEL_MODULES สร้างวิ่ง depmod กับโมดูลเหล่านี้และทำให้ส่งผลแฟ้มการกำหนดค่า modprobe ใน cpio ผู้ขาย ramdisk

สร้างยังสร้าง 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 และรุ่นที่ต่ำกว่าโมดูลเคอร์เนลที่ระบุไว้ใน BOARD_VENDOR_KERNEL_MODULES จะถูกคัดลอกโดยแพลตฟอร์ม Android สร้างเป็นพาร์ทิชันที่ผู้ขาย /vendor/lib/modules แพลตฟอร์มสร้างวิ่ง depmod กับโมดูลเหล่านี้และสำเนา depmod ไฟล์ที่ส่งออกลงในพาร์ทิชันที่ผู้ขายในสถานที่เดียวกัน กลไกสำหรับโมดูลโหลดเคอร์เนลจาก /vendor ยังคงเหมือนเดิมอย่างที่มันเป็นสำหรับรุ่นก่อนของ Android มันเป็นเรื่องการตัดสินใจของคุณอย่างไรและเมื่อโหลดโมดูลเหล่านี้แม้ว่าโดยทั่วไปนี้จะทำโดยใช้ init.rc สคริปต์

ไวด์การ์ดและการสร้างเคอร์เนลแบบรวม

ผู้ขายที่รวมของพวกเขาสร้างอุปกรณ์เคอร์เนลกับแพลตฟอร์ม Android สร้างอาจทำงานเป็นปัญหาในการใช้ดังกล่าวข้างต้น BOARD แมโครเพื่อระบุโมดูลเคอร์เนลที่จะคัดลอกไปยังอุปกรณ์ หากผู้ขายมีความประสงค์ที่จะหลีกเลี่ยงรายการโมดูลเคอร์เนลในอุปกรณ์แพลตฟอร์มสร้างไฟล์พวกเขาสามารถใช้ตัวแทน ( $(wildcard device/vendor/mydevice/*.ko ). ทราบว่าตัวแทนไม่ทำงานในกรณีที่มีการแบบบูรณาการ การสร้างเคอร์เนล เนื่องจากเมื่อมีการเรียกใช้ make และมาโครถูกขยายใน makefiles โมดูลเคอร์เนลยังไม่ถูกสร้างขึ้น ดังนั้นมาโครจึงว่างเปล่า

เพื่อแก้ไขปัญหานี้ ผู้จำหน่ายอาจมีการสร้างเคอร์เนลสร้างไฟล์ zip ที่มีโมดูลเคอร์เนลที่จะคัดลอกไปยังแต่ละพาร์ติชั่น กำหนดเส้นทางที่เก็บไปรษณีย์ใน BOARD_*_KERNEL_MODULES_ARCHIVE ที่ * เป็นชื่อของพาร์ทิชัน (เช่น BOARD_VENDOR_KERNEL_MODULES_ARCHIVE ) นดรอยด์แพลตฟอร์มสร้างสารสกัดจากไฟล์ zip นี้ลงในตำแหน่งที่เหมาะสมและทำงาน depmod กับโมดูลที่

ไฟล์ zip ของโมดูลเคอร์เนลควรมีกฎ make ที่รับรองว่าบิลด์ของแพลตฟอร์มสามารถสร้างไฟล์เก็บถาวรได้เมื่อจำเป็น

การกู้คืน

ในรุ่น Android ก่อนโมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนที่ถูกระบุไว้ใน BOARD_RECOVERY_KERNEL_MODULES ใน Android 11 โมดูลเคอร์เนลที่จำเป็นสำหรับการกู้คืนยังคงถูกระบุโดยใช้มาโครนี้ อย่างไรก็ตาม โมดูลเคอร์เนลการกู้คืนจะถูกคัดลอกไปยังผู้จำหน่าย ramdisk cpio แทนที่จะเป็น ramdisk cpio ทั่วไป โดยค่าเริ่มต้นทุกโมดูลเคอร์เนลที่ระบุไว้ใน BOARD_RECOVERY_KERNEL_MODULES มีการโหลดในช่วงระยะแรก init ถ้าคุณต้องการที่เฉพาะชุดย่อยของโมดูลเหล่านี้จะโหลดระบุเนื้อหาของเซตว่าใน BOARD_RECOVERY_KERNEL_MODULES_LOAD

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