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