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

โมดูลเคอร์เนลมีสองประเภท: โมดูล GKI ที่ไม่เชื่อเรื่องฮาร์ดแวร์ และ โมดูลผู้จำหน่าย เฉพาะฮาร์ดแวร์ หน้านี้แสดงภาพรวมของโมดูลทั้งสองประเภท

โมดูล GKI

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

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

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

โมดูล GKI มีสองประเภทเชิงตรรกะ: โมดูล GKI ที่มีการป้องกัน และ โมดูล GKI ที่ไม่มีการป้องกัน

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

Google จัดส่งโมดูล GKI ที่ได้รับการป้องกัน โดยไม่มีการจำกัดแต่อย่างใด และมีพฤติกรรมเหมือนกับว่ามันถูกสร้างขึ้นด้วยเคอร์เนลหลังจากโหลด นอกจากนี้ โมดูล 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