تغييرات أيون أبي

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

حول ايون

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

التغييرات في android-4.14

قام Kernel 4.12 بإعادة بناء كود Ion kernel بشكل كبير، حيث قام بتنظيف وإزالة أجزاء من Ion التي تتداخل مع أطر عمل kernel الأخرى. ونتيجة لذلك، لم تعد العديد من Ion ioctls القديمة ذات صلة وتمت إزالتها.

إزالة العملاء والمقابض الأيونية

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

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

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

قبل kernel 4.12، قدم Ion ION_IOC_SYNC ioctl لمزامنة واصف الملف مع الذاكرة. كان هذا ioctl سيئ التوثيق وغير مرن. ونتيجة لذلك، قام العديد من البائعين بتطبيق ioctls مخصص لإجراء صيانة ذاكرة التخزين المؤقت.

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

يعد DMA_BUF_IOCTL_SYNC جزءًا من ABI المستقر للنواة ويمكن استخدامه مع جميع dma-buf fds، سواء تم تخصيصها بواسطة Ion أم لا.

ترحيل رمز البائع إلى android-4.12+

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

استدعاء ion_user_handle_t القديم ما يعادل مكالمة dma-buf fd
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) غير متاح (هذه المكالمة غير مطلوبة مع dma-buf fds)
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, ...);

بالنسبة للعملاء داخل kernel ، نظرًا لأن Ion لم يعد يصدر أي واجهات برمجة تطبيقات تواجه kernel، يجب تحويل برامج التشغيل التي استخدمت مسبقًا واجهة برمجة تطبيقات Ion kernel داخل kernel مع ion_import_dma_buf_fd() لاستخدام واجهة برمجة تطبيقات dma-buf داخل kernel مع dma_buf_get() .

فواصل Ion ABI المستقبلية

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

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