Ioctl

במחשוב, ioctl (קיצור של input/output control - בקרת קלט/פלט ) היא קריאת מערכת ייעודית להתקן חומרה מסוים, או לצורך פעולות אחרות שלא ניתן לייצר באמצעות קריאות רגילות. לקריאה נוסף קוד בקשה כפרמטר, והפעולה אותה מבצעת קריאת המערכת תלויה בקוד הבקשה. קודי בקשה הם לרוב ספציפיים להתקן חומרה מסוים: כך לדוגמה, מנהל התקן (דרייבר) של כונן תקליטורים יכול להורות למכשיר פיזי להוציא דיסק על ידי קריאה ל-ioctl עם קוד הבקשה המתאים לשם כך. לעיתים נעשה שימוש בקודי בקשה שאינם תלויי מכשיר כדי להעניק למרחב המשתמש גישה לפונקציות ליבה המשמשות רק את תוכנת מערכת הליבה או נמצאות עדיין עדיין בפיתוח.

פקודת ioctl הופיעה לראשונה בגרסה 7 של יוניקס תחת שם זה. הפקודה נתמכת על ידי רוב מערכות יוניקס ודמויות יוניקס, כולל Linux ו- macOS, אם כי קודי הבקשה הזמינים שונים ממערכת למערכת. Microsoft Windows מספקת פונקציה דומה, בשם " DeviceIoControl ", בממשק ה- Win32 שלה.

== רקע ==
ניתן לחלק מערכות הפעלה קונבנציונליות לשתי שכבות, מרחב משתמש ואת הקרנל (ליבה) . קוד יישום, למשל, עורך טקסט, שוכן במרחב המשתמש, ואילו ניהול משאבי המערכת (למשל, הזיכרון והמעבד) נמצאים בליבה. קוד ליבה מטפל במשאבים רגישים ומיישם את מחסומי האבטחה והאמינות בין יישומים משום כך, יישומי מרחב המשתמש מנועים על ידי מערכת ההפעלה מלגשת ישירות למשאבי הליבה.

יישומי מרחב המשתמשים בדרך כלל מבקשים בקשות מהליבה באמצעות קריאות מערכת, שהקוד שלהן נמצא בליבה. סוג קריאת מערכת בדרך כלל מקושר לאינדקס. כך לדוגמה, פקודת exit עשויה להיות קריאת מערכת מספר 1, ופקודת write עשויה להיות ממוספרת באינדקס 4. בדרך זו, מערכות הפעלה רגילות מספקות בדרך כלל כמה מאות אפשרויות לקריאות מערכת למרחב המשתמש.

למרות התכנון היעיל של הגישה למשאבי ליבה סטנדרטיים, לעיתים קריאות מערכת אינן מתאימות לגישה לציוד היקפי של חומרה לא סטנדרטית. רוב החומרה ההיקפית (המכונה התקנים) ניתנת לגישה רק מהליבה. עם זאת, ייתכן שקוד המשתמש דווקא יצטרך לתקשר ישירות עם ההתקנים. מערכות הפעלה מודרניות תומכות במכשירים מגוונים, שרבים מהם מציעים אוסף גדול של התקנים. חלק מהתקנים אלו לא נוצרו עדיין בזמן תכנון הקרנל, או שלא מומשה להם קריאת מערכת ייעודית מסיבה אחרת.

כדי לפתור בעיה זו, הקרנל מתוכנן כך שיהיה ניתן להרחבה, ועשוי לקבל מודול נוסף הנקרא "מנהל התקן" אשר פועל במרחב הליבה ויכול לפנות ישירות להתקן. ioctl הוא קריאת מערכת אחת שבאמצעותה מרחב המשתמש רשאי לתקשר עם מנהלי התקנים. הליבה יכולה לאפשר למרחב המשתמש לגשת למנהל התקן מבלי לדעת דבר על ההתקנים הנתמכים על ידי המכשיר, וללא צורך באוסף גדול של קריאות מערכת.

== שימושים ==
=== קינפוג התקן חומרה ===
שימוש נפוץ ב- ioctl הוא בקרת התקני חומרה.

לדוגמה, במערכות Win32, קריאות ioctl יכולות לתקשר עם התקני USB, או לקבל מידע על התקני אחסון זמינים.

=== טרמינלים ===
אחד השימושים בקריאות ioctl הוא שליטה בפסאודו-טרמינלים, אשר הנשלטים ומקונפגים כאילו היו התקני חומרה, בעזרת קריאות ioctl.

=== הרחבות ליבה ===
כאשר יישומים צריכים להרחיב את הליבה, למשל כדי להאיץ את עיבוד הרשת, ioctl מספק דרך נוחה לגשר בין קוד מרחב המשתמש לתוספי ליבה. תוספי ליבה יכולים לספק מיקום במערכת הקבצים שדרכו מספר קריאות ioctl יכולות להשלח ולתכנת את התוסף מבלי להוסיף קריאות מערכת.

== יישומים ==
=== יוניקס ===
קריאת ioctl הופיעה לראשונה בגרסה 7 של יוניקס, stty ששונה לשם. קריאת ioctl מקבלת כפרמטרים :

# הפנייה לקובץ פתוח.
# מספר קוד בקשה.
# ערך שלם המשמש כאינדקס או מצביע לנתוני קלט, פלט או שניהם - קלט ופלט.

הליבה בדרך כלל שולחת ioctl ישירות אל מנהל ההתקן, המפענח את מספר הבקשה והנתונים.

לחלק ממערכות יוניקס, כולל לינוקס, יש מוסכמות המקודדות בתוך מספר הבקשה את גודל הנתונים שיש להעביר למנהל ההתקן, כיוון העברת הנתונים וזהות מנהל ההתקן המיישם את הבקשה. בין אם מתקיימת מוסכמה כזו ובין אם לאו, הליבה ומנהל ההתקן משתפים פעולה כדי לספק קוד שגיאה אחיד ליישום.

=== Win32 ===
מערכת DeviceIoControl המקבילה ל ioctl ב- Win32 מעבירה כפרמטרים:

# הפנייה לאובייקט פתוח
# מספר קוד בקשה ("קוד הבקרה")
# חוצץ לפרמטרי קלט
# גודל חוצץ הקלט
# חוצץ לתוצאות הפלט
# גודל חוצץ הפלט
# "OVERLAPPED", אובייקט המיועד למקרה בו נעשה שימוש בקלט/פלט חופפים .

ישנם 4 מצבי פעולה מוגדרים, המשפיעים על אבטחת מנהל ההתקן -

# METHOD_IN_DIRECT : אימות אפשרות הקריאה מהחוצץ במצב משתמש.
# METHOD_OUT_DIRECT אימות אפשרות הכתיבה לחוצץ במצב משתמש.
# METHOD_NEITHER : כתובות וירטואליות מועברות למנהל ההתקן ללא מיפוי או אימות.
# METHOD_BUFFERED : חוצצים משותפים בשליטת IO Manager משמשים להעברת נתונים ממצב משתמש וממנו.

== חלופות ==
=== ממשקי קריאה אחרים ===
התקנים יכולים להיות מקושרים למרחב המשתמש על ידי קריאות מערכת נוספו, אם כי גישה זו אינה נפוצה. במערכות יוניקס, קיימים ממשקים נוספים בשימוש נפוץ, למשל fcntl (קיצור של "file control") ו - setsockopt (קיצור של "set socket option")

=== מיפוי זיכרון ===

;
: במערכות יוניקס, ממשקי התקנים ויכולות קלט/פלט ממומשים לעיתים באמצעות מיפוי זיכרון. ליישומים מוקצה מיקום בזיכרון המקושר לוגית למכשיר. ממשק זה הוא יעיל בהרבה לצורך העברת כמות גדולה של נתונים בין המכשיר למרחב המשתמש.
;

=== Netlink ===
Netlink הוא מנגנון לתקשורת בין תהליכים (IPC), שנועד להיות יורש ל ioctl ולספק גמישות רבה יותר.

== לקריאה נוספת ==
* וו. ריצ'רד סטיבנס,Advanced Programming in the UNIX Environment (Addison-Wesley, 1992, ), section 3.14.
* [https://www.gnu.org/s/libc/manual/html_node/IOCTLs.html פעולות כלליות של בקרת קלט/פלט] במדריך המקוון של ספריית GNU C
*
* [http://msdn2.microsoft.com/en-us/library/aa363216.aspx "תיעוד DeviceIoControl] ברשת המפתחים של Microsoft

 

קטגוריה:יוניקס