ملفات نواة لينكس. رموز مصدر لينكس

09.04.2019

الأساسية تتكون من ما يقرب من 20 مليون سطر من التعليمات البرمجية لينكسيعد أحد أكبر المشاريع مفتوحة المصدر في العالم.

ما هي النواة

النواة هي أدنى مستوى من البرامج التي تتفاعل مع أجهزة الكمبيوتر. وهي مسؤولة عن تفاعل جميع التطبيقات التي تعمل فيما يسمى. "وضع المستخدم" مع الأجهزة المادية ويسمح للعمليات بتمرير المعلومات لبعضها البعض باستخدام ( IPC).

أنواع النواة

هناك ثلاثة أنواع رئيسية من الحبات - المتجانسة (المتجانسة), النوى (نواة) و هجين (هجين).

على سبيل المثال لينكسهو جوهر متجانسة، في حين نظام التشغيل العاشرو شبابيكاستخدام حبات الهجين.

النواة الدقيقة

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

الايجابيات

  • قابلية التنقل
  • ذاكرة الوصول العشوائي (RAM) أصغر حجمًا وبصمة القرص الصلب
  • أمان

السلبيات

  • قد يكون النظام بأكمله أبطأ بسبب الطبقات الإضافية من تجريد البرامج بين النواة والأجهزة
  • العمليات يمكن أن تضيع الوقت في الانتظار في الطابور لتلقي المعلومات

حبات متجانسة

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

الايجابيات

  • وصول أسرع للعملية إلى المعدات
  • اتصال أسهل بين العمليات نفسها
  • سهولة تنفيذ دعم الأجهزة دون الحاجة إلى تثبيت برامج تشغيل إضافية
  • تتواصل العمليات بشكل أسرع لأنه ليست هناك حاجة للانتظار في قائمة الانتظار

السلبيات

  • المزيد من الذاكرة ومساحة القرص الصلب
  • المزيد من المشاكل الأمنية

النوى الهجينة

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

الايجابيات

  • يمكن للمطور اختيار ما سيتم تشغيله في وضع kernel وما سيتم تشغيله في وضع المستخدم
  • حجم أصغر مقارنة بالحبات المتجانسة
  • أكثر مرونة من الأنواع الأخرى

السلبيات

  • عيوب الأداء المحتملة
  • يعتمد تثبيت برامج تشغيل الجهاز على المستخدم والشركة المصنعة للجهاز

ملفات نواة لينكس

في الغالبية جنو/لينكستوجد ملفات نواة النظام في الدليل /boot، على سبيل المثال سينت أو إس 6:

# ليرة سورية -l /التمهيد/ | grep linu -rwxr-xr-x 1 الجذر الجذر 4221232 15 ديسمبر 23:48 vmlinuz-2.6.32-573.12.1.el6.x86_64 -rwxr-xr-x 1 الجذر الجذر 4221968 10 فبراير 01:15 vmlinuz-2.6.32 -573.18.1.el6.x86_64 -rwxr-xr-x 1 الجذر الجذر 4221776 14 أغسطس 2015 vmlinuz-2.6.32-573.3.1.el6.x86_64 -rwxr-xr-x 1 الجذر الجذر 4220144 23 سبتمبر 01:29 vmlinuz -2.6.32-573.7.1.el6.x86_64 -rwxr-xr-x 1 جذر الجذر 4220368 10 نوفمبر 20:31 vmlinuz-2.6.32-573.8.1.el6.x86_64

الملف الذي يحمل اسم vmlinuz هو ملف kernel. جاء اسم vmlinuz من العالم يونيكس، حيث كان يُطلق على ملف kernel اسم Unix منذ الستينيات. متى لينوس تورفالدسبدأ التطوير لينكسفي التسعينات - أطلق عليه ببساطة اسم لينكس.

عندما ظهر تطبيق الذاكرة الافتراضية، تمت إضافة البادئة "vm" إلى اسم linux ( ذاكرة افتراضية). لذلك لبعض الوقت كان يسمى ملف kernel ببساطة vmlinux، ولكن حجم الملف كان يتزايد باستمرار وبمرور الوقت بدأ في الضغط وتم استبدال الحرف الأخير في الاسم من x إلى z ( ضغط زليب). غالبًا ما يتم ضغط اللب أيضًا باستخدام LZMAأو BZIP2وبعض النوى تسمى ببساطة zImage.

يحتوي الدليل /boot أيضًا على الملفات initrd.img-version (أو initramfs-version)، وSystem.map-version، وconfig-version. يتم استخدام ملف initrd.img-version للتمهيد الأولي للنظام، حيث يتم خلاله فك ضغط النواة نفسها وتحميلها. يتم استخدام ملف System.map لإدارة الذاكرة قبل تحميل النواة، ويحتوي ملف التكوين على معلمات النواة وقائمة الوحدات النمطية التي سيتم تحميلها في النواة أثناء الترجمة.

بنية نواة لينكس

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

وحدات نواة لينكس

ماذا إذا شبابيكتحتوي في البداية على جميع برامج التشغيل الضرورية، وكل ما هو مطلوب من المستخدم هو ببساطة تمكين بعضها؟

هذا هو بالضبط كيف تعمل الوحدات لينكس، والتي تسمى أيضًا (LKM) وهي حيوية لكي تتمكن النواة من التفاعل مع جميع أجهزة الكمبيوتر ولا تشغل كل ذاكرتها.

كقاعدة عامة، تعمل الوحدات على توسيع قدرات النواة للعمل مع الأجهزة وأنظمة الملفات واستدعاءات النظام. LKMلديك امتداد الملف .ko:

# find /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/ -name "*.ko" -type f | مرحاض-ل 2033

بفضل البنية المعيارية، يمكنك تخصيص النواة لنفسك عن طريق تحديد الوحدات الضرورية فقط في Menuconfig، أو تحرير الملف /boot/config*، أو تحميل وتفريغ الوحدات مباشرة أثناء التشغيل باستخدام أدوات مساعدة مثل modprobe، وinsmod، وrmmod.

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

التاريخ والتنظيم المعماري

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

تاريخ موجز لنظام التشغيل Linux

على الرغم من أن Linux يبدو أكثر أنظمة التشغيل مفتوحة المصدر شيوعًا، إلا أن تاريخه في الواقع قصير نسبيًا مقارنة بأنظمة التشغيل الأخرى. في فجر عصر الكمبيوتر، طور المبرمجون برامجهم للأجهزة العارية، باستخدام لغات يمكن للأجهزة فهمها. بدون نظام تشغيل، يمكن لتطبيق واحد فقط (ومستخدم واحد) استخدام جهاز الحوسبة الكبير والمكلف بالكامل في أي وقت. تم تطوير أنظمة التشغيل الأولى في الخمسينيات من القرن الماضي لتسهيل الحياة على المطورين. تشمل الأمثلة نظام التشغيل جنرال موتورز (GMOS)، الذي تم تطويره لجهاز IBM 701، ونظام المراقبة FORTRAN (FMS)، الذي أنشأته شركة North American Aviation لجهاز IBM 709.

في ستينيات القرن العشرين، قام معهد ماساتشوستس للتكنولوجيا (MIT) وعدد من الشركات بتطوير نظام تشغيل تجريبي Multics (خدمة المعلومات والحوسبة المتعددة الإرسال) للآلة GE-645. أحد مطوري نظام التشغيل هذا، AT&T، ابتعد عن Multics وقام بتطوير نظام Unics الخاص به في عام 1970. تم تصميم لغة C المرفقة مع نظام التشغيل C هذا وكتابتها لجعل تطوير نظام التشغيل محمولاً.

وبعد مرور عشرين عامًا، أنشأ أندرو تانينباوم نسخة ميكروكيرنل من UNIX® تسمى MINIX (Minimal UNIX) والتي يمكن تشغيلها على أجهزة الكمبيوتر الشخصية الصغيرة. ألهم نظام التشغيل مفتوح المصدر هذا لينوس تورفالدس لتطوير الإصدار الأول من Linux في أوائل التسعينيات (انظر الشكل 1).

أرز. 1. تاريخ موجز لإصدارات نواة لينكس الرئيسية

لقد نما Linux بسرعة من مبادرة متحمسة واحدة إلى مشروع عالمي يضم آلاف المطورين. كان أحد أهم القرارات في مصير Linux هو اعتماد رخصة جنو العامة (GPL). قامت GPL بحماية نواة Linux من الاستغلال التجاري وفي الوقت نفسه فتحت الطريق لاستخدام مجتمع مستخدمي مشروع GNU، الذي أسسه ريتشارد ستالمان، والذي يتجاوز حجم أكواده بكثير نواة Linux. سمح هذا باستخدام تطبيقات مفيدة مثل GNU Compiler Collection (GCC) وأغلفة الأوامر المختلفة على Linux.

مقدمة إلى نواة لينكس

دعنا ننتقل إلى نظرة عامة على بنية نظام التشغيل GNU/Linux. يمكن تقسيم نظام التشغيل إلى مستويين، كما هو موضح في الشكل. 2.

أرز. 2. البنية الأساسية لنظام التشغيل جنو/لينكس

في المستوى الأعلى توجد مساحة المستخدم (مساحة التطبيق). هذا هو المكان الذي يتم فيه تنفيذ تطبيقات المستخدم. أسفل مساحة المستخدم توجد مساحة kernel. هذا هو المكان الذي تعمل فيه نواة Linux.

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

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

خصائص نواة لينكس

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

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

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

الأنظمة الفرعية الأساسية لنواة لينكس

دعونا نلقي نظرة على بعض المكونات الرئيسية لنواة لينكس، باتباع البنية الموضحة في الشكل. 3.

أرز. 3. عرض واحد محتمل لبنية Linux kernel

واجهة استدعاء النظام

SCI عبارة عن طبقة رقيقة توفر وسيلة لاستدعاء وظائف kernel من مساحة المستخدم. كما ذكرنا سابقًا، يمكن أن تعتمد هذه الواجهة على البنية، حتى داخل نفس عائلة المعالج. SCI هي في الواقع خدمة تعدد الإرسال وإزالة تعدد الإرسال لاستدعاء الوظائف. يقع تطبيق SCI في ./linux/kernel، والجزء الخاص بالبنية موجود في ./linux/arch. يمكن العثور على مزيد من المعلومات التفصيلية حول هذا المكون في القسم.

ادارة العمليات

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

مهمة أخرى لإدارة العمليات هي مشاركة المعالج بين سلاسل العمليات النشطة. تطبق النواة خوارزمية جدولة مبتكرة، لا يعتمد وقت تشغيلها على عدد الخيوط المتنافسة على موارد المعالج. يؤكد اسم المجدول - O(1) - على أن الأمر يستغرق نفس القدر من الوقت لجدولة مؤشر ترابط واحد كما هو الحال لجدولة سلاسل رسائل متعددة. يدعم برنامج جدولة O(1) أيضًا تكوينات المعالجات المتعددة المتماثلة (SMP). توجد أكواد المصدر لنظام التحكم في العمليات في /linux/kernel، وأكواد الجزء المعتمد على البنية موجودة في /linux/arch). لمزيد من المعلومات حول هذه الخوارزمية، راجع القسم.

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

المورد المهم الآخر الذي تديره النواة هو الذاكرة. ولزيادة الكفاءة، مع مراعاة آلية عمل الأجهزة مع الذاكرة الافتراضية، يتم تنظيم الذاكرة على شكل ما يسمى. الصفحات(حجمه 4 كيلو بايت في معظم البنيات). يحتوي Linux على أدوات لإدارة الذاكرة المتوفرة، بالإضافة إلى آليات الأجهزة لتعيين الذاكرة الفعلية والافتراضية.

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

عندما يكون هناك عدد كبير من مستخدمي الذاكرة، قد تكون هناك حالات يتم فيها استنفاد الذاكرة المتوفرة بالكامل. وفي هذا الصدد، يمكن إزالة الصفحات من الذاكرة ونقلها إلى القرص. تسمى عملية تبديل الصفحات بين ذاكرة الوصول العشوائي (RAM) والقرص الصلب مبادلة. توجد أكواد مصدر إدارة الذاكرة في ./linux/mm.

نظام الملفات الظاهري

جانب آخر مثير للاهتمام في نواة Linux هو نظام الملفات الظاهري (VFS)، الذي يوفر فكرة عامة عن واجهة أنظمة الملفات. يوفر VFS طبقة تبديل بين SCI وأنظمة الملفات التي تدعمها النواة (انظر الشكل 4).

أرز. 4. يوفر VFS نسيجًا للتبديل بين المستخدمين وأنظمة الملفات

يوجد في المستوى الأعلى من VFS تجريد واحد لواجهة برمجة التطبيقات (API) لوظائف مثل فتح الملفات وإغلاقها وقراءتها وكتابتها. في المستوى السفلي من VFS توجد تجريدات نظام الملفات التي تحدد كيفية تنفيذ وظائف المستوى الأعلى. إنها مكونات إضافية لأنظمة ملفات محددة (يوجد منها أكثر من 50). توجد أكواد المصدر لأنظمة الملفات في ./linux/fs.

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

مكدس الشبكة

حسب التصميم، تتمتع حزمة الشبكة ببنية متعددة المستويات تكرر بنية البروتوكولات نفسها. سوف تتذكر أن بروتوكول الإنترنت (IP) هو بروتوكول طبقة الشبكة الأساسي الذي يقع أسفل بروتوكول التحكم في الإرسال (TCP). فوق TCP توجد طبقة المقبس، التي يتم استدعاؤها عبر SCI.

طبقة المقبس هي واجهة برمجة تطبيقات قياسية للنظام الفرعي للشبكة. ويوفر واجهة مستخدم لبروتوكولات الشبكة المختلفة. تطبق طبقة المقبس طريقة موحدة لإدارة الاتصالات ونقل البيانات بين نقاط النهاية، بدءًا من الوصول إلى إطارات البيانات النقية ووحدات بيانات بروتوكول IP (PDUs) إلى TCP وبروتوكول مخطط بيانات المستخدم (UDP). يوجد الكود المصدري للنظام الفرعي لشبكة kernel في الدليل ./linux/net.

برامج تشغيل الأجهزة

تتكون الغالبية العظمى من كود مصدر Linux kernel من برامج تشغيل الأجهزة، والتي توفر القدرة على العمل مع أجهزة محددة. تحتوي شجرة مصدر Linux على دليل فرعي لبرنامج التشغيل، والذي بدوره يحتوي على أدلة فرعية لأنواع مختلفة من الأجهزة المدعومة، مثل Bluetooth وI2C والمنافذ التسلسلية وما إلى ذلك. توجد رموز المصدر لبرامج تشغيل الأجهزة في ./linux/drivers.

كود خاص بالهندسة المعمارية

على الرغم من أن الجزء الأكبر من Linux مستقل عن البنية التي يعمل عليها نظام التشغيل، إلا أن هناك بعض العناصر التي يجب أن تأخذ في الاعتبار البنية لضمان التشغيل والكفاءة بشكل سليم. يحتوي الدليل الفرعي ./linux/arch على الجزء الخاص بالبنية من كود مصدر kernel، مقسمًا إلى عدد من الدلائل الفرعية المقابلة لبنيات معينة. كل هذه الدلائل تشكل معًا BSP. في حالة الكمبيوتر المكتبي العادي، يتم استخدام الدليل i386. يحتوي الدليل الفرعي لكل بنية على عدد من الدلائل الفرعية المتعلقة بجوانب معينة من النواة، مثل التمهيد، والنواة، وإدارة الذاكرة، وما إلى ذلك. الكود المصدري للجزء الخاص بالبنية موجود في ./linux/arch.

إلى جانب قابلية النقل والكفاءة، تحتوي نواة Linux على عدد من الميزات الأخرى المثيرة للاهتمام التي لم يتم تناولها في المناقشة أعلاه.

يعد Linux، باعتباره نظام تشغيل مفتوح المصدر مستخدمًا على نطاق واسع في الممارسة العملية، بمثابة أرض اختبار ممتازة للبروتوكولات الجديدة وتحسيناتها. يدعم Linux عددًا كبيرًا من بروتوكولات الشبكات، بما في ذلك TCP/IP التقليدي وامتداداته عالية السرعة (للشبكات الأسرع من Gigabit Ethernet و10 GbE). يدعم Linux أيضًا بروتوكولات مثل بروتوكول نقل التحكم في التدفق (SCTP)، والذي يوفر العديد من الميزات الإضافية غير الموجودة في TCP (يستخدم كبروتوكول طبقة نقل بديل).

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

هناك تحسين آخر تم إجراؤه مؤخرًا في Linux وهو القدرة على استخدامه كنظام تشغيل لأنظمة تشغيل أخرى (يُسمى برنامج Hypervisor). في الآونة الأخيرة، تم إجراء تحسين على النواة يسمى الجهاز الظاهري القائم على Kernel (KVM، الجهاز الظاهري القائم على kernel). ونتيجة لهذا التعديل، تم تنفيذ واجهة جديدة في مساحة المستخدم، مما يسمح لأنظمة التشغيل الأخرى بالعمل فوق نواة ممكّنة لـ KVM. في هذا الوضع، لا يمكنك تشغيل مثيلات Linux الأخرى فحسب، بل يمكنك أيضًا إضفاء الطابع الافتراضي على Microsoft® Windows®. القيد الوحيد هو أن المعالج المستخدم يجب أن يدعم تعليمات المحاكاة الافتراضية الجديدة. لمزيد من المعلومات، راجع القسم.

المزيد من الدراسة

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

في هذا الدليل التفصيلي، ستتعلم كيفية إنشاء وتثبيت النواة الفرعية >2.6 بشكل صحيح على عائلة نظام التشغيل Ubuntu.

الخطوة 1: الحصول على الكود المصدري للنواة

يمكن الحصول على مصادر نواة أوبونتو بطريقتين:

    عن طريق تثبيت الأرشيف من المستودع، مع التطبيق التلقائي لأحدث التصحيحات الرسمية. سيؤدي هذا إلى تنزيل حزمة يبلغ حجمها حوالي 150 ميجابايت إلى المجلد الحالي. للحصول على مصادر النواة، الإصدار المثبت على الكمبيوتر، قم بتشغيل الأمر: apt-get source linux-image-`uname -r`

    أو بدلاً من `uname -r`، يمكنك تحديد إصدار محدد متاح في المستودع.

يمكن الاطلاع على قائمة الإصدارات المتوفرة في المستودع عن طريق كتابة الأمر: "apt-get source linux-image-" وبدون الضغط على Enter، اضغط على المفتاح Tab مرتين.

لا تنس تمكين مشاركة المصدر في المستودع (إعدادات النظام ← البرامج والتحديثات ← برنامج Ubuntu ← كود المصدر). يمكنك القيام بذلك من وحدة التحكم عن طريق إلغاء التعليق على الأسطر التي تبدأ بـ deb-src في الملف /etc/apt/sources.list، ثم إجراء التحديث باستخدام الأمر: "sudo apt-get update".

    أحدث إصدار من النواة متاح عبر git. حجم الحزمة التي تم تنزيلها هو ~ 500-800 ميجابايت. بوابة استنساخ بوابة: //kernel.ubuntu.com/ubuntu/ubuntu- .شخص سخيف

    أين - اسم الإصدار، على سبيل المثال:

    بوابة استنساخ بوابة: //kernel.ubuntu.com/ubuntu/ubuntu-xenial.git

حبات أخرى

هناك أيضًا حبات غير مضمونة للعمل في Ubuntu. على سبيل المثال، هناك مشكلة معروفة في عدد من تطبيقات النظام الشائعة (على وجه الخصوص، برامج تشغيل NVidia، VirtualBox)، والتي، عند تثبيتها، يتم تجميعها للنواة المثبتة. ولذلك، فإن تثبيتها على نواة غير قياسية لإصدار معين من Ubuntu (على سبيل المثال، Ubuntu 16.04 يأتي مع kernel 4.4.0) قد يتطلب تجميعًا يدويًا منفصلاً أو تصحيحات خاصة، وقد لا يدعم التطبيق أحدث الإصدارات من Ubuntu. حبات من kernel.org على الإطلاق.

    أرشفة من الإصدار الأساسي بدون تصحيحات، أي. على سبيل المثال "4.8.0"، "4.8.10": sudo apt-get install linux-source

قم بفك ضغط الأرشيف الناتج باستخدام الأوامر:

Cd ~/ tar -xjf linux-2.6.x.y.tar.bz2

أو في حالة مصدر Linux:

Cd /usr/src tar -xjf linux-source-2.6.x.y.tar.bz2

الخطوة 2. الحصول على الحزم اللازمة للتجميع

يجب تنفيذ هذه الخطوة فقط في حالة تجميع النواة على الكمبيوتر للمرة الأولى

قم بتشغيل الأوامر التالية لتثبيت الحزم الأساسية:

Sudo apt-get update sudo apt-get build-dep linux sudo apt-get install kernel-package

    التكوين- طريقة التكوين التقليدية . يعرض البرنامج خيارات التكوين واحدًا تلو الآخر، ويطالبك بتعيين قيمة مختلفة لكل منها. لا ينصح به للمستخدمين عديمي الخبرة.

    oldconfig- يتم إنشاء ملف التكوين تلقائيًا بناءً على تكوين kernel الحالي. الموصى بها للمبتدئين.

    com.defconfig- يتم إنشاء ملف التكوين تلقائيًا، بناءً على القيم الافتراضية.

    com.menuconfig- واجهة رسومية زائفة للتكوين اليدوي، لا تتطلب إدخالاً متسلسلاً لقيم المعلمات. يوصى باستخدامه في المحطة.

    xconfig- واجهة رسومية (X) للتكوين اليدوي، لا تتطلب إدخالاً متسلسلاً لقيم المعلمات.

    gconfig- واجهة رسومية (GTK+) للتكوين اليدوي، لا تتطلب إدخالاً متسلسلاً لقيم المعلمات. يوصى باستخدامه في بيئة جنوم.

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

في حال كنت ترغب في استخدام التكوين, oldconfig, com.defconfig, localmodconfigأو localesconfig، لم تعد بحاجة إلى أي حزم إضافية. وفي حالة الخيارات الثلاثة المتبقية، يجب عليك أيضًا تثبيت حزم إضافية.

com.menuconfigقم بتشغيل الأمر التالي:

Sudo apt-get install libncurses5-dev

لتثبيت الحزم المطلوبة للاستخدام gconfigقم بتشغيل الأمر التالي:

Sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev

لتثبيت الحزم المطلوبة للاستخدام xconfigقم بتشغيل الأمر التالي:

قبل Ubuntu 12.04: sudo apt-get install qt3-dev-tools libqt3-mt-dev

Sudo apt-get install libqt4-dev

الخطوة 3: تطبيق التصحيحات

هذه الخطوة اختيارية.

تم بالفعل تطبيق التصحيحات الرسمية على المصادر إذا تم الحصول على النواة باستخدام الأمر الموضح أعلاه:

Apt-get source linux-image-`uname -r`

إذا لم تقم مطلقًا بتطبيق التصحيحات على التعليمات البرمجية المصدر من قبل، فقم بتشغيل الأمر التالي:

Sudo apt-get install patch

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

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

Gunzip patch-2.6.x.y.gz

إذا كان الملف الذي قمت بتنزيله بتنسيق Bzip2 (*.bz2)، فقم بتشغيل الأمر التالي لاستخراج محتويات الأرشيف:

Bunzip2 patch-2.6.x.y.bz2

حيث 2.6.x.y هو إصدار تصحيح kernel. ستقوم الأوامر المناسبة باستخراج ملف التصحيح إلى مجلد مصدر kernel. قبل تطبيق التصحيح، عليك التأكد من أنه سيعمل دون أخطاء. للقيام بذلك، قم بتشغيل الأمر:

التصحيح -p1 -i patch-2.6.x.y --dry-run

حيث 2.6.x.y هو إصدار تصحيح kernel. سيقوم هذا الأمر بمحاكاة تطبيق التصحيح دون تغيير الملفات نفسها.

إذا لم تحدث أي أخطاء أثناء تنفيذها، فيمكن تنفيذ التغييرات بأمان في الملفات نفسها. للقيام بذلك، قم بتشغيل الأمر:

التصحيح -p1 -i patch-2.6.x.y

حيث 2.6.x.y هو إصدار تصحيح kernel. إذا لم تكن هناك أخطاء، فهذا يعني أنه تم تطبيق التصحيح بنجاح على الكود المصدري.

انتباه!قبل تطبيق التصحيح، قم بتنفيذ الخطوات التالية: 1. قم بتنزيل التصحيح الخاص بنفس إصدار المصادر الخاصة بك من http://www.kernel.org. 2. قم بتشغيل الأمر التالي: patch -p1 -R

حيث 2.6.x.y هو إصدار التصحيح والمصادر الخاصة بك

الخطوة 4. تكوين بناء النواة المستقبلي

انتقل إلى المجلد الذي قمت باستخراج النواة فيه عن طريق تشغيل الأمر

مؤتمر نزع السلاح ~/linux-2.6.x.y

حيث 2.6.x.y هو إصدار النواة التي قمت بتنزيلها.

في هذه المرحلة، من المفترض أن تكون قد قررت بالفعل استخدام طريقة تكوين kernel (إذا لم يكن الأمر كذلك، فراجعها في قسم "الحصول على الحزم اللازمة للبناء" اعتمادًا على ذلك، قم بتشغيل الأمر التالي لتشغيل طريقة التكوين التي اخترتها:

    التكوين- طريقة التكوين التقليدية . يعرض البرنامج خيارات التكوين واحدًا تلو الآخر، ويطالبك بتعيين قيمة مختلفة لكل منها. يتم استدعاؤه بواسطة أمر التكوين

    oldconfig- يتم إنشاء ملف التكوين تلقائيًا بناءً على تكوين kernel الحالي. الموصى بها للمبتدئين. تم استدعاؤه بواسطة make oldconfig

    com.defconfig- يتم إنشاء ملف التكوين تلقائيًا، بناءً على القيم الافتراضية لهذه البنية المعينة. تم استدعاؤه بواسطة make defconfig

    com.menuconfig- واجهة رسومية زائفة للتكوين اليدوي، لا تتطلب إدخالاً متسلسلاً لقيم المعلمات. يوصى باستخدامه في المحطة. استدعاء: جعل Menuconfig

    gconfigو xconfig- تكوينات رسومية للتكوين اليدوي. استدعاء: جعل gconfig

    جعل xconfig

    على التوالى

    localmodconfigو localesconfig- التكوينات التلقائية. يتم إنشاء التكوين بناءً على الوحدات التي يتم استدعاؤها حاليًا والنواة قيد التشغيل. الفرق بين هذين المكونين هو عدد الوحدات. في الحالة الأولى، سيكون هناك ما لا يقل عن 50٪ من النواة، وفي الحالة الثانية - لا يزيد عن وحدتين. استدعاء: جعل localmodconfig

    قم بإجراء التكوين المحلي

    على التوالى

بمجرد الاتصال، سيتم إطلاق برنامج التكوين المقابل. قم بإجراء الإعدادات اللازمة وفقًا لاحتياجاتك، واحفظ ملف التكوين وانتقل إلى الخطوة التالية.

الخطوة 5: بناء النواة

وبذلك تكون الاستعدادات قد اكتملت. الآن يمكنك البدء في عملية بناء النواة. للقيام بذلك، قم بتشغيل الأمر:

Fakeroot make-kpkg -j 5 --initrd --append-to-version=-custom kernel_image kernel_headers #-j<количество ядер процессора>+1

يمكن أن يستغرق بناء النواة من 20 دقيقة إلى عدة ساعات، اعتمادًا على تكوين النواة والمعلمات التقنية للكمبيوتر. يمكن أن يكون التجميع باستخدام معالج متعدد النواة أسرع عدة مرات

الخطوة 6: تثبيت صور ورؤوس Kernel

عند اكتمال بناء النواة، ستظهر حزمتان من حزم deb في المجلد الرئيسي لديك. يجب تثبيتها. للقيام بذلك، قم بتشغيل الأوامر:

Cd ~/ sudo dpkg -i linux-image-2.6.x.y-custom_2.6.x.y-custom-10.00.Custom_arc.deb Sudo dpkg -i linux-headers-2.6.x.y-custom_2.6.x.y-custom-10.00. Custom_arc.deb

حيث 2.6.x.y هو إصدار النواة المجمعة، وarc هي بنية المعالج (i386 - 32 بت، amd64 - 64 بت).
إذا كنت لا تعرف الاسم الدقيق للحزمة، فقم بإدراج الملفات في الدليل الرئيسي الخاص بك باستخدام الأمر

وابحث عن نفس الحزمتين.

الخطوة 7. إنشاء قرص ذاكرة الوصول العشوائي الأولي

للعمل بشكل صحيح، يتطلب Ubuntu صورة قرص RAM أولية. لإنشائه، قم بتشغيل الأمر:

تحديث Sudo-initramfs -c -k 2.6.x.y-custom

حيث 2.6.x.y هو إصدار النواة المترجمة.

الخطوة 8: تحديث تكوين أداة تحميل التمهيد GRUB

للتأكد من أن إصدار kernel الجديد متاح للاختيار عند تشغيل الكمبيوتر، قم بتشغيل الأمر التالي:

سودو تحديث اليرقة

سيتم تحديث ملف Menu.lst (لإصدار GRUB 1) أو grub.cfg (لإصدار GRUB 2) وفقًا لتوفر أنظمة التشغيل المثبتة وصور kernel.

الخطوة 9: التحقق من النواة

تم الانتهاء من تجميع النواة وتثبيتها بنجاح! أعد تشغيل الكمبيوتر الآن وحاول تشغيل النظام بالنواة الجديدة. للتأكد من أن النظام يعمل بالنواة الجديدة، قم بتشغيل الأمر

اسم -r

سيعرض إصدار النواة المستخدم.

إذا تم كل شيء بشكل صحيح، فيمكنك حذف أرشيفات التعليمات البرمجية المصدر ودليل linux-2.6.x.y بأكمله في المجلد الرئيسي الخاص بك. سيؤدي هذا إلى تحرير حوالي 5 جيجابايت على محرك الأقراص الثابتة لديك (يعتمد مقدار المساحة المحررة على إعدادات الإصدار لديك).

وبهذا تنتهي عملية التجميع والتركيب، تهانينا!

سأحاول اليوم أن أتحدث بأكبر قدر ممكن من الوضوح والإيجاز إدارة نواة Linux/UNIX.سأحاول في هذا الموضوع معرفة كيفية: استخدام الصدفة للحصول على معلومات حول وحدات kernel ووحدات kernel، وتحميل وحدات kernel وإزالتها أثناء التشغيل، ومعرفة ما إذا كانت هناك حاجة إلى وحدة متصلة/منفصلة على الإطلاق، وتكوين نظام التشغيل لتحميل الوحدات اللازمة.

معلومات عامة

يمكنك عرض قائمة الوحدات المتصلة حاليًا باستخدام فرق:

خادم الطباعة:/tmp/123# lsmod حجم الوحدة المستخدمة بواسطة ipv6 235396 10 حلقة 12748 0 parport_pc 22500 0 parport 31084 1 parport_pc snd_pcm 62660 0 snd_timer 17800 1 snd_pcm snd 45636 2 nd _timer soundcore 6368 1 snd snd_page_alloc 7816 1 snd_pcm psmouse 32336 0 serio_raw 4740 0 pcspkr 2432 0 i2c_piix4 7216 0 i2c_core 19828 1 i2c_piix4 ac 4196 0 زر 6096 0 evdev 8000 0 ext3 105576 5 jbd 39476 1 ext3 mbcache 7 108 1 ex t3 sd_mod 22200 7 ide_cd_mod 27684 0 cdrom 30176 1 ide_cd_mod ata_generic 4676 0 ahci 23596 6 libata 140448 2 ata_generic,ahci scsi_mod 129548 2 sd_mod,libata Dock 8304 1 libata e1000 102656 0 piix 6568 0 ide_pci_generic 3908 0 ide_core 96168 3 ide_cd_mod,piix ,ide_pci_generic حراري 1 5228 0 معالج 32576 1 مروحة حرارية 4196 0 Thermal_sys 10856 3 حراري المعالج، المروحة

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

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

بجانب اسم وحدة، يعرض الأمر lsmod أيضًا حجم الوحدة وعدد المستخدمين وأسماء المستخدمين.

أمر مودينفو يوفر معلومات حول وحدة واحدة أو أكثر.

Kernel-server:/tmp/123$ /sbin/modinfo ipv6 اسم الملف: /lib/modules/2.6.26-2-686/kernel/net/ipv6/ipv6.ko الاسم المستعار: ترخيص net-pf-10: وصف GPL: مكدس بروتوكول IPv6 لمؤلف Linux: مجموعة من العشرات تعتمد: vermagic: 2.6.26-2-686 SMP mod_unload modversions 686

في المثال أعلاه يمكنك أن ترى أن الأمر com.modinfoيعرض معلومات حول وحدة ipv6، والتي تتضمن معلمات مثل اسم الملف والمسار والترخيص والوصف ومؤلف الوحدة وما إلى ذلك. قد تختلف معلمات الوحدة وفقًا للوحدة.

أود بشكل خاص أن أتطرق إليها معلمة اسم الملفيحتوي على المسار إلى ملف الوحدة النمطية واسم الملف. ينتهي اسم ملف وحدة ipv6 بـ .كويخبرنا هذا أن هذه الوحدة تنتمي إلى إصدار النواة 2.6. في وقت سابق نسخة النواة - 2.4، تنتهي أسماء الوحدات بـ .o). كما ترى، توجد الوحدة في الدلائل الفرعية للدليل /lib/modules/2.6.26-2-686/، وفي هذا المسار، يتوافق الدليل 2.6.26-2-686 مع إصدار النواة (وكذلك إخراج الأمر uname -r، والذي يُستخدم بشكل نشط في كتابة البرامج النصية). تعكس بنية الدلائل الفرعية للدليل المحدد العلاقة بين وحدات kernel والغرض من الوحدات، وأعتقد أن المثال أدناه سيوضح ذلك بوضوح:

Kernel-server:/tmp/123# ls -l /lib/modules/2.6.26-2-686/kernel/ Total 12 drwxr-xr-x 3 جذر الجذر 1024 1 أكتوبر 15:40 قوس drwxr-xr-x 3 الجذر الجذر 4096 1 أكتوبر 18:02 التشفير drwxr-xr-x 54 الجذر الجذر 1024 أكتوبر 1 15:40 السائقين drwxr-xr-x 51 الجذر الجذر 3072 أكتوبر 1 18:02 fs drwxr-xr-x 6 الجذر الجذر 1024 أكتوبر 1 18:02 lib drwxr-xr-x 37 root root 1024 1 أكتوبر 15:40 net drwxr-xr-x 11 root root 1024 1 أكتوبر 18:02 صوت

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

كيف نعرف ما هي وحدات النواة المطلوبة، وما هي تلك التي يمكن حذفها؟

انها بسيطة: إذا كان العداد استعمل من قبل تساوي صفرًا، وبالتالي لا يتم استخدام وحدة kernel من قبل أي شخص أو أي شيء. وبناء على ذلك يمكن حذفه.

إزالة وحدة النواةيحدث كفريق com.rmmodاسم وحدة.

قد تكون هناك حاجة إلى وحدة عن بعد أثناء التشغيل؛ لتحميل الوحدة، يجب عليك تشغيل الأمر: com.insmod/path/to/module.ko

مثال مثير للاهتمام لاستخدام insmod مع أوامر أخرى:

# uname -r 2.6.27-ovz-smp-alt9 # insmod /lib/modules/`uname -r`/kernel/drivers/block/floppy.ko # rmmod floppy # modinfo -F filename floppy /lib/modules/2.6 .27-ovz-smp-alt9/kernel/drivers/block/floppy.ko # insmod $(modinfo -F filename floppy) # lsmod | grep القرص المرن 58244 0

هناك أيضا آخر فريقل إدارة الوحدة: . تكمن خصوصية هذا الأمر في أنه يزيل/يضيف وحدات مع مراعاة التبعيات بين الوحدات (يتم كتابة التبعيات بين الوحدات في الملف /lib/modules/version/modules.dep). مثال الاستخدام:

# modprobe -r vfat vfat: الجهاز أو المورد مشغول # lsmod | grep Fat vfat 13132 1 Fat 38744 1 # umount /windows/D # modprobe -r vfat # modprobe -v --show vfat /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/ Fat/fat.o /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o # lsmod | grep Fat # modprobe -v vfat /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o باستخدام /lib/modules/2.4.21-37.0.1.EL /kernel/fs/fat/fat.o بادئة إصدار الرمز "" /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o باستخدام /lib/modules/2.4 .21-37.0.1.EL/kernel/fs/vfat/vfat.o # lsmod | دهون grep vfat 13132 0 (غير مستخدمة) دهون 38744 0

كما ذكر أعلاه، وحدات النواة لها تبعيات على بعضها البعض، والتي يتم كتابتها في الملف /lib/modules/version/modules.dep.يتم إنشاء هذا الملف بواسطة الأمر depmod، والذي، عند تنفيذه، يبحث في بنية الدليل /lib/modules/current_kernel_version/ويولد معلومات حول التبعيات.

أريد أيضًا أن أشير إلى أنه يوجد في Linux ملف تكوين /etc/modules.conf,الذي يخاطبه com.modprobeو com.debmod. يستخدم هذا الملف في الغالب لضبط الأسماء المستعارة للوحدة النمطية. تستخدم بعض أنظمة التشغيل ملفات تكوين مختلفة، مثل /etc/modprobe.confأو دليل يحتوي على ملفات التكوين - /etc/modprobe.d/.

يوجد مصدر ممتاز آخر للمعلومات حول نواة Linux الحالية على /التمهيد/التكوين-2.6....باستخدامه، يمكنك الحصول على معلومات كافية (على سبيل المثال، ما إذا كانت النواة تدعم نظام الملفات cifs):

خادم Samba:~# grep CONFIG_SMB_FS /boot/config-2.6.32-5-686 # لم يتم تعيين CONFIG_SMB_FS خادم samba:~# grep CONFIG_CIFS /boot/config-2.6.32-5-686 CONFIG_CIFS=m # CONFIG_CIFS_STATS لم يتم تعيين CONFIG_CIFS_WEAK_PW_HASH=y CONFIG_CIFS_UPCALL=y CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y # CONFIG_CIFS_DEBUG2 لم يتم تعيينه CONFIG_CIFS_DFS_UPCALL=y CONFIG_CIFS_EXPERIMENTAL=y

هذا كل شيء لهذا اليوم. كما هو الحال دائمًا، سأكون سعيدًا جدًا برؤية تعليقاتك! في سوف نتعلم كيفية تجميع جوهرنا.

مع أطيب التحيات، مكسيم!

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

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

تكوين النواة

الخطوة الأولى هي العثور على مصادر النواة الأقرب إلى صورة النواة قدر الإمكان. ربما يكون الحصول على التكوين الصحيح هو الجزء الأكثر صعوبة في عملية تجميع الوحدة بأكملها. ابدأ برقم إصدار النواة الذي يمكن قراءته من /proc/version . إذا كنت، مثلي، تقوم بإنشاء وحدة نمطية لجهاز Android، فجرّب نواة Android من Code Aurora، أو Cyanogen، أو Android، أيهما أقرب إلى جهازك. في حالتي، كان نواة MSM-3.0. لاحظ أنك لا تحتاج بالضرورة إلى البحث عن الإصدار المصدر نفسه تمامًا مثل إصدار صورة kernel الخاص بك. من المرجح ألا تكون الاختلافات الطفيفة في الإصدار مشكلة. لقد استخدمت مصادر النواة 3.0.21، في حين أن نسخة صورة النواة الموجودة كانت 3.0.8. ومع ذلك، لا تحاول استخدام مصادر kernel 3.1 إذا كان لديك صورة kernel 3.0.x.

إذا كانت صورة النواة لديك جيدة بما يكفي لتوفير ملف /proc/config.gz، فيمكنك البدء بذلك، وإلا، يمكنك محاولة البدء بالتكوين الافتراضي، ولكن في هذه الحالة عليك أن تكون حذرًا للغاية ( بينما لن أخوض في التفاصيل حول استخدام التكوين الافتراضي لأنني كنت محظوظًا بما يكفي لعدم اللجوء إليه، وستكون هناك بعض التفاصيل أدناه حول سبب أهمية التكوين الصحيح).

بافتراض أن لديكarm-eabi-gcc متاحًا في أحد المسارات في متغير بيئة PATH الخاص بك، وأن الوحدة الطرفية مفتوحة في مجلد مصدر kernel، يمكنك البدء في تكوين kernel وتثبيت ملفات الرأس والبرامج النصية:

$ mkdir build $ gunzip config.gz > build/.config # أو أي شيء للتحضير .config $ جعل Silentoldconfig تحضير الرؤوس_تثبيت البرامج النصية ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=`adb shell uname - r`
من المرجح أن يسألك الإصدار Silentoldconfig عما إذا كنت تريد تمكين خيارات معينة. يمكنك اختيار الإعدادات الافتراضية، لكن هذا قد لا ينجح.

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

كتابة وحدة بسيطة

لإنشاء وحدة نمطية فارغة، تحتاج إلى إنشاء ملفين: مصدر وملف Makefile. ضع الكود التالي في ملف hello.c في دليل منفصل:

#يشمل /* مطلوب لجميع الوحدات */ #include /* مطلوب لـ KERN_INFO */ #include /* مطلوب لوحدات الماكرو */ static int __init hello_start(void) ( printk(KERN_INFO "Hello World\n"); return 0; ) static void __exit hello_end(void) ( printk(KERN_INFO "Goodbye world\n"); ) Module_init(hello_start); Module_exit(hello_end);
ضع النص التالي في Makefile في نفس الدليل:

Obj-m = hello.o
يعد تجميع الوحدة أمرًا بسيطًا للغاية، ولكن في هذه المرحلة لن تتمكن الوحدة الناتجة من التحميل.

تجميع الوحدة

أثناء بناء النواة العادي، يقوم نظام بناء النواة بإنشاء ملف hello.mod.c، والذي يمكن أن تسبب محتوياته مشاكل مختلفة:

MODULE_INFO(vermagic، VERMAGIC_STRING);
يتم تحديد قيمة VERMAGIC_STRING بواسطة الماكرو UTS_RELEASE، الموجود في ملف include/generated/utsrelease.h الذي تم إنشاؤه بواسطة نظام بناء kernel. افتراضيًا، يتم تحديد هذه القيمة من خلال إصدار kernel وحالة مستودع git. هذا ما يحدده KERNELRELEASE عند تكوين النواة. إذا لم يتطابق VERMAGIC_STRING مع إصدار kernel، فسيؤدي تحميل الوحدة إلى ظهور رسالة كهذه في dmesg:

مرحبًا: الإصدار السحري "3.0.21-perf-ge728813-00399-gd5fa0c9" يجب أن يكون "3.0.8-perf"
بعد ذلك، لدينا هنا أيضًا تعريف لبنية الوحدة:

الوحدة الهيكلية __this_module __attribute__((section(".gnu.linkonce.this_module"))) = ( .name = KBUILD_MODNAME, .init = init_module, #ifdef CONFIG_MODULE_UNLOAD .exit = cleanup_module, #endif .arch = MODULE_ARCH_INIT, );
يبدو هذا التعريف غير ضار في حد ذاته، لكن بنية الوحدة النمطية المحددة في include/linux/module.h بها مفاجأة غير سارة:

الوحدة الهيكلية ( (...) #ifdef CONFIG_UNUSED_SYMBOLS (...) #endif (...) /* وظيفة بدء التشغيل. */ int (*init)(void); (...) #ifdef CONFIG_GENERIC_BUG (.. .) #endif #ifdef CONFIG_KALLSYMS (...) #endif (...) (... الكثير من ifdefs ...) #ifdef CONFIG_MODULE_UNLOAD (...) /* وظيفة التدمير */ void (*exit) ( باطل (...) #endif (...))
هذا يعني أنه لكي ينتهي مؤشر init في المكان الصحيح، يجب تعريف CONFIG_UNUSED_SYMBOLS وفقًا لما تستخدمه صورة النواة لدينا. ماذا عن مؤشر الخروج، فهو CONFIG_GENERIC_BUG و CONFIG_KALLSYMS و CONFIG_SMP و CONFIG_TRACEPOINTS و CONFIG_JUMP_LABEL و CONFIG_TRACING و CONFIG_EVENT_TRACING و CONFIG_FTRACE_MCOUNT_RECORD و CONFIG_MODULE_UNLOAD .

هل بدأت تفهم لماذا من المفترض عادةً أن نستخدم نفس ملفات الرأس التي تم إنشاء النواة بها؟

Static const struct modversion_info ____versions __used __attribute__((section("__versions"))) = ( ( 0xsomehex, "module_layout" ), ( 0xsomehex, "__aeabi_unwind_cpp_pr0" ), ( 0xsomehex, "printk" ), );
تأتي هذه التعريفات من ملف Module.symvers، الذي يتم إنشاؤه وفقًا لملفات الرأس.

يمثل كل إدخال الرمز الذي تتطلبه الوحدة والتوقيع الذي يجب أن يحمله الرمز. يعتمد الحرف الأول، Module_layout ، على الشكل الذي تبدو عليه وحدة البنية، أي أنه يعتمد على خيارات التكوين المذكورة سابقًا التي تم تمكينها. الثانية، __aeabi_unwind_cpp_pr0، هي وظيفة محددة لـ ARM ABI، والأخيرة مخصصة لاستدعاءات دالة printk الخاصة بنا.

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

لذا، إذا قمنا ببناء نواة بمصادر وتكوينات قريبة بدرجة كافية من تلك التي تم استخدامها لبناء صورة النواة التي لدينا، فهناك احتمال ألا نحصل على نفس التوقيعات الموجودة في صورة النواة الخاصة بنا، وسوف تتعطل عندما تحميل الوحدة:

مرحبًا: لا أوافق على إصدار الرمز code_name
مما يعني أننا بحاجة إلى ملف Module.symvers الصحيح لصورة النواة، وهو ما لا نملكه.

دراسة النواة

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

تستخدم النواة الوظيفة التالية للبحث عن جدول الرموز الخاص بها (في kernel/module.c):

Bool every_symbol_section(bool (*fn)(const structsymsearch *arr, struct Module *owner, void *data), void *data) ( struct Module *mod; static const structsymsearch arr = ( ( __start____ksymtab, __stop___ksymtab, __start___kcrctab, NOT_GPL_ONLY , خطأ ), ( __start__ksymtab_gpl, __stop____ksymtab_gpl, __start___kcrctab_gpl, GPL_ONLY, false ), ( __start___ksymtab_gpl_future, __stop___ksymtab_gpl_future, __start___kcrctab_gpl_future, WILL_BE_GPL_ONLY, false ), # ifdef CONFIG_UNUSE D_SYMBOLS ( __start___ksymtab_unused, __stop___ksymtab_unused, __start___kcrctab_unused, NOT_GPL_ONLY, true ), ( __start___ksymtab_unused_gpl, __stop____ksymtab_unused_gpl, __start___kcrctab_unused_gpl , GPL_ONLY, true ), #endif ); if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data)) يُرجع صحيحًا (...)
تم تعريف البنية المستخدمة في هذه الوظيفة في include/linux/module.h:

Structsymsearch ( const struct kernel_symbol *start, *stop; const unsigned long *crcs; enum ( NOT_GPL_ONLY, GPL_ONLY, WILL_BE_GPL_ONLY, ) License; bool unused; );
ملاحظة: لم يتغير رمز kernel هذا بشكل ملحوظ خلال السنوات الأربع الماضية (على ما يبدو منذ إصدار kernel 3.0 المعني - تقريبًا).

ما لدينا أعلاه في وظيفة every_symbol_section هو ثلاثة حقول (أو خمسة عند تمكين CONFIG_UNUSED_SYMBOLS)، يحتوي كل منها على بداية جدول الرموز ونهايته وعلامتين.

هذه البيانات ثابتة ومستمرة، مما يعني أنها ستظهر في الملف الثنائي للنواة كما هي. من خلال مسح النواة لثلاث تسلسلات متتالية من ثلاثة مؤشرات في مساحة عنوان النواة متبوعة بقيم عددية من التعريفات في every_symbol_section يمكننا تحديد موقع جداول الرمز والتوقيع، وإعادة إنشاء ملف Module.symvers من النواة الثنائية.

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

العلامات: إضافة العلامات