ภาพรวมของโมดูลเคอร์เนล

โมดูลเคอร์เนลมี 2 ประเภท ได้แก่ โมดูล GKI ที่ไม่คำนึงถึงฮาร์ดแวร์และโมดูลของผู้ให้บริการที่เจาะจงฮาร์ดแวร์ หน้านี้จะแสดงภาพรวมของข้อบังคับทั้ง 2 ประเภท

โมดูล GKI

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

โมดูล GKI ยังมีกลไกที่ช่วยให้ผู้ให้บริการรวมฟีเจอร์ใหม่ใน upstream ได้หลังจากผ่านเหตุการณ์สำคัญ "หยุดการอัปเดต KMI" คุณจะแทนที่โค้ดในตัวไม่ได้หากไม่สร้างภาพอื่น แต่โค้ดที่ส่งเป็นโมดูลจะแทนที่ด้วยโมดูลอื่นได้

โมดูล GKI ใช้โครงสร้างพื้นฐานการลงนามของเวลาสร้างเคอร์เนลเพื่อแยกความแตกต่างระหว่าง GKI กับโมดูลอื่นๆ ขณะรันไทม์ ระบบอนุญาตให้โหลดโมดูลที่ไม่ได้เซ็นชื่อได้ ตราบใดที่โมดูลดังกล่าวใช้เฉพาะสัญลักษณ์ที่ปรากฏในรายการที่อนุญาตหรือที่มาจากโมดูลอื่นๆ ที่ไม่ได้เซ็นชื่อ

โมดูล GKI มี 2 ประเภท ได้แก่ โมดูล GKI ที่มีการป้องกัน และโมดูล GKI ที่ไม่มีการป้องกัน

โมดูล GKI ที่มีการป้องกัน

โมดูล GKI ที่ปกป้องจะส่งโดย Google โดยไม่มีข้อจำกัดใดๆ และทำงานเหมือนกับว่าสร้างขึ้นด้วยเคอร์เนลหลังจากโหลด นอกจากนี้ โมดูล GKI ที่ปกป้องแล้วยังมีลักษณะต่อไปนี้

  • โมดูล GKI ที่มีการป้องกันจะมีสิทธิ์เข้าถึงสัญลักษณ์เคอร์เนลที่ไม่ใช่ KMI ซึ่งโมดูลของผู้ให้บริการหรือโมดูล GKI ที่ไม่มีการป้องกันจะไม่มีสิทธิ์เข้าถึง
  • โมดูล GKI ที่ปกป้องสามารถส่งออกสัญลักษณ์ที่จะกลายเป็นส่วนหนึ่งของแพลตฟอร์ม KMI ได้ ตราบใดที่มีการใช้สัญลักษณ์เหล่านั้นในรายการสัญลักษณ์
  • โมดูล GKI ที่ปกป้องไว้จะลบล้างโดยโมดูลของผู้ให้บริการไม่ได้

โมดูล GKI ที่มีการป้องกันเป็นคลาสเริ่มต้นของโมดูล GKI ระบบจะถือว่าข้อบังคับของ GKI ทั้งหมดได้รับการปกป้อง ณ เวลาที่หยุด KMI

โมดูล GKI ที่ไม่มีการป้องกัน

โมดูล GKI ที่ไม่มีการป้องกันจะลบล้างได้ด้วยโมดูลของผู้ให้บริการ หลังจากหยุดให้บริการ KMI แล้ว โมดูล GKI ที่ปกป้องไว้อาจได้รับการจัดประเภทใหม่ว่าไม่ได้รับการปกป้องหากทีม GKI ตัดสินใจว่าผู้ให้บริการต้องลบล้างการติดตั้งใช้งานเริ่มต้นด้วยเวอร์ชันที่มีฟีเจอร์ใหม่จาก Linux เวอร์ชันที่พัฒนาขึ้น ในรุ่น GKI ถัดไป ระบบจะจัดประเภทโมดูลที่ไม่มีการป้องกันใหม่เป็น "มีการป้องกัน" หลังจากที่โค้ดจาก upstream เข้าสู่ Android Common Kernel (ACK) โมดูล GKI ที่ไม่มีการป้องกันมีลักษณะดังนี้

  • โมดูล GKI ที่ไม่มีการป้องกันจะมีสิทธิ์เข้าถึงสัญลักษณ์ที่ส่งออกเช่นเดียวกับโมดูลของผู้ให้บริการ
  • โมดูล GKI ที่ไม่มีการป้องกันจะส่งออกสัญลักษณ์ที่ส่งออกโดยโมดูล GKI ที่มีการป้องกันไม่ได้
  • โมดูล GKI ที่ไม่มีการป้องกันต้องเก็บอินเทอร์เฟซ KMI ไว้ราวกับเป็นส่วนหนึ่งของเคอร์เนลหลัก
  • โมดูล GKI ที่ไม่มีการป้องกันจะลบล้างได้ด้วยโมดูลของผู้ให้บริการ

โมดูลของผู้ให้บริการ

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

เนื่องจากเป้าหมายหลักประการหนึ่งของโปรเจ็กต์ GKI คือการลดโค้ดเฉพาะฮาร์ดแวร์ในเคอร์เนลหลัก ผู้ให้บริการจึงมั่นใจได้ว่าเคอร์เนล GKI จะไม่รวมโมดูลที่จัดการฮาร์ดแวร์ของตนเองอย่างชัดเจน ตัวอย่างเช่น ผู้ให้บริการ ABC Inc. อาจคาดหวังว่าการกำหนดค่า เช่น CONFIG_ABC_SOC_SUPPORT จะเปิดใช้ไม่ได้ไม่ว่าจะเป็นแบบโมดูล GKI ในตัวหรือแบบโหลดได้ หากไม่มีการสนับสนุนจากผู้ให้บริการรายดังกล่าว

หากมีไดรเวอร์หรือเฟรมเวิร์กเคอร์เนลใน ACK แต่ไม่ได้ส่งเป็นส่วนหนึ่งของเคอร์เนล GKI เวนเดอร์จะแก้ไขไดรเวอร์และส่งเป็นโมดูลเวนเดอร์ได้ ไม่แนะนําให้แก้ไขโมดูลที่ไม่ใช่ของผู้ให้บริการ เนื่องจากความสามารถเดียวกันนี้อาจมาพร้อมกับเคอร์เนล GKI ในรุ่นถัดไป เมื่อเคอร์เนล GKI มีความสามารถที่โมดูลของผู้ให้บริการให้ไว้ โมดูลของผู้ให้บริการจะไม่โหลด เช่น CONFIG_GREYBUS ไม่ได้ตั้งค่าสำหรับ GKI ใน Android 11 ดังนั้นผู้ให้บริการจึงอาจส่งโมดูลผู้ให้บริการ Greybus อย่างไรก็ตาม ระบบอาจเปิดใช้ CONFIG_GREYBUS เป็น GKI ในตัวหรือเป็นโมดูลใน Android 12 ซึ่งในกรณีนี้ ระบบจะไม่โหลดโมดูลของผู้ให้บริการ Greybus แนวทางปฏิบัติแนะนำคือให้ใช้ไดรเวอร์เวอร์ชันอัปสตรีมที่ไม่เจาะจงผู้ให้บริการ หากมีการนําส่งเป็นข้อบังคับของผู้ให้บริการ

คุณสามารถส่งโมดูลของผู้ให้บริการในรูปแบบ vendor หรือรูปภาพ vendor_boot โมดูลที่จําเป็นในช่วงต้นของกระบวนการบูตต้องอยู่ใน vendor_boot ในการบูตระบบจะมีค่าใช้จ่ายที่เชื่อมโยงกับการโหลดโมดูลจาก vendor_boot