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