برنامج تشغيل بطاقة الرسومات: إذن لمن الخلل؟

دفعت مقالة حديثة إلى إعداد هذه المادة " قد يكشف خطأ برنامج تشغيل بطاقة الفيديو عما تم عرضه في وضع التصفح المتخفي ." ولدت هذه المقالة بعد نشر الطريقة التافهة لعرض صورة تنتمي إلى أي عملية (بما في ذلك تم إنهاؤها) ، وربما حتى مطالبات بحماية المعلومات.

نظرًا لأنني منخرط أيضًا في تطوير محركات الرسوم البيانية ، عن طريق الصدفة ، سأحاول أن أشرح بإيجاز ما الخطأ الذي ارتكبه كاتب تقرير الخطأ الأصلي ، ومسؤولية المشكلة وكيف يمكن حلها.



بغض النظر عن نظام التشغيل ، وواجهات برمجة التطبيقات للنظام ذات الصلة ، وواجهات التطبيق لتطوير التطبيقات الرسومية ، فإن برنامج تشغيل بطاقة الفيديو التعسفي يحل المهام التالية على مستوى النظام:

  • تهيئة وحدة التحكم في العرض ( ضبط وضع الفيديو ، وإدارة منافذ GPU ، وتشكيل صورة واحدة / عدة صور مستقلة ، ... ) ؛
  • إدارة الذاكرة القابلة للعنونة ( قوائم انتظار الأوامر ، العنونة الخطية / التجانبية ، تخصيص السطح ، جداول ترجمة العنوان ، امتداد فتحة PCI ، ... ) ؛
  • تسارع ثنائي الأبعاد ( المؤشر ، طبقات الأجهزة ، مفاتيح ألفا / كروما ، شرطة عمان السلطانية ، المواد الأولية ، ... ) ؛
  • تسريع ثلاثي الأبعاد ( OpenGL ، OpenGL ES / EGL ، OpenVG / EGL ، OpenCL ، Open * ) ؛
  • فك تشفير الفيديو / تشغيل الصوت / طرح EDID / ضغط المخزن المؤقت للإطارات ، ...

لقد تم تقليص نُهج حل المهام المطبقة في كل مرحلة إلى الممارسات الراسخة. هذا يفسر فقط تكرار المشكلة المشار إليها على أجهزة الشركات المصنعة المختلفة. بالنظر إلى المستقبل ، يمكنني القول أنه يمكنك الحصول على تأثير مماثل على وحدات تحكم Intel. تم تحديد مؤلف تقرير الخطأ بدقة تامة في إطار الحل الذي تنشأ عنه المشكلة - إدارة الذاكرة القابلة للعنونة.



إدارة الذاكرة


الكيان الرئيسي الذي يعمل السائق في هذه المرحلة هو السطح. يُعرف السطح عمومًا بجزء مستمر من الفيديو أو ذاكرة الوصول العشوائي المستخدمة لتكوين صورة بواسطة تطبيق ما. بالنسبة لوحدات التحكم التي ليس لها ذاكرة خاصة بها ، يمكن أن يصبح المورد المخصص من ذاكرة الوصول العشوائي قابلاً للعنونة من خلال جدول ترجمة العنوان (جدول ترجمة الرسومات ، GTT). خلاف ذلك ، يمكن عرض الصورة فقط عند نسخ السطح إلى ذاكرة الفيديو ، إما عن طريق وحدة تحكم DMA ، إن وجدت ، أو بسبب موارد وحدة المعالجة المركزية.

في الواقع ، حتى وحدات التحكم ذات الذاكرة المنفصلة الخاصة بها في معظم الحالات تعالجها أيضًا عبر GTT ، لأنه بهذه الطريقة من الممكن إنشاء مساحة عنوان افتراضية عن طريق القياس مع المعالج المركزي TLB لتوفير عنوان خطي أو تجانب. تحدد طريقة العنونة في كل حالة السائق وليس هناك فرق جوهري بينهما في إطار هذه المقالة.

مثال عن معالجة البلاط في ذاكرة الفيديو من مقالة المصدر
الصورة

برنامج تشغيل وحدة تحكم الرسومات هو واجهة نظام التشغيل لوظيفة GPU ، لا أكثر. يتم تعيين جميع المهام لضمان حماية المعلومات إلى أي مستوى أعلى مسؤول عن ذلك. لهذا ، فإن السائقين لديهم جميع الوظائف المتاحة ، ستكون هناك رغبة في استخدامه.

لذلك ، بناء على طلب بعض برامج تشغيل العميل ، يحتفظ نظام التشغيل (يخصص) مجموعة من الأسطح لذلك. نظرًا لأنه ، وفقًا للمؤلف ، فإن تجزئة الصورة نادر نسبيًا ، يمكننا القول أن معالجة التجانب لا يتم استخدامها غالبًا في هذه الحالات. مع العنونة الخطية ، يتميز كل سطح في المقام الأول بالإزاحة من بداية مساحة العنوان الظاهرية لذاكرة وحدة التحكم. عند تخصيص الذاكرة ، يقوم برنامج التشغيل بإرجاع نظام التشغيل هذا الإزاحة بالضبط ، والذي يتوافق مع كتلة ذاكرة مجانية يمكنها استيعاب السطح بالخصائص المطلوبة من قبل البرنامج التطبيقي. في هذه الحالة ، يقوم السائق بتنفيذ الإجراءات التالية فقط: يعدل GTT للاستخدام الإضافي لصفحات الذاكرة الافتراضية ، ويرصد الامتثال لمتطلبات محاذاة العناوين الفعلية ،يحدد آلية الوصول إلى البرامج التطبيقية على السطح (فتحة PCI / GPU ، على عنوان مادي خارج الفتحة ، ملحق GTT سريعًا) ، يحجز جزءًا من الذاكرة لاحتياجاته الخاصة.

استنادًا إلى ما سبق ، يمكننا أن نستنتج أنه عند وجود معلومات حول إجمالي حجم ذاكرة وحدة التحكم المتوفرة وخصائص السطح المطلوبة ، يمكن حل تحديد الإزاحة لجميع وحدات التحكم بنفس الطريقة. من الناحية العملية ، هذه هي الحالة (تسترشد بالتجربة مع العديد من أنظمة التشغيل التي تشبه يونكس): يوفر نظام التشغيل خدمة / مكتبة النظام التي تقوم بتخزين قائمة كتل الذاكرة المستخدمة بالفعل وتسمح لك بحساب الإزاحة المتاحة الأولى للنسخ الاحتياطي المنطقي بسرعة داخل هذه المكتبة. في نفس الوقت ، بعد الحصول على معلومات من برنامج التشغيل حول آلية الوصول إلى كتلة الذاكرة ، يسمح نظام التشغيل بشكل عام بتشكيل برامج التطبيق على نفس العناوين الفعلية للأسطح المشتركة / المتقاطعة.

إذا كان السائق لا يتحكم بشكل واضح في الأسطح ، فكيف يتم تنفيذ التسارع؟
. - , , ( ), .

( ) , ( ), .




العودة إلى المشكلة الأصلية


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

في الواقع ، الاختبار المكتوب لنشر تقرير الخطأ غير ضروري. في الحالة العامة (عندما تتناسب ذاكرة الفيديو مع فتحة PCI / GPU) ، لا يلزم وجود واجهات برمجة تطبيقات للتطبيقات التي تشبه أنظمة يونكس. يكفي الاتصال / dev / mem باستخدام الإزاحة المعروفة من إخراج الأداة المساعدة "lspci".

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

هناك العديد من الحلول ، وأعتقد أن الاستنتاجات ستكون واضحة:
  • يجب على جميع الشركات المصنعة للسائقين تنفيذ وظائف زائدة لتخزين المعلومات حول الأسطح الموجودة (تظل مسألة التحكم في الأسطح المشتركة مفتوحة ) ؛
  • يجب أن يراقب نظام التشغيل الحاجة إلى هذا التطبيق أو ذاك لترتيب ( هذا هو علامة معينة على الأسطح المحمية ، أو التصفير المفرط لأي أسطح في ذاكرة الوصول العشوائي وذاكرة الفيديو ) ؛
  • يجب أن ينظف البرنامج التطبيقي بشكل صحيح بعده ، لأنه يدعي أنه متورط في أمن المعلومات.

آمل أن تكون المذكرة مثيرة للاهتمام.

Source: https://habr.com/ru/post/ar389039/


All Articles