وحدة نواة قابلة للتحميل

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

تدعم معظم أنظمة التشغيل الشبيهة بنظام يونكس وأنظمة ويندوز الحالية وحدات نواة قابلة للتحميل، ولكن بأسماء مختلفة، مثل وحدة النواة القابلة للتحميل (kld) في نظام FreeBSD ، وامتداد النواة (kext) في نظام macOS (مع أن دعم وحدات الطرف الثالث آخذ في التناقص [ 1 ][ 2 ] ووحدة امتداد النواة في نظام AIX ، ووحدة النواة القابلة للتحميل ديناميكيًا في نظام HP-UX ، [ 3 ] وبرنامج تشغيل وضع النواة في نظام Windows NT، [ 4 ] ووحدة النواة القابلة للتنزيل (DKM) في نظام VxWorks . وتُعرف أيضًا باسم وحدة النواة القابلة للتحميل (KLM)، أو ببساطة وحدة النواة (KMOD).

المزايا

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

العيوب

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

تطبيقات في أنظمة تشغيل مختلفة

لينكس

يتم تحميل وحدات نواة لينكس (وإلغاء تحميلها) باستخدام modprobeالأمر `ls`. توجد هذه الوحدات في المسار `/usr /lib` /lib/modulesأو `/ /usr/lib/modulesusr/lib`، ولها الامتداد .ko`('kernel object')` منذ الإصدار 2.6 (كانت الإصدارات السابقة تستخدم الامتداد `/usr/lib` .o). [ 5 ] يعرض الأمر lsmod`ls` قائمة بوحدات النواة المحملة. في حالات الطوارئ، عندما يفشل النظام في الإقلاع بسبب عطل في إحدى الوحدات، يمكن تفعيل أو تعطيل وحدات معينة عن طريق تعديل قائمة معلمات إقلاع النواة (على سبيل المثال، عند استخدام GRUB ، بالضغط على 'e' في قائمة بدء GRUB، ثم تعديل سطر معلمات النواة).

مشاكل الترخيص

يرى القائمون على صيانة لينكس أن وحدات النواة المحدودة (LKM) هي أعمال مشتقة من النواة . ويتسامح القائمون على صيانة لينكس مع توزيع الوحدات الاحتكارية (مثل برامج تشغيل وحدات معالجة الرسومات من إنفيديا )، لكنهم لا يسمحون إلا بدمج الوحدات المرخصة بموجب رخصة جنو العمومية (GPL) في شجرة نواة لينكس الرئيسية.

يؤدي تحميل وحدة نمطية احتكارية أو غير متوافقة مع رخصة جنو العمومية (GPL) إلى وضع علامة "تلوث" [ 6 ] [ 7 ] في نواة النظام قيد التشغيل، مما يعني أن أي مشاكل أو أخطاء قد تظهر ستكون أقل عرضة للتحقيق من قبل القائمين على الصيانة. [ 8 ] [ 9 ] تصبح وحدات نواة النظام القابلة للتحميل (LKMs) جزءًا لا يتجزأ من نواة النظام قيد التشغيل، وبالتالي يمكنها إتلاف هياكل بيانات النواة وإنتاج أخطاء قد يتعذر التحقيق فيها إذا كانت الوحدة النمطية احتكارية بالفعل.

جدل لينكسانت

في عام 2004، حاولت شركة Linuxant، وهي شركة استشارية تصدر برامج تشغيل الأجهزة الاحتكارية كوحدات نواة قابلة للتحميل، إساءة استخدام مُنهي السلسلة الفارغ في برنامجها MODULE_LICENSE، كما هو واضح في مقتطف الشفرة التالي:

MODULE_LICENSE ( "GPL \0 للملفات الموجودة في دليل " GPL \" ؛ بالنسبة للملفات الأخرى، ينطبق ملف الترخيص فقط" );

حاولت شفرة مقارنة السلاسل النصية التي استخدمها النواة في ذلك الوقت تحديد ما إذا كانت الوحدة مرخصة بموجب رخصة جنو العمومية (GPL)، لكنها توقفت عند وصولها إلى حرف فارغ ( \0​​)، مما أدى إلى خداعها وجعلها تعتقد أن الوحدة تعلن عن ترخيصها على أنه "GPL" فقط. [ 10 ]

فري بي إس دي

تُخزَّن وحدات نواة FreeBSD/boot/kernel/ في مجلدات مخصصة للوحدات الموزعة مع نظام التشغيل ، أو عادةً /boot/modules/للوحدات المُثبَّتة من منافذ FreeBSD أو حزم FreeBSD ، أو للوحدات الاحتكارية أو الوحدات الثنائية فقط. تحمل وحدات نواة FreeBSD عادةً الامتداد .ko. . بعد إقلاع الجهاز، يمكن تحميلها باستخدام kldloadالأمر ، وإلغاء تحميلها باستخدام kldunload، وعرضها باستخدام kldstat. كما يمكن تحميل الوحدات من المُحمِّل قبل بدء تشغيل النواة، إما تلقائيًا (عبر /boot/loader.conf) أو يدويًا.

نظام التشغيل macOS

يمكن تحميل بعض وحدات نواة نظام macOS تلقائيًا. كما يمكن تحميلها يدويًا باستخدام kextloadالأمر `loading`. ويمكن عرضها باستخدام kextstatالأمر `loading`. توجد وحدات النواة القابلة للتحميل في حزم بامتداد ` .kext..`. تُخزَّن الوحدات المرفقة مع نظام التشغيل في /System/Library/Extensionsالدليل `..`، بينما تُخزَّن الوحدات المُقدَّمة من جهات خارجية في أدلة أخرى.

نت وير

يُشار إلى وحدة نواة NetWare باسم وحدة NetWare القابلة للتحميل (NLM). تُضاف وحدات NLM إلى نواة NetWare باستخدام الأمر LOAD، وتُزال باستخدام الأمر UNLOAD؛ ويعرض الأمر modulesقائمة بوحدات النواة المُحمّلة حاليًا. يمكن أن تتواجد وحدات NLM في أي مسار بحث صالح مُعيّن على خادم NetWare، ولها .NLMامتداد اسم الملف .

VxWorks

يمكن إنشاء مشروع من نوع وحدة نواة قابلة للتنزيل (DKM) لإنشاء ملف ".out" يمكن تحميله إلى مساحة النواة باستخدام الأمر "ld". ويمكن إلغاء تحميل وحدة النواة القابلة للتنزيل هذه باستخدام الأمر "unld".

سولاريس

يحتوي نظام Solaris على مسار تحميل وحدات النواة قابل للتكوين، ويكون مساره الافتراضي هو /platform/platform-name/kernel /kernel /usr/kernel. توجد معظم وحدات النواة في مجلدات فرعية ضمن /kernel. أما الوحدات التي لا تُعتبر ضرورية لتشغيل النظام حتى بدء عملية init، فغالبًا ما توجد (ولكن ليس دائمًا) في /usr/kernel. عند تشغيل إصدار نواة DEBUG، يحاول النظام بنشاط إلغاء تحميل الوحدات.

التوافق الثنائي

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

تحافظ أنظمة تشغيل أخرى، مثل Solaris و FreeBSD و macOS و Windows، على استقرار واجهة برمجة التطبيقات (API) وواجهة التطبيق الثنائية (ABI) لنواة النظام، متجنبةً بذلك هذه المشكلة. على سبيل المثال، ستعمل وحدات نواة FreeBSD المُجمَّعة باستخدام إصدار النواة 6.0 دون الحاجة إلى إعادة تجميعها على أي إصدار آخر من FreeBSD 6.x، مثل 6.4. مع ذلك، فهي غير متوافقة مع الإصدارات الرئيسية الأخرى، ويجب إعادة تجميعها لاستخدامها مع FreeBSD 7.x، حيث يتم الحفاظ على توافق واجهة برمجة التطبيقات وواجهة التطبيق الثنائية (API) ضمن الفرع فقط.

حماية

على الرغم من أن وحدات النواة القابلة للتحميل تُعدّ طريقةً ملائمةً لتعديل النواة قيد التشغيل، إلا أنه يُمكن استغلالها من قِبل المهاجمين على نظام مُخترق لمنع اكتشاف عملياتهم أو ملفاتهم ، مما يسمح لهم بالحفاظ على السيطرة على النظام. تستخدم العديد من برامج التجسس الخبيثة وحدات النواة القابلة للتحميل بهذه الطريقة. تجدر الإشارة إلى أنه في معظم أنظمة التشغيل، لا تُساعد الوحدات على رفع مستوى الامتيازات بأي شكل من الأشكال، حيث يتطلب تحميل وحدة النواة القابلة للتحميل امتيازات مُرتفعة؛ فهي تُسهّل فقط على المهاجم إخفاء عملية الاختراق. [ 11 ]

لينكس

يُتيح نظام لينكس تعطيل تحميل الوحدات النمطية عبر خيار sysctl/proc/sys/kernel/modules_disabled . [ 12 ] [ 13 ] قد يقوم نظام initramfs بتحميل وحدات نمطية مُحددة مطلوبة للجهاز عند بدء التشغيل، ثم يُعطّل تحميل الوحدات النمطية. هذا يجعل مستوى الأمان مُشابهًا جدًا لنواة النظام المُتكاملة. إذا تمكّن المُهاجم من تغيير initramfs، فسيتمكّن من تغيير ملف النواة الثنائي.

نظام التشغيل macOS

في نظام التشغيل OS X Yosemite والإصدارات اللاحقة، يجب توقيع امتدادات النواة بشهادة مطور تحمل "صلاحية" محددة. لا تُمنح هذه الشهادة من قِبل Apple إلا بناءً على طلب المستخدم، ولا تُمنح تلقائيًا لأعضاء Apple Developer . تُفعّل هذه الميزة، المسماة "توقيع امتدادات النواة"، افتراضيًا، وتُوجّه النواة إلى التوقف عن الإقلاع في حال وجود امتدادات نواة غير موقّعة. [ 14 ] في نظام التشغيل OS X El Capitan والإصدارات اللاحقة، تُعدّ هذه الميزة جزءًا من حماية سلامة النظام .

في الإصدارات القديمة من macOS، أو في حال تعطيل توقيع kext، يمكن للمستخدمين غير الجذر تحميل وحدة نواة قابلة للتحميل ضمن حزمة ملحقات النواة إذا تم ضبط خاصية OSBundleAllowUserLoad على "صحيح" في قائمة خصائص الحزمة. [ 15 ] مع ذلك، إذا لم يكن أي من الملفات في الحزمة، بما في ذلك ملف التعليمات البرمجية القابل للتنفيذ، مملوكًا للمستخدم الجذر ومجموعة wheel، أو كان قابلاً للكتابة بواسطة المجموعة أو "أخرى"، فستفشل محاولة تحميل وحدة النواة القابلة للتحميل. [ 16 ]

سولاريس

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

انظر أيضاً

مراجع

  1. "امتدادات النواة المهملة وبدائل امتدادات النظام" . شركة أبل . تم الاطلاع عليه بتاريخ 13 مارس 2021 .
  2. "مواضيع برمجة امتدادات النواة: مقدمة" . شركة آبل. 1 سبتمبر 2010. مؤرشف من الأصل في 4 مايو 2013. تم الاطلاع عليه في 5 مايو 2013 .
  3. "إدارة وتطوير وحدات النواة القابلة للتحميل الديناميكي" . هيوليت-باكارد . 7 يونيو 2001.
  4. "ما الذي يحدد وقت تحميل برنامج التشغيل؟" . شبكة مطوري مايكروسوفت . مايكروسوفت . 21 نوفمبر 2012. مؤرشف من الأصل في 6 مارس 2013. تم الاطلاع عليه في 5 مايو 2013 .
  5. "دليل برمجة وحدات نواة لينكس، القسم 2.2 "تجميع وحدات النواة"تم الاطلاع عليه بتاريخ 2020-10-05 .
  6. لينوس تورفالدز وآخرون (21 يونيو 2011). "Documentation/oops-tracing.txt" . kernel.org. مؤرشف من الأصل بتاريخ 2 أكتوبر 2011. تم الاطلاع عليه بتاريخ 3 أكتوبر 2011 . 
  7. "النوى الملوثة" . دليل مستخدم ومدير نواة لينكس .
  8. جوناثان كوربيت (24 مارس 2006). "التلويث من مساحة المستخدم" . LWN.net . مؤرشف من الأصل في 16 نوفمبر 2011. تم الاطلاع عليه في 3 أكتوبر 2011 .
  9. "وثائق دعم نوفيل: نواة ملوثة" . 2007-07-26 . تم الاطلاع عليه بتاريخ 2011-10-03 .
  10. جوناثان كوربيت (27 أبريل 2004). "الصدق مع ترخيص الوحدة" . LWN.net. مؤرشف من الأصل في 2 نوفمبر 2012. تم الاطلاع عليه في 30 أكتوبر 2012 .
  11. استغلال وحدات النواة القابلة للتحميل ( مؤرشف بتاريخ 4 فبراير 2012 في أرشيف الإنترنت)
  12. "Sysctl/kernel.txt" . تم الاطلاع عليه في 4 يناير 2013 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  13. كيس كوك (28-11-2012). "تعطيل الوحدة النمطية بشكل نظيف" . outflux.net . تم الاسترجاع في 5-10-2020 .
  14. "ملحقات النواة" . مكتبة مطوري ماك . أبل. 16 سبتمبر 2015. مؤرشف من الأصل في 17 أغسطس 2016. تم الاطلاع عليه في 29 سبتمبر 2016 .
  15. "خصائص ملف Info.plist لإضافات النواة" . شركة آبل. مؤرشف من الأصل في 26 سبتمبر 2012. تم الاطلاع عليه في 27 سبتمبر 2012 .
  16. دليل مدير نظام داروين وماك أو إسkextload(8)