โมดูลเคอร์เนลมี 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 Surface ได้ ตราบใดที่มีการอ้างอิงสัญลักษณ์เหล่านั้นในรายการสัญลักษณ์
- โมดูล 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 ในตัวหรือที่โหลดได้โดยไม่ได้รับการสนับสนุน
หากมีไดรเวอร์หรือเฟรมเวิร์กของเคอร์เนลใน ACK แต่ไม่ได้จัดส่งเป็นส่วนหนึ่งของเคอร์เนล GKI ผู้ให้บริการสามารถแก้ไขไดรเวอร์และจัดส่งเป็นโมดูลของผู้ให้บริการได้ เราไม่แนะนำให้แก้ไขโมดูลที่ไม่เฉพาะเจาะจงของผู้ให้บริการ
เนื่องจากความสามารถเดียวกันนี้อาจมาพร้อมกับเคอร์เนล GKI ในรุ่น
อนาคต เมื่อเคอร์เนล GKI มีความสามารถที่จัดหาโดยโมดูลของผู้ให้บริการ
โมดูลของผู้ให้บริการจะไม่โหลด เช่น ไม่ได้ตั้งค่า
CONFIG_GREYBUS
สำหรับ GKI ใน Android 11 ดังนั้น
ผู้ให้บริการอาจส่งโมดูลของผู้ให้บริการ Greybus อย่างไรก็ตาม CONFIG_GREYBUS
อาจ
เปิดใช้เป็น GKI ในตัวหรือโมดูลใน Android 12
ในกรณีนี้ ระบบจะไม่โหลดโมดูลของผู้ให้บริการ Greybus แนวทางปฏิบัติแนะนำคือการใช้
ไดรเวอร์เวอร์ชันต้นทางที่ไม่เจาะจงผู้ให้บริการ หากมีการส่งเป็น
โมดูลของผู้ให้บริการ
คุณสามารถนำส่งโมดูลของผู้ให้บริการใน vendor
หรือ
vendor_boot
อิมเมจ โมดูลที่จำเป็นในช่วงต้นของกระบวนการบูตต้องอยู่ใน vendor_boot
การโหลดโมดูลจาก vendor_boot
จะมีค่าใช้จ่ายในเวลาบูต