التغييرات في واجهة ION ABI

تتأثّر الأجهزة التي تعمل بالإصدار 4.14 من نظام التشغيل وإصدارات أحدث بإعادة هندسة وحدة ‎ION لنظام التشغيل، والتي تستدعيها العديد من عمليات تنفيذ HAL لموزّعي الذاكرة الرسومية (gralloc) لتخصيص ذاكرة التخزين المؤقت المشتركة. تقدّم هذه الصفحة إرشادات حول نقل رمز المورّد القديم إلى الإصدار الجديد من ION، وتناقش الأخطاء المحتملة في المستقبل لواجهة التطبيق الثنائية (ABI).

لمحة عن ION

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

التغييرات في الإصدار 4.14 من Android

أجرت الإصدار 4.12 من "النواة" عملية إعادة هندسة كبيرة لرمز "النواة ION"، ما أدى إلى تنظيف وإزالة أجزاء من ION التي تتداخل مع إطارات عمل "النواة" الأخرى. ونتيجةً لذلك، لم تعُد العديد من طلبات ioctl القديمة في ION ذات صلة وتمّت إزالتها.

إزالة عملاء ION وأسماء الحسابات

قبل إصدار kernel 4.12، كان فتح /dev/ion يخصّص عميل ION. خصصت دالة ION_IOC_ALLOC ioctl مخزنًا مؤقتًا جديدًا وأعادته إلى مساحة المستخدم كـ معرّف ION (عدد صحيح غير شفاف لا يُفيد إلا عميل ION الذي خصصه). لربط المخزن المؤقت بمساحة المستخدم أو مشاركته مع عمليات أخرى، تمت إعادة تصدير عناصر تحكّم ION كملف وصف dma-buf باستخدام ioctl ION_IOC_SHARE.

في kernel 4.12، تُخرج ioctl ION_IOC_ALLOC مباشرةً بيانات dma-buf fds. تمت إزالة حالة مقبض ION المتوسطة، بالإضافة إلى جميع أنواع الأسماء المعرِّفة التي تستهلك أو تنتج أسماء ION. بما أنّ ملفّات dma-buf fds ليست مرتبطة بعملاء ION محدّدين، لم تعُد هناك حاجة إلى ION_IOC_SHARE ioctl، وتمّت إزالة جميع البنية الأساسية لعملاء ION.

إضافة ioctls للحفاظ على اتساق ذاكرة التخزين المؤقت

قبل إصدار ‎4.12 من kernel، كان ION يقدّم ION_IOC_SYNC ioctl لمحاولة مزامنة معرّف الملف مع الذاكرة. كان ioctl هذا مستندًا بشكلٍ سيئ وغير مرن. ونتيجةً لذلك، نفَّذ العديد من المورِّدين رموز ioct مخصَّصة لإجراء صيانة ذاكرة التخزين المؤقت.

استبدلت الإصدار 4.12 من kernel ION_IOC_SYNC بملف ‎ DMA_BUF_IOCTL_SYNC ioctl المحدد في ملف ‎ linux/dma-buf.h. استخدِم DMA_BUF_IOCTL_SYNC في بداية كل عملية وصول إلى وحدة المعالجة المركزية وانتهائها، مع إشارات تحدِّد ما إذا كانت عمليات الوصول هذه هي عمليات قراءة و/أو كتابة. على الرغم من أنّ DMA_BUF_IOCTL_SYNC أكثر تفصيلاً من ION_IOC_SYNC، إلا أنّه يمنح userspace مزيدًا من التحكّم في عمليات صيانة ذاكرة التخزين المؤقت الأساسية.

DMA_BUF_IOCTL_SYNC هو جزء من ABI الثابت للنواة ويمكن استخدامه مع جميع ملفات dma-buf، سواء تم تخصيصها من خلال ION أو لا.

نقل رمز المورّد إلى الإصدار 4.12 من نظام التشغيل Android والإصدارات الأحدث

بالنسبة إلى عملاء مساحة المستخدم، ينصح فريق أنظمة Android بشدة باستخدام libion بدلاً من استخدام طلبات ioctl() البرمجية المفتوحة. اعتبارًا من Android 9، يرصد libion تلقائيًا واجهة التطبيق الثنائية (ION ABI) في وقت التشغيل ويحاول إخفاء أي اختلافات بين النواة. ومع ذلك، فإنّ أي وظائف libion التي أنشأت أو استخدمت ion_user_handle_t handles لم تعُد تعمل بعد استخدام الإصدار 4.12 من kernel. يمكنك استبدال هذه الدوال بالعمليات المكافئة التالية على dma-buf fds، وهي تعمل على جميع إصدارات kernel حتى الآن.

اتصال ion_user_handle_t قديم طلب مكافئ لرقم تعريف ملف dma-buf
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) لا ينطبق (لا يلزم إجراء هذا الطلب مع fds dma-buf)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) لا ينطبق (هذا الاتصال غير مطلوب مع dma-buf fds)
ion_sync_fd(ion_fd, buf_fd)
If (ion_is_legacy(ion_fd))
    ion_sync_fd(ion_fd, buf_fd);
else
    ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

بالنسبة إلى عملاء النواة، بما أنّ ION لم تعُد تُصدِّر أي واجهات برمجة تطبيقات موجّهة للنواة، يجب تحويل برامج التشغيل التي كانت تستخدِم في السابق واجهة برمجة تطبيقات ION للنواة مع ion_import_dma_buf_fd() لكي تتمكّن من استخدام واجهة برمجة تطبيقات dma-buf للنواة مع dma_buf_get().

فواصل واجهة ABI المستقبلية لنظام التشغيل ION

قبل نقل ION من شجرة التجميع المرحلي، قد تحتاج إصدارات النواة المستقبلية إلى كسر واجهة ION ABI مجددًا. لا يتوقّع فريق أنظمة Android أن تؤثّر هذه التغييرات في الأجهزة التي تعمل بالإصدار التالي من Android، ولكن قد تؤثّر هذه التغييرات في الأجهزة التي تعمل بالإصدارات اللاحقة من Android.

على سبيل المثال، اقترح منتدى التنفيذ تقسيم عقدة /dev/ion الفردية إلى عُقد متعددة لكل كومة من الذاكرة (مثلاً /dev/ion/heap0) للسماح للأجهزة بتطبيق سياسات SELinux مختلفة على كل لقطة. في حال تنفيذ هذا التغيير في إصدار مستقبلي من kernel، سيؤدي ذلك إلى إيقاف واجهة برمجة التطبيقات ION.