ايوكتل

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

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

خلفية

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

تقدم تطبيقات مساحة المستخدم عادةً طلبات إلى النواة عن طريق مكالمات النظام ، والتي يقع كودها في طبقة النواة. عادةً ما تأخذ مكالمة النظام شكل "متجه مكالمة النظام"، حيث يتم الإشارة إلى مكالمة النظام المطلوبة برقم فهرس. على سبيل المثال، exit()قد تكون مكالمة النظام رقم 1، والرقم write()4. ثم يتم استخدام متجه مكالمة النظام للعثور على وظيفة النواة المطلوبة للطلب. بهذه الطريقة، توفر أنظمة التشغيل التقليدية عادةً عدة مئات من مكالمات النظام إلى مساحة المستخدم.

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

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

الاستخدامات

تكوين الأجهزة المادية

الاستخدام الشائع لـ ioctlهو التحكم في الأجهزة.

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

في OpenBSD و NetBSD ، ioctlيتم استخدامه بواسطة bio(4)برنامج تشغيل الجهاز الوهمي والأداة bioctlالمساعدة لتنفيذ إدارة وحدة تخزين RAID في واجهة موحدة مستقلة عن البائع مشابهة لـ ifconfig. [1] [2]

في NetBSD ، ioctlيتم استخدامه أيضًا بواسطة sysmonالإطار. [3]

محطات طرفية

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

استخدمت أنظمة تشغيل يونكس بشكل تقليدي واجهات سطر الأوامر بكثافة ، في البداية مع محطات نصية للأجهزة مثل VT100s متصلة بالمنافذ التسلسلية ، وفي وقت لاحق مع محاكيات المحطات وخوادم تسجيل الدخول عن بعد باستخدام محطات طرفية زائفة . يتم التحكم في أجهزة المنفذ التسلسلي والمحطات الطرفية الزائفة وتكوينها باستخدام ioctlالمكالمات. على سبيل المثال، يتم تعيين حجم العرض باستخدام المكالمة TIOCSWINSZ. يمكن لوظيفة ioctl (التحكم في إدخال/إخراج المحطة الطرفية، محاكاة إدخال المحطة الطرفية) دفع حرف إلى مجرى جهاز. [4]

ملحقات النواة

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

بديل sysctl

وفقًا لمطور OpenBSD ، ioctlوهما sysctlمكالمتان للنظام لتوسيع النواة، وربما sysctlتكونان الأبسط من الاثنتين. [5]

في NetBSD ، يستخدم sysmon_envsysإطار عمل مراقبة الأجهزةioctl من خلال proplib؛ بينما يستخدم OpenBSD و DragonFly BSDsysctl بدلاً من ذلك لإطار العمل المقابل لهما . تم تنفيذ hw.sensorsالمراجعة الأصلية لـ في NetBSD باستخدام قبل أن تكون متاحة، وكان بها رسالة تشير إلى أن الإطار تجريبي، ويجب استبداله بواجهة ، إذا تم تطوير واحدة، [6] [7] وهو ما يفسر على الأرجح اختيار في OpenBSD مع تقديمه اللاحق لـ في عام 2003. ومع ذلك، عندما أعيد تصميم الإطار في عام 2007 حوالي عام ، ظلت نداء النظام كما هو ، وتمت إزالة الرسالة. [8]envsysioctlproplibsysctl(8)sysctlhw.sensorsenvsysproplibioctl

التنفيذات

يونكس

ظهرت نداءات ioctlالنظام لأول مرة في إصدار 7 من يونكس ، كبديل لنداءات النظام stty[9]gtty ، مع وسيطة رمز طلب إضافية. ioctlتأخذ النداءات المعلمات التالية :

  1. وصف ملف مفتوح
  2. رقم رمز الطلب
  3. مؤشر غير مكتوب للبيانات (إما أن يذهب إلى برنامج التشغيل، أو يعود من برنامج التشغيل، أو كليهما).

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

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

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

TCSETSيُعَد هذا مثالاً على ioctlمكالمة على منفذ تسلسلي . تتلقى مكالمات القراءة والكتابة العادية على منفذ تسلسلي بايتات البيانات وترسلها. ioctl(fd,TCSETS,data)تتحكم مكالمة منفصلة عن مثل هذا الإدخال/الإخراج العادي في خيارات برنامج التشغيل المختلفة مثل التعامل مع الأحرف الخاصة أو إشارات الإخراج على المنفذ (مثل إشارة DTR ).

ويندوز 32

يأخذ نظام التشغيل Win32 DeviceIoControlكمعلمات:

  1. مقبض كائن مفتوح (المعادل لوصف الملف في نظام Win32)
  2. رقم رمز الطلب (رمز التحكم)
  3. مخزن مؤقت لمعلمات الإدخال
  4. طول مخزن الإدخال
  5. مخزن مؤقت لنتائج الإخراج
  6. طول المخزن المؤقت للإخراج
  7. هيكل OVERLAPPED، إذا تم استخدام الإدخال/الإخراج المتداخل .

يأخذ كود التحكم في جهاز Win32 في الاعتبار وضع العملية التي يتم إجراؤها.

هناك 4 أوضاع تشغيل محددة تؤثر على أمان برنامج تشغيل الجهاز -

  1. METHOD_IN_DIRECT:تم التحقق من أن عنوان المخزن المؤقت قابل للقراءة بواسطة المتصل في وضع المستخدم.
  2. METHOD_OUT_DIRECT:تم التحقق من أن عنوان المخزن المؤقت قابل للكتابة بواسطة المتصل في وضع المستخدم.
  3. METHOD_NEITHER:يتم تمرير العناوين الافتراضية في وضع المستخدم إلى برنامج التشغيل دون تعيين أو التحقق من الصحة.
  4. METHOD_BUFFERED:يتم استخدام المخازن المؤقتة المشتركة التي يتحكم فيها IO Manager لنقل البيانات من وإلى وضع المستخدم.

البدائل

واجهات الاتصال المتجهة الأخرى

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

في أنظمة التشغيل Unix، هناك واجهتا نداء متجهتان أخريان شائعتان: fcntlنداء النظام ("التحكم في الملفات") يقوم بتكوين الملفات المفتوحة، ويُستخدم في مواقف مثل تمكين الإدخال/الإخراج غير الحظر ؛ ونداء النظام ("تعيين خيار المقبس") يقوم بتكوين مآخذ الشبكةsetsockopt المفتوحة ، وهي ميزة تستخدم لتكوين جدار حماية الحزم على أنظمة BSD Unix. ipfw

تخطيط الذاكرة

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

Netlink عبارة عن آلية تشبه المقبس للاتصال بين العمليات (IPC)، وهي مصممة لتكون خليفة أكثر مرونة لـ ioctl.

تداعيات

تعقيد

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

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

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

Libpcap وlibdnet هما مثالان لمكتبات Unix الخارجية المصممة لإخفاء تعقيد ioctlالواجهات، لالتقاط الحزم وإدخال/إخراج الحزم، على التوالي.

حماية

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

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

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

قراءة إضافية

مراجع

  1. ^ نيكلاس هالكفيست (2002)؛ ماركو بيربوم (2006). "bio(4) — block I/O ioctl tunnel pseudo-device". BSD Cross Reference . OpenBSD .{{cite web}}:CS1 maint: أسماء رقمية: قائمة المؤلفين ( الرابط )
    • "bio — block I/O ioctl tunnel pseudo-device". صفحة دليل خادم OpenBSD.
  2. ^ ماركو بيربوم (2005). "bioctl(8) — واجهة إدارة RAID". مرجع BSD المتقاطع . OpenBSD .
    • "bioctl — واجهة إدارة RAID". صفحة خادم دليل OpenBSD.
  3. ^ "sysmon(4) — واجهة مراقبة النظام وإدارة الطاقة". NetBSD . واجهة ioctl(2) متوفرة عبر /dev/sysmon.
  4. ^ كريستيانسن، توم ؛ توركينجتون، ناثان (1998). "12: الحزم والمكتبات والوحدات النمطية". كتاب الطبخ بيرل: الحلول والأمثلة لمبرمجي بيرل (الطبعة الثانية). سيباستوبول، كاليفورنيا: أوريلي ميديا، المحدودة (نُشر عام 2003). ص. 482. رقم ISBN  9780596554965تم الاسترجاع في 2016-11-15 . [...] TIOCSTI [...] تعني "التحكم في الإدخال/الإخراج الطرفي، محاكاة الإدخال الطرفي". في الأنظمة التي تنفذ هذه الوظيفة، ستدفع حرفًا واحدًا إلى مجرى جهازك بحيث تحصل في المرة التالية التي تقرأ فيها أي عملية من هذا الجهاز على الحرف الذي وضعته هناك.
  5. ^ Federico Biancuzzi (2004-10-28). "OpenBSD 3.6 Live". ONLamp . O'Reilly Media . مؤرشف من الأصل في 2004-10-29 . تم الاسترجاع 2019-03-20 . هناك مكالمتان للنظام يمكن استخدامهما لإضافة وظائف إلى النواة (دون إضافة مكالمة نظام أخرى): ioctl(2) وsysctl(3). تم اختيار الأخير لأنه كان من السهل جدًا تنفيذ الميزة الجديدة.
  6. ^ Tim Rightnour; Bill Squier (2007-12-19). "envsys -- Environmental Systems API". NetBSD 4.0. هذه الواجهة البرمجية تجريبية وقد يتم إيقاف استخدامها في أي وقت... يجب استبدال هذه الواجهة البرمجية بالكامل بواجهة sysctl(8) أو آلية أحداث النواة، إذا تم تطويرها.
  7. ^ Constantine A. Murenin (2007-04-17). "3.5. NetBSD's sysmon(4)". واجهة عامة مع شاشات أجهزة نظام المعالجات الدقيقة. وقائع مؤتمر IEEE الدولي لعام 2007 حول الشبكات والاستشعار والتحكم، 15-17 أبريل 2007. لندن، المملكة المتحدة: IEEE . ص  901- 906. doi :10.1109/ICNSC.2007.372901. ISBN 978-1-4244-1076-7. IEEE ICNSC 2007، ص 901-906.
  8. ^ Constantine A. Murenin (2010-05-21). "6.1. الجدول الزمني للإطار؛ 7.1. NetBSD envsys / sysmon". أجهزة استشعار OpenBSD - مراقبة البيئة والتحكم في المروحة ( أطروحة ماجستير في الآداب ). جامعة واترلو : UWSpace. hdl :10012/5234. معرف المستند: ab71498b6b1a60ff817b29d56997a418.
  9. ^ McIlroy, MD (1987). A Research Unix reader: annotated excercepts from the Programmer's Manual, 1971–1986 (PDF) (تقرير فني). CSTR. Bell Labs. 139. مؤرشف من الأصل (PDF) في 2023-07-30.
تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=Ioctl&oldid=1265261534"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate