กลับไปหน้าบทความ

อ่าน 5 นาที

ไอโอคท์ล

ในด้านคอมพิวเตอร์(ioctlคำย่อของinput/output control ) คือการเรียกใช้ระบบ สำหรับการดำเนินการ อินพุต/เอาต์พุตเฉพาะอุปกรณ์และการดำเนินการอื่นๆ...

ไอโอคท์ล

ในด้านคอมพิวเตอร์(ioctlคำย่อของinput/output control ) คือการเรียกใช้ระบบ สำหรับการดำเนินการ อินพุต/เอาต์พุตเฉพาะอุปกรณ์และการดำเนินการอื่นๆ ที่ไม่สามารถแสดงได้ด้วยความหมายของไฟล์ทั่วไป เช่น การอ่าน/เขียน/ค้นหา การเรียกใช้ระบบนี้รับพารามิเตอร์ที่ระบุรหัสคำขอ ผลลัพธ์ของการเรียกใช้ขึ้นอยู่กับรหัสคำขออย่างสมบูรณ์ รหัสคำขอมักจะเฉพาะเจาะจงกับอุปกรณ์ ตัวอย่างเช่นไดรเวอร์อุปกรณ์ CD-ROM ที่สามารถสั่งให้อุปกรณ์จริงดีดแผ่นออก จะให้ioctlรหัสคำขอเพื่อทำเช่นนั้น บางครั้งมีการใช้รหัสคำขอที่ไม่ขึ้นกับอุปกรณ์เพื่อให้ผู้ใช้เข้าถึงฟังก์ชันเคอร์เนลซึ่งใช้เฉพาะในซอฟต์แวร์ระบบหลักหรือยังอยู่ระหว่างการพัฒนา

ระบบioctlเรียกใช้งานนี้ปรากฏครั้งแรกในUnix เวอร์ชัน 7ภายใต้ชื่อดังกล่าว ระบบนี้ได้รับการสนับสนุนโดยระบบ Unix และระบบที่คล้าย Unix ส่วนใหญ่ รวมถึง LinuxและmacOSแม้ว่ารหัสคำขอที่มีให้ใช้งานจะแตกต่างกันไปในแต่ละระบบก็ตามMicrosoft Windowsมีฟังก์ชันที่คล้ายกันชื่อ " " ในWin32 API ของ ตน DeviceIoControl

พื้นหลัง

ระบบปฏิบัติการทั่วไปสามารถแบ่งออกได้เป็นสองชั้น คือชั้นผู้ใช้ (userspace)และชั้นเคอร์เนล (kernel ) โค้ดแอปพลิเคชัน เช่นโปรแกรมแก้ไขข้อความจะอยู่ในพื้นที่ผู้ใช้ ในขณะที่ฟังก์ชันพื้นฐานของระบบปฏิบัติการ เช่นสแต็กเครือข่ายจะอยู่ในเคอร์เนล โค้ดเคอร์เนลจัดการทรัพยากรที่สำคัญและใช้กลไกการรักษาความปลอดภัยและความน่าเชื่อถือระหว่างแอปพลิเคชัน ด้วยเหตุนี้ ระบบปฏิบัติการจึงป้องกันไม่ให้แอปพลิเคชันในโหมดผู้ใช้เข้าถึงทรัพยากรเคอร์เนลโดยตรง

แอปพลิเคชันในพื้นที่ผู้ใช้โดยทั่วไปจะส่งคำขอไปยังเคอร์เนลโดยใช้การเรียกใช้ระบบ (system call) ซึ่งโค้ดของการเรียกใช้ระบบนั้นอยู่ในเลเยอร์เคอร์เนล การเรียกใช้ระบบมักอยู่ในรูปแบบของ "เวกเตอร์การเรียกใช้ระบบ" (system call vector) ซึ่งระบุการเรียกใช้ระบบที่ต้องการด้วยหมายเลขดัชนี ตัวอย่างเช่นexit()อาจเป็นการเรียกใช้ระบบหมายเลข 1 และwrite()หมายเลข 4 จากนั้นจะใช้เวกเตอร์การเรียกใช้ระบบเพื่อค้นหาฟังก์ชันเคอร์เนลที่ต้องการสำหรับคำขอ ด้วยวิธีนี้ ระบบปฏิบัติการทั่วไปจึงมักให้การเรียกใช้ระบบหลายร้อยรายการแก่พื้นที่ผู้ใช้

แม้ว่าการเรียกใช้ระบบ (system calls) จะเป็นการออกแบบที่สะดวกสำหรับการเข้าถึงฟังก์ชันมาตรฐานของเคอร์เนล แต่บางครั้งก็ไม่เหมาะสมสำหรับการเข้าถึงอุปกรณ์ต่อพ่วงฮาร์ดแวร์ที่ไม่เป็นมาตรฐาน โดยจำเป็นแล้ว อุปกรณ์ต่อพ่วงฮาร์ดแวร์ส่วนใหญ่ (หรือที่เรียกว่าอุปกรณ์) สามารถเข้าถึงได้โดยตรงเฉพาะภายในเคอร์เนลเท่านั้น แต่โค้ดของผู้ใช้อาจจำเป็นต้องสื่อสารโดยตรงกับอุปกรณ์ ตัวอย่างเช่น ผู้ดูแลระบบอาจกำหนดค่าประเภทสื่อบน อินเทอร์เฟ ซอีเธอร์เน็ตระบบปฏิบัติการสมัยใหม่รองรับอุปกรณ์ที่หลากหลาย ซึ่งหลายชนิดมีฟังก์ชันการทำงานมากมาย ฟังก์ชันบางอย่างเหล่านี้อาจไม่ได้ถูกคาดการณ์ไว้โดยนักออกแบบเคอร์เนล และด้วยเหตุนี้จึงเป็นเรื่องยากสำหรับเคอร์เนลที่จะจัดเตรียมการเรียกใช้ระบบสำหรับการใช้งานอุปกรณ์เหล่านั้น

เพื่อแก้ปัญหานี้ เคอร์เนลจึงถูกออกแบบให้สามารถขยายได้ และอาจยอมรับโมดูลเพิ่มเติมที่เรียกว่าไดรเวอร์อุปกรณ์ซึ่งทำงานในพื้นที่เคอร์เนลและสามารถเข้าถึงอุปกรณ์ได้โดยตรงioctlอินเทอร์เฟซคือการเรียกใช้ระบบเพียงครั้งเดียวที่พื้นที่ผู้ใช้สามารถสื่อสารกับไดรเวอร์อุปกรณ์ได้ คำขอไปยังไดรเวอร์อุปกรณ์จะถูกกำหนดทิศทางโดยสัมพันธ์กับioctlการเรียกใช้ระบบนี้ โดยทั่วไปจะใช้ตัวจัดการไปยังอุปกรณ์และหมายเลขคำขอ ดังนั้น เคอร์เนลพื้นฐานจึงสามารถอนุญาตให้พื้นที่ผู้ใช้เข้าถึงไดรเวอร์อุปกรณ์ได้โดยไม่ต้องรู้ข้อมูลใดๆ เกี่ยวกับฟังก์ชันที่อุปกรณ์รองรับ และไม่ต้องใช้ชุดการเรียกใช้ระบบขนาดใหญ่ที่จัดการได้ยาก

การใช้งาน

การกำหนดค่าอุปกรณ์ฮาร์ดแวร์

การใช้งานทั่วไปอย่างหนึ่งioctlคือการควบคุมอุปกรณ์ฮาร์ดแวร์

ตัวอย่างเช่น ในระบบWin32ioctlฟังก์ชันต่างๆ สามารถสื่อสารกับ อุปกรณ์ USBหรือสามารถค้นหาข้อมูลโครงสร้างไดรฟ์ของอุปกรณ์จัดเก็บข้อมูลที่เชื่อมต่ออยู่ได้

บนOpenBSDและNetBSDจะioctlใช้โดยbio(4)ไดรเวอร์อุปกรณ์เสมือนและbioctlยูทิลิตี้เพื่อใช้งาน การจัดการวอลุ่ม RAIDในอินเทอร์เฟซที่เป็นหนึ่งเดียวที่ไม่ขึ้นกับผู้จำหน่าย คล้ายกับifconfig [ 1 ] [ 2 ]

บนNetBSDเฟรมเวิร์กนี้ยังioctlถูกใช้ด้วย[ 3 ]sysmon

เทอร์มินัล

การใช้งานอย่างหนึ่งioctlในโค้ดที่เปิดเผยต่อแอปพลิเคชันของผู้ใช้ปลายทางคือ การรับส่งข้อมูลผ่านเทอร์มินัล (Terminal I/O)

ระบบปฏิบัติการ Unixได้ใช้ประโยชน์จากอินเทอร์เฟซบรรทัดคำสั่ง อย่างมากมาโดยตลอด โดยเริ่มแรกใช้เทอร์มินัลข้อความฮาร์ดแวร์ เช่นVT100ที่เชื่อมต่อกับพอร์ตอนุกรมและต่อมา ใช้โปรแกรม จำลองเทอร์มินัลและเซิร์ฟเวอร์เข้าสู่ระบบระยะไกล โดยใช้เทอร์มินัล เสมือนอุปกรณ์พอร์ตอนุกรมและเทอร์มินัลเสมือนต่างก็ถูกควบคุมและกำหนดค่าโดยใช้ioctlการเรียก ตัวอย่างเช่น ขนาดการแสดงผลจะถูกตั้งค่าโดยใช้TIOCSWINSZการเรียก ฟังก์ชัน ioctl ของ TIOCSTI (การควบคุม I/O ของเทอร์มินัล จำลองอินพุตของเทอร์มินัล) สามารถผลักอักขระเข้าไปในสตรีมของอุปกรณ์ได้[ 4 ]

ส่วนขยายเคอร์เนล

เมื่อแอปพลิเคชันจำเป็นต้องขยายเคอร์เนล เช่น เพื่อเร่งความเร็วในการประมวลผลเครือข่ายioctlการเรียกใช้ฟังก์ชัน (system calls) จะเป็นวิธีที่สะดวกในการเชื่อมต่อโค้ด ใน พื้นที่ผู้ใช้ กับส่วนขยายของเคอร์เนล ส่วนขยายของเคอร์เนลสามารถระบุตำแหน่งในระบบไฟล์ที่สามารถเปิดได้ด้วยชื่อ ซึ่งioctlสามารถส่งการเรียกใช้ฟังก์ชันจำนวนมากได้ ทำให้สามารถเขียนโปรแกรมส่วนขยายได้โดยไม่ต้องเพิ่มการเรียกใช้ฟังก์ชันระบบลงในระบบปฏิบัติการ

ทางเลือกอื่นของ sysctl

ตามที่นักพัฒนาOpenBSDioctl ระบุ และsysctlเป็นการเรียกใช้ระบบ สองรายการ สำหรับการขยายเคอร์เนล โดยsysctlอาจเป็นรายการที่ง่ายกว่าในสองรายการนี้[ 5 ]

ในNetBSDเฟรมsysmon_envsysเวิร์กสำหรับการตรวจสอบฮาร์ดแวร์ใช้ioctlผ่านproplib; ในขณะที่OpenBSDและDragonFly BSDใช้แทนsysctlสำหรับhw.sensorsเฟรมเวิร์กที่เกี่ยวข้อง การแก้ไขครั้งแรกของenvsysใน NetBSD ถูกนำไปใช้กับioctlก่อนที่proplibจะพร้อมใช้งาน และมีข้อความแนะนำว่าเฟรมเวิร์กนี้เป็นแบบทดลอง และควรถูกแทนที่ด้วยsysctl(8)อินเทอร์เฟซ หากมีการพัฒนา[ 6 ] [ 7 ]ซึ่งอาจอธิบายถึงการเลือกใช้sysctlใน OpenBSD พร้อมกับการแนะนำในภายหลังhw.sensorsในปี 2003 อย่างไรก็ตาม เมื่อenvsysเฟรมเวิร์กได้รับการออกแบบใหม่ในปี 2007 ประมาณproplibระบบการเรียกใช้ยังคงเป็นioctlและข้อความถูกลบออก[ 8 ]

การนำไปใช้

ยูนิกซ์

การioctlเรียกใช้ระบบปรากฏครั้งแรกในUnix เวอร์ชัน 7โดยใช้แทน การเรียกใช้ระบบ stty[ 9 ]และgttyโดยมีอาร์กิวเมนต์รหัสคำขอเพิ่มเติม การเรียกใช้จะรับ พารามิเตอร์ioctlดังนี้:

  1. ตัวระบุไฟล์ที่เปิดอยู่
  2. หมายเลขรหัสคำขอ
  3. ตัวชี้ที่ไม่มีประเภทข้อมูลไปยังข้อมูล (ไม่ว่าจะส่งไปยังไดรเวอร์ รับกลับมาจากไดรเวอร์ หรือทั้งสองอย่าง)

โดยทั่วไป เคอร์เนลจะส่งคำขอไปioctlยังไดรเวอร์อุปกรณ์โดยตรง ซึ่งไดรเวอร์จะตีความหมายเลขคำขอและข้อมูลในรูปแบบใดก็ตามที่ต้องการ ผู้เขียนไดรเวอร์แต่ละตัวจะบันทึกหมายเลขคำขอสำหรับไดรเวอร์นั้นๆ และระบุเป็นค่าคงที่ในไฟล์ส่วนหัว

หมายเลขคำขอโดยทั่วไปจะประกอบด้วยรหัสที่ระบุอุปกรณ์หรือกลุ่มอุปกรณ์ที่ต้องการส่งคำขอ และหมายเลขที่ระบุคำขอเฉพาะนั้น โดยรหัสที่ระบุอุปกรณ์หรือกลุ่มอุปกรณ์มักจะเป็นอักขระ ASCII ตัวเดียว ระบบ Unix บางระบบ รวมถึง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ดังกล่าว หากมีการใช้I/O ที่ซ้อนทับกัน

โค้ดควบคุมอุปกรณ์ Win32 จะพิจารณาโหมดการทำงานที่กำลังดำเนินการอยู่

มีโหมดการทำงานที่กำหนดไว้ 4 โหมด ซึ่งส่งผลต่อความปลอดภัยของไดรเวอร์อุปกรณ์ -

  1. METHOD_IN_DIRECT: ตรวจสอบแล้วว่าที่อยู่บัฟเฟอร์นั้นสามารถอ่านได้โดยผู้เรียกใช้งานในโหมดผู้ใช้
  2. METHOD_OUT_DIRECT: ผู้เรียกใช้งานในโหมดผู้ใช้ได้ตรวจสอบแล้วว่าที่อยู่บัฟเฟอร์นั้นสามารถเขียนได้
  3. METHOD_NEITHERที่อยู่เสมือนในโหมดผู้ใช้จะถูกส่งไปยังไดรเวอร์โดยไม่มีการแมปหรือตรวจสอบความถูกต้อง
  4. METHOD_BUFFERED: บัฟเฟอร์ที่ใช้ร่วมกันซึ่งควบคุมโดย IO Manager จะถูกใช้เพื่อย้ายข้อมูลเข้าและออกจากโหมดผู้ใช้

ทางเลือกอื่นๆ

อินเทอร์เฟซการโทรแบบเวกเตอร์อื่นๆ

อุปกรณ์และส่วนขยายเคอร์เนลอาจเชื่อมโยงกับพื้นที่ผู้ใช้โดยใช้การเรียกใช้ระบบใหม่เพิ่มเติม แม้ว่าวิธีการนี้จะไม่ค่อยได้ใช้ เนื่องจากนักพัฒนาซอฟต์แวร์ระบบปฏิบัติการพยายามรักษาอินเทอร์เฟซการเรียกใช้ระบบให้มีความกระชับและมีประสิทธิภาพ

ในระบบปฏิบัติการ Unix อินเทอร์เฟซการเรียกแบบเวกเตอร์อีกสองแบบที่นิยมใช้ ได้แก่fcntlการเรียกแบบระบบ ("ควบคุมไฟล์") ซึ่งใช้ในการกำหนดค่าไฟล์ที่เปิดอยู่ และใช้ในสถานการณ์ต่างๆ เช่น การเปิดใช้ งาน I/O แบบไม่บล็อกและ การเรียกแบบระบบ ("ตั้งค่าตัวเลือกซ็อกเก็ต") ซึ่งใช้ในการกำหนดค่า ซ็อกเก็ตเครือข่ายsetsockoptที่เปิดอยู่ซึ่งเป็นฟังก์ชันที่ใช้ในการกำหนดค่าไฟร์วอลล์แพ็กเก็ตบน ระบบ BSD Unix ipfw

การแมปหน่วยความจำ

ยูนิกซ์
บางครั้งอินเทอร์เฟซของอุปกรณ์และความสามารถในการรับส่งข้อมูลจะถูกจัดเตรียมโดยใช้ไฟล์ที่แมปกับหน่วยความจำแอปพลิเคชันที่โต้ตอบกับอุปกรณ์จะเปิดตำแหน่งบนระบบไฟล์ที่สอดคล้องกับอุปกรณ์ เช่นเดียวกับการioctlเรียกใช้ฟังก์ชัน แต่จากนั้นจะใช้การเรียกใช้ระบบแบบแมปหน่วยความจำเพื่อเชื่อมโยงส่วนหนึ่งของพื้นที่แอดเดรสเข้ากับพื้นที่แอดเดรสของเคอร์เนล อินเทอร์เฟซนี้เป็นวิธีที่มีประสิทธิภาพมากกว่ามากในการถ่ายโอนข้อมูลจำนวนมากระหว่างอุปกรณ์และแอปพลิเคชันในพื้นที่ผู้ใช้ioctlการเรียกใช้ระบบแบบรายบุคคลหรือแบบอ่าน/เขียนจะทำให้เกิดภาระเพิ่มเติมเนื่องจากการเปลี่ยนผ่านจากพื้นที่ผู้ใช้ไปยังเคอร์เนลซ้ำๆ ในขณะที่การเข้าถึงช่วงแอดเดรสที่แมปกับหน่วยความจำจะไม่ก่อให้เกิดภาระเพิ่มเติมดังกล่าว
วิน32
สามารถใช้วิธีการ I/O แบบบัฟเฟอร์หรือออบเจ็กต์การแมปไฟล์แบบระบุชื่อได้ อย่างไรก็ตาม สำหรับไดรเวอร์อุปกรณ์แบบง่ายDeviceIoControl METHOD_การเข้าถึงแบบมาตรฐานก็เพียงพอแล้ว

Netlinkเป็นกลไกคล้ายซ็อกเก็ตสำหรับการสื่อสารระหว่างกระบวนการ (IPC) ซึ่งได้รับการออกแบบให้มีความยืดหยุ่นมากกว่ารุ่นก่อนioctlหน้า

ผลกระทบ

ความซับซ้อน

ioctlการเรียกใช้ฟังก์ชัน ioctl ช่วยลดความซับซ้อนของอินเทอร์เฟซการเรียกใช้ระบบของเคอร์เนล อย่างไรก็ตาม การที่ฟังก์ชัน ioctl เปิดโอกาสให้ผู้พัฒนา "เก็บ" ชิ้นส่วนต่างๆ ของอินเทอร์เฟซการเขียนโปรแกรมของเคอร์เนลioctlทำให้ API ระหว่างผู้ใช้กับเคอร์เนลโดยรวมมีความซับซ้อนมากขึ้น เคอร์เนลที่มีการเรียกใช้ระบบหลายร้อยรายการ อาจมีฟังก์ชัน ioctl หลายพันรายการ

แม้ว่าอินเทอร์เฟซสำหรับ การเรียกใช้ฟังก์ชันจะดูแตกต่างจากการเรียกใช้ระบบทั่วไปอยู่บ้าง แต่ในทางปฏิบัติแล้ว การเรียกใช้ฟังก์ชันและการเรียกใช้ระบบนั้น แทบ ioctlไม่มีความแตกต่างกันเลย การเรียกใช้ฟังก์ชันก็คือการเรียกใช้ระบบที่มีกลไกการส่งต่อที่แตกต่างกันเท่านั้น ดังนั้น ข้อโต้แย้งหลายข้อเกี่ยวกับการขยายอินเทอร์เฟซการเรียกใช้ระบบของเคอร์เนลจึงสามารถนำไปใช้กับอินเทอร์เฟซ อื่นๆ ได้เช่นกันioctlioctlioctl

สำหรับนักพัฒนาแอปพลิเคชัน การเรียกใช้ระบบ (system calls) ดูไม่แตกต่างจากซับรูทีนของแอปพลิเคชัน พวกมันเป็นเพียงการเรียกใช้ฟังก์ชันที่รับอาร์กิวเมนต์และส่งคืนค่าเท่านั้น ไลบรารีหลัก (เช่นlibc) จะซ่อนความซับซ้อนที่เกี่ยวข้องกับการเรียกใช้ระบบไว้ เช่นเดียวกับioctlซึ่งอินเทอร์เฟซไดรเวอร์มักมาพร้อมกับไลบรารีในพื้นที่ผู้ใช้ (เช่นMesaสำหรับโครงสร้างพื้นฐานการเรนเดอร์โดยตรงของไดรเวอร์กราฟิก)

Libpcapและlibdnetเป็นตัวอย่างของไลบรารี Unix จากภายนอกที่ออกแบบมาเพื่อลดความซับซ้อนของioctlอินเทอร์เฟซ สำหรับการจับแพ็กเก็ตและการรับส่งข้อมูลแพ็กเก็ต ตามลำดับ

ความปลอดภัย

ในการออกแบบแบบดั้งเดิม เคอร์เนลจะอยู่ในวงแหวนที่ 0แยกจากไดรเวอร์อุปกรณ์ในวงแหวนที่ 1 และในไมโครเคอร์เนลซึ่งแยกจากกันเองด้วย แต่ปัจจุบันได้มีการยกเลิกรูปแบบนี้ไปแล้ว เนื่องจากเป็นการเพิ่มภาระในการเปลี่ยนผ่านระหว่างวงแหวนให้กับอินเทอร์เฟซไดรเวอร์/เคอร์เนล เช่นเดียวกับที่ซิสคอลสร้างภาระให้กับอินเทอร์เฟซเคอร์เนล/พื้นที่ผู้ใช้ ซึ่งนำไปสู่ข้อกำหนดที่ยากต่อการปฏิบัติจริง คือ ไดรเวอร์ทั้งหมด ซึ่งปัจจุบันอยู่ในวงแหวนที่ 0 เช่นกัน จะต้องรักษาความปลอดภัยในระดับเดียวกับแกนหลักของเคอร์เนล

แม้ว่าอินเทอร์เฟซระหว่างผู้ใช้กับเคอร์เนลของระบบปฏิบัติการหลักมักได้รับการตรวจสอบอย่างเข้มงวดเพื่อหาข้อบกพร่องของโค้ดและช่องโหว่ด้านความปลอดภัยก่อนการวางจำหน่าย แต่การตรวจสอบเหล่านี้มักมุ่งเน้นไปที่อินเทอร์เฟซการเรียกใช้ระบบที่มีการบันทึกไว้อย่างดี ตัวอย่างเช่น ผู้ตรวจสอบอาจตรวจสอบให้แน่ใจว่าการเรียกใช้ด้านความปลอดภัยที่ละเอียดอ่อน เช่น การเปลี่ยนรหัสผู้ใช้ จะมีให้เฉพาะผู้ดูแลระบบเท่านั้น เนื่องจากตัวจัดการสำหรับioctlการเรียกใช้ก็อยู่ในวงแหวนที่ 0 โดยตรงเช่นกัน อินพุตจากพื้นที่ผู้ใช้จึงควรได้รับการตรวจสอบอย่างระมัดระวังเช่นกัน เนื่องจากช่องโหว่ในไดรเวอร์อุปกรณ์สามารถถูกใช้ประโยชน์โดยผู้ใช้ในพื้นที่ เช่น โดยการส่งบัฟเฟอร์ที่ไม่ถูกต้องไปยังioctlการเรียกใช้ ในทางปฏิบัติแล้ว นี่ไม่ใช่กรณีดังกล่าวioctlอินเทอร์เฟซมีขนาดใหญ่กว่า หลากหลายกว่า และไม่ชัดเจนนัก ดังนั้นจึงตรวจสอบได้ยากกว่าการเรียกใช้ระบบ นอกจากนี้ เนื่องจากioctlนักพัฒนาบุคคลที่สามสามารถจัดหาการเรียกใช้ได้ ซึ่งมักจะเกิดขึ้นหลังจากที่ระบบปฏิบัติการหลักได้รับการเผยแพร่แล้วioctlการใช้งานการเรียกใช้จึงอาจได้รับการตรวจสอบน้อยกว่าและจึงมีช่องโหว่มากกว่า สุดท้าย การเรียกใช้บางอย่างioctlโดยเฉพาะอย่างยิ่งสำหรับไดรเวอร์อุปกรณ์ของบุคคลที่สาม อาจไม่มีการบันทึกไว้เลย

มีการสร้างวิธีแก้ไขปัญหาต่างๆ มากมาย โดยมีเป้าหมายเพื่อให้ได้ระดับความปลอดภัยที่เทียบเท่ากับเดิม ในขณะที่ยังคงรักษาความเร็วที่ได้รับไว้ ระบบปฏิบัติการ Win32และUnixสามารถปกป้องชื่ออุปกรณ์ในพื้นที่ผู้ใช้จากการเข้าถึงโดยแอปพลิเคชันต่างๆ ด้วยการควบคุมการเข้าถึงเฉพาะที่ใช้กับอุปกรณ์นั้น ปัญหาด้านความปลอดภัยอาจเกิดขึ้นได้เมื่อนักพัฒนาไดรเวอร์อุปกรณ์ไม่ได้ใช้การควบคุมการเข้าถึงที่เหมาะสมกับวัตถุที่สามารถเข้าถึงได้ในพื้นที่ผู้ใช้ ระบบปฏิบัติการสมัยใหม่บางระบบปกป้องเคอร์เนลจากโค้ดในพื้นที่ผู้ใช้ที่เป็นอันตราย (เช่น แอปพลิเคชันที่ติดไวรัสจาก การโจมตี แบบ buffer overflow ) โดยใช้system call wrappers System call wrappers ใช้การควบคุมการเข้าถึงตามบทบาทโดยระบุว่า system call ใดสามารถเรียกใช้ได้โดยแอปพลิเคชันใด ตัวอย่างเช่น wrappers สามารถใช้เพื่อ "เพิกถอน" สิทธิ์ของโปรแกรมอีเมลในการเรียกใช้โปรแกรมอื่นๆioctlอินเทอร์เฟซทำให้ system call wrappers ซับซ้อนขึ้นเนื่องจากมีจำนวนมาก โดยแต่ละอินเทอร์เฟซรับอาร์กิวเมนต์ที่แตกต่างกัน ซึ่งบางส่วนอาจจำเป็นสำหรับโปรแกรมทั่วไป นอกจากนี้ วิธีแก้ปัญหาดังกล่าวทำให้การลดโอเวอร์เฮดที่ได้รับนั้นหมดไป

อ่านเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Ioctl&oldid=1338008025 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ไอโอคท์ล

ในด้านคอมพิวเตอร์(ioctlคำย่อของinput/output control ) คือการเรียกใช้ระบบ สำหรับการดำเนินการ อินพุต/เอาต์พุตเฉพาะอุปกรณ์และการดำเนินการอื่นๆ...

พื้นหลัง

ระบบปฏิบัติการทั่วไปสามารถแบ่งออกได้เป็นสองชั้น คือ ชั้นผู้ใช้ (userspace) และ ชั้นเคอร์เนล (kernel ) โค้ดแอปพลิเคชัน เช่น โปรแกรมแก้ไขข้อความ จะอยู่ในพื้นที่ผู้ใช้ ในขณะที่ฟังก์ชันพื้นฐานของระบบปฏิบัติการ เช่น สแต็กเครือข่าย จะอยู่ในเคอร์เนล...

การกำหนดค่าอุปกรณ์ฮาร์ดแวร์

การใช้งานทั่วไปอย่างหนึ่ง ioctl คือการควบคุมอุปกรณ์ฮาร์ดแวร์

เทอร์มินัล

การใช้งานอย่างหนึ่ง ioctl ในโค้ดที่เปิดเผยต่อแอปพลิเคชันของผู้ใช้ปลายทางคือ การรับส่งข้อมูลผ่านเทอร์มินัล (Terminal I/O)