وحدات أكوام ION لـ GKI

تقوم العديد من الشركات المصنعة الأصلية لنظام التشغيل Android بتعديل برنامج تشغيل ION kernel لأسباب مختلفة، مثل إضافة أكوام الموردين وتخصيص إدارة ذاكرة التخزين المؤقت (للحصول على تفاصيل حول هذه التعديلات، راجع دمج مخصص ذاكرة ION ). لتمكين مصنعي المعدات الأصلية من الاحتفاظ بمثل هذه التعديلات عند استخدام Generic Kernel Image (GKI) ، يقدم Android Common Kernel v5.4 إطار عمل لتكوين وحدات أكوام ION الخاصة بالبائعين مع الحفاظ على برنامج تشغيل ION الأساسي المدمج. ويوضح الشكل التالي تخطيط صورة kernel .

أكوام الأيونات المعيارية

الشكل 1. برنامج تشغيل نواة ION المعياري

تتمتع أكوام الأيونات المعيارية بالمزايا التالية.

  • يمكن أن يكون برنامج التشغيل الأساسي ION جزءًا من صورة GKI، مما يتيح لجميع تحسينات الأداء المستقلة عن الجهاز وإصلاحات الأخطاء الوصول إلى جميع الأجهزة.
  • يمكن لبرنامج التشغيل الأساسي ION في kernel المشترك التعامل مع تسجيل الكومة وإدارة الواجهة لعملاء مساحة المستخدم والنواة. وحدات كومة الذاكرة المؤقتة الخاصة بالمورد مطلوبة فقط لتنفيذ عمليات الكومة المخصصة.
  • يمكن أن يتضمن برنامج تشغيل ION الأساسي (كجزء من GKI) خطافات لتسهيل تتبع استخدام الذاكرة، وهو ما لم يكن ممكنًا عندما كان لدى كل مصنع OEM نسخته الخاصة من برنامج تشغيل ION.
  • يجب أن تجعل أكوام ION الخاصة بالمورد المعياري أي انتقالات مستقبلية إلى أكوام dmabuf أسهل.

تنفيذ

يمكن لوحدات الكومة ION تسجيل عمليات dmabuf الخاصة بها لتجاوز العمليات المسجلة بواسطة برنامج تشغيل ION الأساسي. تقوم عملية dmabuf (مثل get_flags() ) التي لا يدعمها برنامج تشغيل ION الأساسي بإرجاع -EOPNOTSUPP إذا كان تنفيذ الكومة يفتقر إلى التجاوزات الضرورية.

لتحسين الأداء، يمكن لبرنامج تشغيل dmabuf إجراء صيانة جزئية لذاكرة التخزين المؤقت (راجع قائمة التغيير ). يمكن لعملاء Kernel استخدام وظائف dma_buf_begin_cpu_access_partial و dma_buf_end_cpu_access_partial لإجراء صيانة جزئية لذاكرة التخزين المؤقت.

يحتوي Android Common Kernel على تطبيقات معيارية للنظام وأكوام مخصصة للذاكرة المتجاورة (CMA) لاستخدامها كمرجع لوحدات الكومة.

تغييرات على رأس ION UAPI

يحتوي رأس واجهة برمجة تطبيقات مساحة مستخدم ION (UAPI) على تعداد 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 ) لإجراء عمليات التخصيص.