تتأثّر الأجهزة التي تعمل بالإصدار 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.