แยกฮีป ION สำหรับ GKI

Android OEM จำนวนมากแก้ไขไดรเวอร์เคอร์เนล ION ด้วยเหตุผลหลายประการ เช่น การเพิ่มฮีปผู้ให้บริการและปรับแต่งการจัดการแคช (โปรดดูรายละเอียดเกี่ยวกับ การแก้ไข โปรดดูการผสานรวมหน่วยความจำ ION allocator) หากต้องการเปิดให้ OEM ดำเนินการต่อไปนี้ได้ เก็บรักษาการปรับเปลี่ยนดังกล่าวเมื่อใช้อิมเมจเคอร์เนลทั่วไป (GKI), Android Common Kernel v5.4 มีเฟรมเวิร์กสำหรับการปรับ ION เฉพาะผู้ให้บริการเป็นโมดูล ฮีปแล้วขณะรักษาไดรเวอร์ ION หลักเอาไว้ในตัว รูปต่อไปนี้แสดง แบบรูปภาพเคอร์เนล

ฮีป ION แบบประกอบ

รูปที่ 1 ไดรเวอร์เคอร์เนล ION แบบโมดูล

ฮีป ION แบบโมดูลมีข้อดีดังต่อไปนี้

  • ไดรเวอร์หลักของ ION สามารถเป็นส่วนหนึ่งของรูปภาพ GKI ได้ ซึ่งช่วยให้ การเพิ่มประสิทธิภาพที่ไม่ขึ้นอยู่กับอุปกรณ์ และแก้ไขข้อบกพร่อง อุปกรณ์
  • ไดรเวอร์หลัก ION ในเคอร์เนลทั่วไปสามารถจัดการการลงทะเบียนฮีปและ จัดการอินเทอร์เฟซไปยังไคลเอ็นต์ผู้ใช้และเคอร์เนล โมดูลฮีปของผู้ให้บริการ จะจำเป็นต่อการใช้งานการดำเนินการฮีปที่กำหนดเองเท่านั้น
  • ไดรเวอร์แกน ION (เป็นส่วนหนึ่งของ GKI) สามารถมีฮุกเพื่อความจำได้ง่ายขึ้น การติดตามการใช้งาน ซึ่งเป็นไปไม่ได้เมื่อ OEM แต่ละแห่งมีเวอร์ชันของตัวเอง ไดรเวอร์ ION
  • ฮีป ION ของผู้ให้บริการแบบโมดูล ควรเปลี่ยนไปใช้ฮีป dmabuf ในอนาคต ได้ง่ายยิ่งขึ้น

การใช้งาน

โมดูลฮีป ION สามารถลงทะเบียนการดำเนินการ dmabuf ของตนเองเพื่อลบล้างโมดูล จดทะเบียนโดยไดรเวอร์หลักของ ION การดำเนินการ dmabuf (เช่น get_flags()) ซึ่งไดรเวอร์ ION หลักไม่รองรับจะแสดงผล -EOPNOTSUPP หากฮีป ที่ไม่มีการลบล้างที่จำเป็น

เพื่อปรับปรุงประสิทธิภาพ ไดรเวอร์ dmabuf จะดำเนินการแคชบางส่วนได้ การบำรุงรักษา (ดู changelist) ไคลเอ็นต์ Kernel สามารถใช้ dma_buf_begin_cpu_access_partial และ dma_buf_end_cpu_access_partial เพื่อดำเนินการบำรุงรักษาแคชบางส่วน

Android Common Kernel มีการใช้ระบบแบบโมดูลและ ฮีปที่จัดสรรหน่วยความจำ (CMA) อย่างต่อเนื่องเพื่อใช้เป็นข้อมูลอ้างอิงสำหรับฮีป การแยกส่วน

การเปลี่ยนแปลงส่วนหัวของ ION UAPI

ส่วนหัว ION User Space API (UAPI) มี enum ion_heap_id สำหรับใช้ใน กำหนดช่วงของรหัสฮีปสำหรับใช้โดยฮีปของผู้ให้บริการ

 /**
 * ion_heap_id - list of heap IDs that Android can use
 *
 * @ION_HEAP_SYSTEM        ID for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_DMA_START     Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END       End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START  Start of reserved ID range for heaps of custom type
 * @ION_HEAP_CUSTOM_END    End of reserved ID range for heaps of custom type
 */

enum ion_heap_id {

   ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),

   ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),

   ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
   ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),

   ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};

นอกจากนี้ IOCTL (ION_IOC_ABI_VERSION) ใหม่ยังช่วยลูกค้าด้านพื้นที่ทำงานของผู้ใช้ได้ ให้พิจารณาว่ามีการใช้ฮีปแบบแยกส่วนหรือไม่

การลบล้างฮีปของระบบทั่วไป

ฮีประบบ ION สร้างขึ้นและเป็นส่วนหนึ่งของอิมเมจ GKI เพื่อให้แน่ใจว่า ฟีเจอร์ที่จำเป็นต้องเข้าถึงฮีปทั่วไป/ที่ไม่ขึ้นอยู่กับอุปกรณ์จะขึ้นอยู่กับฮีป ที่มีอยู่ ดังนั้นคุณจะลบล้างรหัสฮีปของ ION_HEAP_SYSTEM ไม่ได้ ถึง สร้างฮีปของระบบที่กำหนดเอง ใช้รหัสฮีปในช่วงที่กำหนดเอง (ION_HEAP_CUSTOM_START ถึง ION_HEAP_CUSTOM_END) เพื่อจัดสรร