استدعاء النظام

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

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

في معظم الأنظمة، لا يمكن إجراء استدعاءات النظام إلا من عمليات مساحة المستخدم ، بينما في بعض الأنظمة، مثل نظام التشغيل OS/360 والأنظمة اللاحقة ، يقوم رمز النظام ذو الامتيازات أيضًا بإصدار استدعاءات النظام. [ 1 ]

بالنسبة للأنظمة المدمجة ، فإن استدعاءات النظام لا تغير عادةً وضع الامتيازات لوحدة المعالجة المركزية.

الامتيازات

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

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

المكتبة كوسيط

بشكل عام، توفر الأنظمة مكتبة أو واجهة برمجة تطبيقات (API) تتوسط بين البرامج العادية ونظام التشغيل. في الأنظمة الشبيهة بنظام يونكس ، عادةً ما تكون واجهة برمجة التطبيقات هذه جزءًا من تطبيق مكتبة C (libc)، مثل glibc ، التي توفر دوالًا وسيطة لاستدعاءات النظام، وغالبًا ما تحمل نفس أسماء استدعاءات النظام التي تستدعيها. أما في نظام ويندوز NT ، فتُعد واجهة برمجة التطبيقات هذه جزءًا من واجهة برمجة التطبيقات الأصلية (Native API ) في مكتبة ntdll.dll ؛ وهي واجهة برمجة تطبيقات غير موثقة تستخدمها تطبيقات واجهة برمجة تطبيقات ويندوز العادية ، وتستخدمها بعض برامج النظام على ويندوز مباشرةً. تُتيح الدوال الوسيطة في المكتبة اصطلاحًا عاديًا لاستدعاء الدوال ( استدعاء روتيني فرعي على مستوى التجميع ) لاستخدام استدعاء النظام، بالإضافة إلى جعل استدعاء النظام أكثر نمطية . هنا، تتمثل الوظيفة الأساسية للغلاف في وضع جميع الوسائط المراد تمريرها إلى استدعاء النظام في سجلات المعالج المناسبة (وربما في مكدس الاستدعاءات أيضًا)، وكذلك تعيين رقم استدعاء نظام فريد للنواة لاستدعائه. وبهذه الطريقة، تُعزز المكتبة، الموجودة بين نظام التشغيل والتطبيق، قابلية النقل .

لا يؤدي استدعاء دالة المكتبة بحد ذاته إلى التبديل إلى وضع النواة ، وعادةً ما يكون استدعاءً روتينيًا عاديًا (باستخدام، على سبيل المثال، تعليمة التجميع "CALL" في بعض بنى مجموعات التعليمات (ISA)). أما استدعاء النظام الفعلي فينقل التحكم إلى النواة (وهو أكثر اعتمادًا على التنفيذ والمنصة من استدعاء المكتبة الذي يُجرّده). على سبيل المثال، في الأنظمة الشبيهة بنظام يونكس ، forkتُعدّ execveدوال مكتبة C التي بدورها تُنفّذ تعليمات تستدعي استدعاءات forkالنظام exec. يُعدّ إجراء استدعاء النظام مباشرةً في كود التطبيق أكثر تعقيدًا، وقد يتطلب استخدام كود تجميع مُضمّن (في لغتي C و C++ )، بالإضافة إلى الحاجة إلى معرفة الواجهة الثنائية منخفضة المستوى لعملية استدعاء النظام، والتي قد تخضع للتغيير بمرور الوقت، وبالتالي لا تكون جزءًا من الواجهة الثنائية للتطبيق ؛ تهدف دوال المكتبة إلى تجريد هذا الأمر.

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

تُنفّذ أنظمة التشغيل OS/360 و DOS/360 و TSS/360 من IBM معظم استدعاءات النظام عبر مكتبة من وحدات الماكرو المكتوبة بلغة التجميع ، [ ب ] على الرغم من وجود بعض الخدمات التي تتطلب ربط استدعاء. ويعكس هذا أصلها في وقتٍ كان فيه البرمجة بلغة التجميع أكثر شيوعًا من استخدام لغات البرمجة عالية المستوى . ولذلك، لم تكن استدعاءات نظام IBM قابلة للتنفيذ مباشرةً بواسطة برامج لغات البرمجة عالية المستوى، بل كانت تتطلب روتينًا فرعيًا مُغلِّفًا بلغة التجميع قابلًا للاستدعاء. ومنذ ذلك الحين، أضافت IBM العديد من الخدمات التي يمكن استدعاؤها من لغات البرمجة عالية المستوى، مثل z/OS و z/VSE . وفي الإصدارات الأحدث من MVS/SP وفي جميع إصدارات MVS اللاحقة، تُولِّد بعض وحدات الماكرو لاستدعاءات النظام استدعاء البرنامج (PC).

أمثلة وأدوات

في أنظمة يونكس ، والأنظمة الشبيهة بيونكس، وغيرها من أنظمة التشغيل المتوافقة مع معيار POSIX ، تشمل استدعاءات النظام الشائعة ما يلي: open`< readsystem.getName>` ، writeو` <system.getName>` ، و`<system.getName>`، و`<system.getName>`، و`<system.getName>` . تحتوي العديد من أنظمة التشغيل الحديثة على مئات من استدعاءات النظام. على سبيل المثال، يحتوي كل من لينكس وأوبن بي إس دي على أكثر من 300 استدعاء مختلف، [ 2 ] [ 3 ] ويحتوي نت بي إس دي على ما يقارب 500 استدعاء، [ 4 ] ويحتوي فري بي إس دي على أكثر من 500 استدعاء، [ 5 ] ويحتوي ويندوز على ما يقارب 2000 استدعاء، موزعة بين استدعاءات نظام win32k (الرسومية) وntdll (الأساسية)، [ 6 ] بينما يحتوي بلان 9 على 54 استدعاء. [ 7 ]closewaitexecforkexitkill

تتيح أدوات مثل strace و ftrace وtruss للعملية التشغيل من البداية والإبلاغ عن جميع استدعاءات النظام التي تُجريها، أو يمكنها الاتصال بعملية قيد التشغيل واعتراض أي استدعاء نظام تُجريه تلك العملية إذا لم تنتهك العملية صلاحيات المستخدم. عادةً ما تُنفَّذ هذه القدرة الخاصة للبرنامج أيضًا باستخدام استدعاءات النظام مثل ptrace أو استدعاءات النظام على الملفات في نظام ملفات procfs .

التطبيقات النموذجية

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

هذه هي التقنية الوحيدة المتاحة للعديد من معالجات RISC ، لكن معمارية CISC مثل x86 تدعم تقنيات إضافية. على سبيل المثال، تحتوي مجموعة تعليمات x86 على التعليمات SYSCALL/ SYSRETو SYSENTER/ SYSEXIT(تم تطوير هاتين الآليتين بشكل مستقل من قبل AMD و Intel على التوالي، لكنهما تؤديان نفس الوظيفة في جوهرهما). هذه تعليمات نقل تحكم "سريعة" مصممة لنقل التحكم بسرعة إلى النواة لتنفيذ استدعاء نظام دون الحاجة إلى مقاطعة. [ 8 ] بدأ نظام Linux 2.5 باستخدام هذه التقنية على معالجات x86 ، حيثما كان ذلك متاحًا؛ سابقًا، كان يستخدم INTتعليمة أخرى، حيث يتم وضع رقم استدعاء النظام في EAXالمسجل قبل تنفيذ المقاطعة 0x80. [ 9 ] [ 10 ]

إحدى الآليات القديمة هي بوابة الاستدعاء ؛ استُخدمت في الأصل في Multics ، ولاحقًا، على سبيل المثال، انظر بوابة الاستدعاء على معالجات Intel x86 . تسمح هذه الآلية للبرنامج باستدعاء دالة من النواة مباشرةً باستخدام آلية نقل تحكم آمنة، يُهيئها نظام التشغيل مسبقًا. لم يلقَ هذا الأسلوب رواجًا على معالجات x86، ربما بسبب اشتراط الاستدعاء البعيد (استدعاء إجراء موجود في مقطع مختلف عن مقطع التعليمات الحالي [ 11 ] )، والذي يستخدم تجزئة ذاكرة x86 وما ينتج عنها من نقص في قابلية النقل ، بالإضافة إلى وجود التعليمات الأسرع المذكورة سابقًا.

في بنية IA-64EPC ، تُستخدم تعليمة (Enter Privileged Code). تُمرر الوسائط الثمانية الأولى لاستدعاء النظام في المسجلات، بينما تُمرر الوسائط المتبقية عبر المكدس.

في عائلة الحواسيب المركزية IBM System/360 ، والإصدارات اللاحقة لها، تُستخدم تعليمة استدعاء المشرف ( SVC )، التي يُحدد رقمها في التعليمة نفسها بدلاً من سجل، لتنفيذ استدعاءات النظام للوظائف القديمة في معظم أنظمة تشغيل IBM ، ولجميع استدعاءات النظام في لينكس . في الإصدارات اللاحقة من MVS، تستخدم IBM تعليمة استدعاء البرنامج (PC) للعديد من الوظائف الأحدث. على وجه الخصوص، تُستخدم PC عندما يكون المُستدعي في وضع كتلة طلب الخدمة (SRB).

استخدم الحاسوب المصغر PDP -11 تعليمات EMT و TRAP و IOT ، والتي، على غرار تعليمات IBM System/360 SVC وx86 INT ، تضع التعليمات البرمجية داخل التعليمات نفسها؛ حيث تُولّد هذه التعليمات مقاطعات لعناوين محددة، ناقلةً التحكم إلى نظام التشغيل. أما حاسوب VAX ذو 32 بت، الذي خلف سلسلة PDP-11، فقد استخدم تعليمات CHMK و CHME و CHMS لإجراء استدعاءات نظامية إلى التعليمات البرمجية ذات الامتيازات على مستويات مختلفة؛ وتُعدّ التعليمات البرمجية وسيطًا للتعليمات.

في بنية RISC-V ذات الامتيازات [ 12 ] ، صُممت التعليمة ECALL(بعد استدعاء البيئةECALL ) للدخول إلى مستوى امتيازات أعلى، وبالتالي تُنفذ هذه التعليمة وظائف استدعاءات النظام. تُعالج الأحداث بطريقة مشابهة لأنواع أخرى من المصائد المتزامنة، بما في ذلك آلية الإرجاع نفسها. في تطبيقات Linux ذات الصلة ، يُوضع رقم استدعاء النظام في السجل a7( x17) قبل ECALLالتنفيذ، وتُدرج وسائط الدالة وفقًا لواجهة التطبيق الثنائية RISC-V ( a0, a1, ...)، بينما تُوضع قيمة الإرجاع في a0.

فئات استدعاءات النظام

يمكن تصنيف استدعاءات النظام تقريبًا إلى ست فئات رئيسية: [ 13 ]

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

وضع المعالج وتبديل السياق

تُعالَج استدعاءات النظام في معظم الأنظمة الشبيهة بنظام يونكس في وضع النواة ، وذلك بتغيير وضع تنفيذ المعالج إلى وضع ذي صلاحيات أعلى، ولكن لا يلزم تبديل سياق العملية - مع أن تبديل سياق الصلاحيات يحدث. يرى الجهاز العالم من منظور وضع التنفيذ وفقًا لسجل حالة المعالج ، والعمليات هي تجريد يوفره نظام التشغيل. لا يتطلب استدعاء النظام عمومًا تبديل سياق إلى عملية أخرى؛ بل يُعالَج في سياق العملية التي استدعته. [ 14 ] [ 15 ] 

في العمليات متعددة الخيوط ، يمكن استدعاء وظائف النظام من عدة خيوط . وتعتمد معالجة هذه الاستدعاءات على تصميم نواة نظام التشغيل وبيئة تشغيل التطبيق. توضح القائمة التالية نماذج نموذجية تتبعها أنظمة التشغيل: [ 16 ] [ 17 ]

  • نموذج متعدد إلى واحد : تتم معالجة جميع استدعاءات النظام من أي خيط مستخدم في عملية ما بواسطة خيط واحد على مستوى النواة. يعاني هذا النموذج من عيب خطير ، وهو أن أي استدعاء نظام مُعطِّل (مثل انتظار إدخال من المستخدم) قد يُجمِّد جميع الخيوط الأخرى. كذلك، بما أنه لا يمكن إلا لخيط واحد الوصول إلى النواة في الوقت نفسه، فإن هذا النموذج لا يستطيع الاستفادة من أنوية المعالجات المتعددة. 
  • نموذج واحد لواحد : يتم ربط كل خيط مستخدم بخيط منفصل على مستوى النواة أثناء استدعاء النظام. يحل هذا النموذج مشكلة حظر استدعاءات النظام المذكورة أعلاه. وهو موجود في جميع توزيعات لينكس الرئيسية ، وmacOS ، و iOS ، والإصدارات الحديثة من ويندوز وسولاريس .
  • نموذج متعدد الأطراف : في هذا النموذج، يتم ربط مجموعة من خيوط المستخدم بمجموعة من خيوط النواة. وتتم معالجة جميع استدعاءات النظام من مجموعة خيوط المستخدم بواسطة الخيوط الموجودة في مجموعة خيوط النواة المقابلة لها .
  • النموذج الهجين : يُطبّق هذا النموذج كلاً من نموذج العلاقات المتعددة إلى المتعددة ونموذج العلاقات الفردية إلى الفردية، وذلك حسب اختيار النواة. يوجد هذا النموذج في الإصدارات القديمة من أنظمة IRIX و HP-UX و Solaris .

انظر أيضاً

ملحوظات

  1. في أنظمة التشغيل الشبيهة بنظام UNIX ، تُستخدم استدعاءات النظام فقط للنواة .
  2. في كثير من الحالات، ولكن ليس كلها، قامت شركة IBM بتوثيق، على سبيل المثال، رقم SVC، وسجلات المعلمات.
  3. تستخدم مكونات CP الخاصة بـ CP-67 و VM تعليمات التشخيص (DIAG) كاستدعاء للمشرف (HVC) من جهاز افتراضي إلى CP.

مراجع

  1. "كتابة إجراءات SVC". دليل مبرمج نظام التشغيل IBM System/360 (ملف PDF) . الطبعة الثالثة. IBM. مارس 1967. الصفحات 32-36 . C28-6550-2. 
  2. "syscalls(2) - صفحة دليل لينكس" .
  3. OpenBSD (14 سبتمبر 2013). "أسماء استدعاءات النظام (kern/syscalls.c)" . مرجع BSD المتقاطع .
  4. NetBSD (17 أكتوبر 2013). "أسماء استدعاءات النظام (kern/syscalls.c)" . مرجع BSD المتقاطع .
  5. "FreeBSD syscalls.c، قائمة بأسماء ومعرفات استدعاءات النظام" .
  6. ^ ماتيوس “j00ru” Jurczyk (5 نوفمبر 2017). "جدول استدعاء نظام Windows WIN32K.SYS (NT/2000/XP/2003/Vista/2008/7/8/10)" .{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط )
  7. "sys.h" . الخطة 9 من مختبرات بيل . مؤرشف من الأصل في 8 سبتمبر 2023،قائمة أسماء ومعرفات استدعاءات النظام.
  8. "SYSENTER" . ويكي تطوير أنظمة التشغيل . مؤرشف من الأصل في 8 نوفمبر 2023.
  9. مجهول (19 ديسمبر 2002). "لينكس 2.5 يحصل على دعم vsyscalls وsysenter" . KernelTrap . تم الاسترجاع في 1 يناير 2008 .
  10. مانو جارج (2006). "آلية استدعاء النظام القائمة على مركز النظام في لينكس 2.6" .
  11. "التحرير: مرجع مجموعة تعليمات x86" . renejeschke.de . تم الاطلاع عليه بتاريخ 4 يوليو 2015 .
  12. "دليل مجموعة تعليمات RISC-V، المجلد الثاني - البنية المميزة" (PDF) .
  13. سيلبرشاتز، أبراهام (2018). مفاهيم أنظمة التشغيل . بيتر ب. جالفين؛ جريج جان ( الطبعة العاشرة). هوبوكين، نيو جيرسي: وايلي . ص 67. ISBN   9781119320913. OCLC 1004849022 . 
  14. باخ، موريس ج. (1986)، تصميم نظام التشغيل يونكس ، برنتيس هول، ص 15-16.
  15. إليوت، جون (1 أكتوبر 2011). "مناقشة تنفيذ استدعاء النظام في نادي البرمجة، بما في ذلك اقتباس من باخ 1986" . مؤرشف من الأصل في 24 يوليو 2012. تم الاطلاع عليه في 1 أكتوبر 2011 .
  16. "خيوط" .
  17. "نماذج الخيوط" (ملف PDF) .

للمزيد من القراءة