تقسيم أكواد ION إلى وحدات أساسية لـ GKI

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

حزم ION القابلة للتجميع

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

تتمتع أكوام ION الوحدات بالمزايا التالية:

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

التنفيذ

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

لتحسين الأداء، يمكن لبرنامج تشغيل 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) لإجراء عمليات التوزيع.