การทำโมดูล ION Heaps สำหรับ GKI

หลาย Android OEMs ปรับเปลี่ยนไดรเวอร์ ION เคอร์เนลด้วยเหตุผลต่างๆเช่นการเพิ่มกองผู้ขายและการจัดการการปรับแต่งแคช (สำหรับรายละเอียดเกี่ยวกับการปรับเปลี่ยนเหล่านี้หมายถึง การบูรณาการจัดสรรหน่วยความจำ ION ) ต้องการเปิดใช้งานเพื่อรักษา OEMs การปรับเปลี่ยนดังกล่าวเมื่อใช้ ทั่วไป Kernel ภาพ (GKI) , Android สามัญ Kernel V5.4 เปิดตัวกรอบสำหรับ modularizing กอง ION ผู้จัดจำหน่ายเฉพาะในขณะที่เก็บโปรแกรมควบคุมหลัก ION ตัวใน. แสดงให้เห็นว่ารูปต่อไปนี้รูปแบบภาพ kernel .

โมดูล ION Heaps

เคอร์เนลไดรเวอร์รูปที่ 1 การปรับมาตรฐานไอออน

ฮีป ION แบบแยกส่วนมีข้อดีดังต่อไปนี้

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

กำลังดำเนินการ

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

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

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

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

พื้นที่ใช้ ION API (UAPI) ส่วนหัวมี ion_heap_id enum สำหรับการใช้งานในการกำหนดช่วงของรหัสกองสำหรับการใช้งานโดยกองผู้ขาย

 /**
 * 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 ) เพื่อดำเนินการจัดสรร