จะผ่านซอร์สโค้ด linux 2.6.36 ที่lxr.linux.noฉันไม่สามารถหาioctl()
วิธีการfile_operations
ได้ แต่ผมพบว่าสองสายใหม่และunlocked_ioctl()
compat_ioctl()
ความแตกต่างระหว่างคืออะไรioctl()
, unlocked_ioctl()
และcompat_ioctl()
?
จะผ่านซอร์สโค้ด linux 2.6.36 ที่lxr.linux.noฉันไม่สามารถหาioctl()
วิธีการfile_operations
ได้ แต่ผมพบว่าสองสายใหม่และunlocked_ioctl()
compat_ioctl()
ความแตกต่างระหว่างคืออะไรioctl()
, unlocked_ioctl()
และcompat_ioctl()
?
คำตอบ:
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
ขึ้นอยู่กับไดรเวอร์ดังนั้นจึงไม่มีวิธีที่จะทำการแปลงโดยไม่ขึ้นกับไดรเวอร์
unlocked_ioctl
ในstruct file_ops
ตอนที่เริ่มและจะมีการเติมข้อมูลจากstruct file_ops
ในวัตถุไฟล์เมื่อเปิดไฟล์ mknod
ไม่มีบทบาทในเรื่องนี้
mknod
เปิดเผยส่วนต่อประสานผ่านอุปกรณ์ตัวอักษรก่อนที่จะเปลี่ยนเส้นทางการทำงานของไฟล์ที่เกี่ยวข้องไปยังตัวเอง (ผ่านunlocked_ioctl
)
มีหลายกรณีที่การแทนที่ (รวม / linux / fs.h) struct file_operations วิธี ioctl () เพื่อ compat_ioctl () ในเคอร์เนล 2.6.36 ไม่ทำงาน (เช่นสำหรับไดรเวอร์อุปกรณ์บางตัว) และ Unlocked_ioctl () จะต้องใช้
unlocked_ioctl
เกิดขึ้นได้ไหม? ความจริงที่ว่ามีการใช้ตัวชี้ฟังก์ชันต่อไฟล์ (ในกรณีนี้กstruct file
) ดูเหมือนว่าฉันอาจจะปิด มีการunlocked_ioctl
ลงทะเบียนสำหรับไฟล์ตัวอักษรเกี่ยวกับการเริ่มต้นไดรเวอร์mknod
หรือไม่