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

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

โมดูล GKI

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

นอกจากนี้ โมดูล GKI ยังมีกลไกที่ช่วยให้ผู้ให้บริการรวมฟีเจอร์ใหม่จากต้นทางได้หลังจากช่วงเวลาสำคัญของการหยุดการเปลี่ยนแปลง 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 เวอร์ชันถัดไป โมดูลที่ไม่มีการป้องกันจะถูกจัดประเภทใหม่เป็นโมดูลที่มีการป้องกันหลังจากโค้ดต้นทางเข้าสู่ Android Common Kernel (ACK) โมดูล GKI ที่ไม่มีการป้องกันมีลักษณะดังนี้

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

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

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

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

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

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