อ่าน 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ดังนี้:
- ตัวระบุไฟล์ที่เปิดอยู่
- หมายเลขรหัสคำขอ
- ตัวชี้ที่ไม่มีประเภทข้อมูลไปยังข้อมูล (ไม่ว่าจะส่งไปยังไดรเวอร์ รับกลับมาจากไดรเวอร์ หรือทั้งสองอย่าง)
โดยทั่วไป เคอร์เนลจะส่งคำขอไปioctlยังไดรเวอร์อุปกรณ์โดยตรง ซึ่งไดรเวอร์จะตีความหมายเลขคำขอและข้อมูลในรูปแบบใดก็ตามที่ต้องการ ผู้เขียนไดรเวอร์แต่ละตัวจะบันทึกหมายเลขคำขอสำหรับไดรเวอร์นั้นๆ และระบุเป็นค่าคงที่ในไฟล์ส่วนหัว
หมายเลขคำขอโดยทั่วไปจะประกอบด้วยรหัสที่ระบุอุปกรณ์หรือกลุ่มอุปกรณ์ที่ต้องการส่งคำขอ และหมายเลขที่ระบุคำขอเฉพาะนั้น โดยรหัสที่ระบุอุปกรณ์หรือกลุ่มอุปกรณ์มักจะเป็นอักขระ ASCII ตัวเดียว ระบบ Unix บางระบบ รวมถึง4.2BSDและBSD รุ่นต่อมา ระบบปฏิบัติการที่พัฒนามาจากรุ่นเหล่านั้น และLinuxมีข้อกำหนดที่เข้ารหัสขนาดของข้อมูลที่จะถ่ายโอนไปยัง/จากไดรเวอร์อุปกรณ์และทิศทางการถ่ายโอนข้อมูลไว้ในหมายเลขคำขอด้วย ไม่ว่าจะมีข้อกำหนดดังกล่าวหรือไม่ก็ตาม เคอร์เนลและไดรเวอร์จะทำงานร่วมกันเพื่อส่งรหัสข้อผิดพลาดที่เป็นมาตรฐาน (แทนด้วยค่าคงที่เชิงสัญลักษณ์ENOTTY) ไปยังแอปพลิเคชันที่ส่งคำขอไปยังไดรเวอร์ที่ไม่รู้จักแอป พลิเคชันนั้น
ตัวช่วยจำENOTTY(โดยทั่วไปมักเกี่ยวข้องกับข้อความ " ไม่ใช่เครื่องพิมพ์ดีด ") มาจากระบบแรกเริ่มที่ใช้ioctlการโทร ซึ่งมีเพียง อุปกรณ์ เทเลไทป์ ( tty) เท่านั้นที่แสดงข้อผิดพลาดนี้ แม้ว่าตัวช่วยจำเชิงสัญลักษณ์จะถูกกำหนดโดยข้อกำหนดด้านความเข้ากันได้ แต่ระบบสมัยใหม่บางระบบก็แสดงข้อความทั่วไปที่เป็นประโยชน์มากกว่า เช่น " การควบคุมอุปกรณ์ที่ไม่เหมาะสม " (หรือข้อความในทำนองเดียวกัน)
TCSETSตัวอย่างนี้คือioctlการเรียกใช้งานพอร์ตอนุกรมการเรียกใช้งานการอ่านและการเขียนตามปกติบนพอร์ตอนุกรมจะรับและส่งข้อมูลไบต์ การเรียกใช้งาน ซึ่งแยกต่างหากจากการรับส่งข้อมูลปกติเหล่านั้น จะควบคุมตัวเลือกต่างๆ ของไดรเวอร์ เช่น การจัดการ อักขระioctl(fd,TCSETS,data)พิเศษหรือสัญญาณเอาต์พุตบนพอร์ต (เช่น สัญญาณ DTR )
วิน32
Win32 DeviceIoControlรับพารามิเตอร์ดังนี้:
- ตัวจัดการวัตถุที่เปิดอยู่ (เทียบเท่ากับตัวระบุไฟล์ในระบบ Win32)
- รหัสคำขอ ("รหัสควบคุม")
- บัฟเฟอร์สำหรับพารามิเตอร์อินพุต
- ความยาวของบัฟเฟอร์อินพุต
- บัฟเฟอร์สำหรับผลลัพธ์ที่ได้
- ความยาวของบัฟเฟอร์เอาต์พุต
- โครงสร้าง
OVERLAPPEDดังกล่าว หากมีการใช้I/O ที่ซ้อนทับกัน
โค้ดควบคุมอุปกรณ์ Win32 จะพิจารณาโหมดการทำงานที่กำลังดำเนินการอยู่
มีโหมดการทำงานที่กำหนดไว้ 4 โหมด ซึ่งส่งผลต่อความปลอดภัยของไดรเวอร์อุปกรณ์ -
METHOD_IN_DIRECT: ตรวจสอบแล้วว่าที่อยู่บัฟเฟอร์นั้นสามารถอ่านได้โดยผู้เรียกใช้งานในโหมดผู้ใช้METHOD_OUT_DIRECT: ผู้เรียกใช้งานในโหมดผู้ใช้ได้ตรวจสอบแล้วว่าที่อยู่บัฟเฟอร์นั้นสามารถเขียนได้METHOD_NEITHERที่อยู่เสมือนในโหมดผู้ใช้จะถูกส่งไปยังไดรเวอร์โดยไม่มีการแมปหรือตรวจสอบความถูกต้อง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 ซับซ้อนขึ้นเนื่องจากมีจำนวนมาก โดยแต่ละอินเทอร์เฟซรับอาร์กิวเมนต์ที่แตกต่างกัน ซึ่งบางส่วนอาจจำเป็นสำหรับโปรแกรมทั่วไป นอกจากนี้ วิธีแก้ปัญหาดังกล่าวทำให้การลดโอเวอร์เฮดที่ได้รับนั้นหมดไป
อ่านเพิ่มเติม
- W. Richard Stevens , การเขียนโปรแกรมขั้นสูงในสภาพแวดล้อม UNIX (Addison-Wesley, 1992, ISBN) 0-201-56317-7), มาตรา 3.14.
- การดำเนินการควบคุมอินพุต/เอาต์พุตทั่วไปในคู่มือออนไลน์สำหรับไลบรารี GNU C
- – คู่มือโปรแกรมเมอร์Unix เวอร์ชัน 7
- – คู่มือโปรแกรมเมอร์ลินุกซ์ – การเรียกใช้ระบบ (System Calls)
- – คู่มือการเรียกใช้ระบบของFreeBSD
- – คู่มือการเรียกใช้ระบบของOpenBSD
- – คู่มืออ้างอิงการเรียกใช้ระบบของSolaris 11.4
- "เอกสารประกอบการใช้งาน DeviceIoControlบนเครือข่ายนักพัฒนาของ Microsoft "
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ไอโอคท์ล
ในด้านคอมพิวเตอร์(ioctlคำย่อของinput/output control ) คือการเรียกใช้ระบบ สำหรับการดำเนินการ อินพุต/เอาต์พุตเฉพาะอุปกรณ์และการดำเนินการอื่นๆ...
พื้นหลัง
ระบบปฏิบัติการทั่วไปสามารถแบ่งออกได้เป็นสองชั้น คือ ชั้นผู้ใช้ (userspace) และ ชั้นเคอร์เนล (kernel ) โค้ดแอปพลิเคชัน เช่น โปรแกรมแก้ไขข้อความ จะอยู่ในพื้นที่ผู้ใช้ ในขณะที่ฟังก์ชันพื้นฐานของระบบปฏิบัติการ เช่น สแต็กเครือข่าย จะอยู่ในเคอร์เนล...
การกำหนดค่าอุปกรณ์ฮาร์ดแวร์
การใช้งานทั่วไปอย่างหนึ่ง ioctl คือการควบคุมอุปกรณ์ฮาร์ดแวร์
เทอร์มินัล
การใช้งานอย่างหนึ่ง ioctl ในโค้ดที่เปิดเผยต่อแอปพลิเคชันของผู้ใช้ปลายทางคือ การรับส่งข้อมูลผ่านเทอร์มินัล (Terminal I/O)