การรักษาอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ที่เสถียรสำหรับโมดูลของผู้ให้บริการ เป็นสิ่งสำคัญ เคอร์เนล GKI สร้างและจัดส่งในรูปแบบไบนารี และโมดูลที่โหลดได้ของผู้ให้บริการจะสร้างใน โครงสร้างแยกต่างหาก เคอร์เนล GKI และโมดูลของผู้ให้บริการที่ได้ต้องทำงานได้ ราวกับว่าสร้างขึ้นมาด้วยกัน
โดยทั่วไปแล้ว ชุมชน Linux ไม่เห็นด้วยกับแนวคิดเรื่องความเสถียรของ ABI ในเคอร์เนล สำหรับเคอร์เนลหลัก เนื่องจากมีเครื่องมือต่างๆ การกำหนดค่า และเคอร์เนล Linux mainline ที่พัฒนาอยู่ตลอดเวลา จึงไม่สามารถรักษา KMI ที่เสถียรใน mainline ได้ อย่างไรก็ตาม คุณสามารถรักษา KMI ที่เสถียรในสภาพแวดล้อม GKI ที่มีข้อจำกัดสูงได้โดยมีข้อจำกัดต่อไปนี้
ใช้การกำหนดค่าได้เพียงรายการเดียวเท่านั้น
gki_defconfigเพื่อสร้างเคอร์เนลKMI จะเสถียรเฉพาะภายใน LTS และ Android เวอร์ชันเดียวกันของเคอร์เนล เช่น
android14-6.1,android15-6.6หรือandroid16-6.12- ไม่มีการรักษาความเสถียรของ KMI สำหรับ
android-mainline
- ไม่มีการรักษาความเสถียรของ KMI สำหรับ
ใช้เฉพาะชุดเครื่องมือ Clang ที่เฉพาะเจาะจงซึ่งจัดหาให้ใน AOSP และกำหนดไว้สำหรับ สาขาที่เกี่ยวข้องในการสร้างเคอร์เนลและโมดูล
เฉพาะสัญลักษณ์ที่ทราบว่าโมดูลใช้ตามที่ระบุไว้ในรายการสัญลักษณ์เท่านั้นที่จะ ได้รับการตรวจสอบเพื่อความเสถียรและถือเป็นสัญลักษณ์ KMI
- ผลที่ตามมาคือโมดูลของผู้ให้บริการต้องใช้สัญลักษณ์ KMI เท่านั้น ข้อจำกัดนี้ จะบังคับใช้โดยการโหลดโมดูลที่ไม่สำเร็จหากจำเป็นต้องใช้สัญลักษณ์ที่ไม่ใช่ KMI
หลังจากที่สาขา KMI ถูกระงับแล้ว คุณจะทำการเปลี่ยนแปลงได้ แต่ต้องไม่ทำให้ KMI เสียหาย การเปลี่ยนแปลงต่างๆ มีดังนี้
- การเปลี่ยนแปลงการกำหนดค่า
- การเปลี่ยนแปลงโค้ดเคอร์เนล
- การเปลี่ยนแปลง Toolchain (รวมถึงการอัปเดต)
ใช้กระบวนการบิลด์แบบปิดและชุดเครื่องมือ LLVM
กระบวนการบิลด์แบบเฮอร์เมติกช่วยให้มั่นใจได้ว่า KMI จะเสถียรโดยการให้repoไฟล์ Manifest ใน
kernel/manifestอธิบายสภาพแวดล้อมของบิลด์อย่างสมบูรณ์ เช่น
ไฟล์ Manifest สำหรับ android16-6.12
มี Toolchain, ระบบบิลด์ และทุกอย่างที่จำเป็นในการสร้าง
เคอร์เนล Generic Kernel Image (GKI) การกำหนดค่าบิลด์ ซึ่งส่วนใหญ่คือ
BUILD.bazel
ช่วยให้มั่นใจได้ว่าเครื่องมือที่รวมไว้จะถูกนำไปใช้อย่างถูกต้องเพื่อสร้างผลลัพธ์บิลด์ที่สอดคล้องกัน
การใช้กระบวนการบิลด์แบบปิดยังช่วยให้มั่นใจได้ว่าคำอธิบาย ABI สำหรับ
ทรีนั้นสอดคล้องกัน ไม่ว่าจะสร้างโดย Google (เช่น
gki/aarch64/abi.stg
สำหรับ android16-6.12) หรือสร้างในทรีในเครื่องที่มีโมดูลของผู้ให้บริการ
นอกจากนี้ เรายังมี
เครื่องมือในการสร้างและเปรียบเทียบคำอธิบาย ABI
สำหรับ Kernel Module Interface (KMI) ซึ่งเป็นส่วนหนึ่งของที่เก็บ
ที่อธิบายไว้ในไฟล์ Manifest
Toolchain ที่ใช้สร้างเคอร์เนล GKI ต้องเข้ากันได้กับ Toolchain ที่ใช้สร้างโมดูลของผู้ให้บริการอย่างสมบูรณ์ ตั้งแต่ Android 10 เป็นต้นไป เคอร์เนล Android ทั้งหมดต้องสร้าง ด้วยชุดเครื่องมือ LLVM เมื่อใช้ GKI เชนเครื่องมือ LLVM ที่ใช้สร้างเคอร์เนลของผลิตภัณฑ์ และโมดูลของผู้ให้บริการต้องสร้าง ABI เดียวกันกับเชนเครื่องมือ LLVM จาก AOSP และพาร์ทเนอร์ต้องตรวจสอบว่า KMI เข้ากันได้กับเคอร์เนล GKI เราขอแนะนำอย่างยิ่งให้ใช้เครื่องมือบิลด์ที่ให้มา เนื่องจากเครื่องมือเหล่านี้มีความเข้ากันได้ดีที่สุด
ต้องทำอะไรต่อ
ดูวิธีการสร้างเคอร์เนลโดยใช้กระบวนการบิลด์แบบปิดและ ชุดเครื่องมือ LLVM ได้ที่ สร้างเคอร์เนล
ดูวิธีการตรวจสอบ ABI และแก้ไขปัญหาได้ที่ การตรวจสอบ ABI ของเคอร์เนล Android