ความแตกต่างระหว่าง ioctl (), unlocked_ioctl () และ compat_ioctl () คืออะไร?


37

จะผ่านซอร์สโค้ด linux 2.6.36 ที่lxr.linux.noฉันไม่สามารถหาioctl()วิธีการfile_operationsได้ แต่ผมพบว่าสองสายใหม่และunlocked_ioctl() compat_ioctl()ความแตกต่างระหว่างคืออะไรioctl(), unlocked_ioctl()และcompat_ioctl()?

คำตอบ:


39

Meta คำตอบ: ทุกสิ่งที่เกิดขึ้นกับดิบเคอร์เนลผ่านไปlkml (ลินุกซ์เคอร์เนลรายการทางไปรษณีย์) สำหรับสรุป explicative อ่านหรือค้นหาLWN (Linux ข่าวรายสัปดาห์)

คำตอบ: จากวิธีการใหม่ของ ioctl ()โดยJonathan Corbet :

ioctl()เป็นหนึ่งในส่วนที่เหลือของเคอร์เนลซึ่งทำงานภายใต้ Big Kernel Lock (BKL) ในอดีตการใช้งานของ BKL ทำให้เป็นไปได้สำหรับioctl()วิธีที่ใช้เวลานานในการสร้างเวลาแฝงที่ยาวนานสำหรับกระบวนการที่ไม่เกี่ยวข้อง

ทำตามคำอธิบายของแพตช์ที่แนะนำunlocked_ioctlและนำcompat_ioctlไปสู่ ​​2.6.11 การลบioctlสนามเกิดขึ้นในภายหลังใน 2.6.36

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

compat_ioctlไม่เกี่ยวข้องจริง ๆ แล้วแม้ว่ามันจะถูกเพิ่มในเวลาเดียวกัน โดยมีวัตถุประสงค์คือเพื่อให้โปรแกรม userland แบบ 32 บิตสามารถioctlโทรบนเคอร์เนล 64 บิต ความหมายของอาร์กิวเมนต์สุดท้ายจะioctlขึ้นอยู่กับไดรเวอร์ดังนั้นจึงไม่มีวิธีที่จะทำการแปลงโดยไม่ขึ้นกับไดรเวอร์


1
ฉันถูกมองข้ามแหล่ง IOCTL ล่าสุดและเห็นว่า syscall ไม่กี่ตรวจสอบแล้วกระโดดที่นี่ คุณรู้หรือไม่ว่าฉันสามารถรวบรวมข้อมูลเพิ่มเติมเกี่ยวกับระบบ ioctl ได้จากที่ใด ฉันสนใจว่าคำสั่ง ioctl เกี่ยวกับไฟล์ตัวอักษรถูกส่งไปยังไดรเวอร์ที่เหมาะสมได้อย่างไร มันunlocked_ioctlเกิดขึ้นได้ไหม? ความจริงที่ว่ามีการใช้ตัวชี้ฟังก์ชันต่อไฟล์ (ในกรณีนี้กstruct file) ดูเหมือนว่าฉันอาจจะปิด มีการunlocked_ioctlลงทะเบียนสำหรับไฟล์ตัวอักษรเกี่ยวกับการเริ่มต้นไดรเวอร์mknodหรือไม่
sherrellbc

1
@sherrellbc ไดรเวอร์อุปกรณ์ลงทะเบียนวิธีการจัดการไฟล์เช่นunlocked_ioctlในstruct file_opsตอนที่เริ่มและจะมีการเติมข้อมูลจากstruct file_opsในวัตถุไฟล์เมื่อเปิดไฟล์ mknodไม่มีบทบาทในเรื่องนี้
Gilles 'SO- หยุดความชั่วร้าย'

ฉันเห็น. ฉันคิดว่าไดรเวอร์อุปกรณ์จะต้องmknodเปิดเผยส่วนต่อประสานผ่านอุปกรณ์ตัวอักษรก่อนที่จะเปลี่ยนเส้นทางการทำงานของไฟล์ที่เกี่ยวข้องไปยังตัวเอง (ผ่านunlocked_ioctl)
sherrellbc

4

มีหลายกรณีที่การแทนที่ (รวม / linux / fs.h) struct file_operations วิธี ioctl () เพื่อ compat_ioctl () ในเคอร์เนล 2.6.36 ไม่ทำงาน (เช่นสำหรับไดรเวอร์อุปกรณ์บางตัว) และ Unlocked_ioctl () จะต้องใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.