ความแตกต่างในการใช้งานระหว่างไฟล์อุปกรณ์, ioctl, sysfs, netlink


12

ฉันพยายามที่จะชี้แจงว่าวิธีการโต้ตอบกับอุปกรณ์ใน Linux มีประโยชน์มากที่สุด (ในแง่ของการทำงาน) อย่างไร ดังที่ฉันเข้าใจแล้วไฟล์อุปกรณ์แสดงเพียงส่วนหนึ่งของการทำงาน (บล็อกที่อยู่ในอุปกรณ์บล็อกสตรีมในอุปกรณ์ตัวละคร ฯลฯ ... ) ioctl(2)ดูเหมือนจะใช้กันมากที่สุด แต่บางคนบอกว่าไม่ปลอดภัยและอื่น ๆ

ยินดีต้อนรับบทความดีๆหรือตัวชี้ที่เกี่ยวข้องอื่น ๆ

คำตอบ:


9

ioctlมีแนวโน้มที่จะไปจับมือกับ/devรายการ; รหัสทั่วไปของคุณจะทำ

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

นี่คือพฤติกรรม Unix มาตรฐานอย่างสมบูรณ์แบบ ภายในเคอร์เนลไดรเวอร์คุณสามารถใส่การควบคุมการเข้าถึง (เช่นrootสามารถทำบางสิ่งบางอย่างหรือต้องการความสามารถเฉพาะสำหรับการเข้าถึงที่ละเอียดยิ่งขึ้น) ซึ่งทำให้มีความยืดหยุ่นและทรงพลัง

แน่นอนว่านี่หมายความว่าอุปกรณ์สามารถเปิดเผยมากกว่าการใช้กิจกรรมการอ่าน / เขียนบล็อก / อักขระ หลายสิ่งสามารถทำได้ผ่านการioctlโทร ไม่ให้ใช้งานง่ายจากเชลล์สคริปต์ แต่สวยง่ายจากCหรือperlหรือpythonหรือคล้ายกัน

sysfsรายการเป็นอีกวิธีในการโต้ตอบกับไดรเวอร์ โดยทั่วไปแล้วคำสั่งแต่ละประเภทจะมีรายการที่แตกต่างกันดังนั้นจึงมีความซับซ้อนในการเขียนไดรเวอร์ แต่มันทำให้เข้าถึงได้ง่ายผ่าน userspace สคริปต์เชลล์แบบง่ายสามารถจัดการกับสิ่งต่างๆมากมาย แต่อาจไม่มีประสิทธิภาพมากนัก

netlinkส่วนใหญ่จะเน้น (ฉันคิดว่า!) ในการถ่ายโอนข้อมูลเครือข่าย แต่มันสามารถใช้สำหรับสิ่งอื่น ๆ เป็นเรื่องที่ดีมากสำหรับการถ่ายโอนข้อมูลจำนวนมากและตั้งใจจะเป็นผู้สืบทอดioctlในบางกรณี

ตัวเลือกทั้งหมดดี กรณีการใช้งานของคุณอาจกำหนดประเภทของอินเตอร์เฟซที่จะเปิดเผยจากไดรเวอร์ของคุณ


1
การเพิ่มความสับสนให้มากขึ้น: "ioctl: อย่างไรก็ตาม ioctl เลิกใช้แล้วในเคอร์เนลและคุณจะพบว่ามันยากที่จะได้รับไดรเวอร์ใด ๆ ที่มีการใช้งานใหม่ของ ioctl ที่ได้รับการยอมรับ upstream เคอร์เนลดูแลไม่ชอบ ioctl เพราะมันทำให้รหัสเคอร์เนล และมันก็ยากที่จะทำให้ทั้งคู่ก้าวข้ามรุ่นเคอร์เนลและสถาปัตยกรรม " [หน้า 255] "การเขียนโปรแกรม Linux ในตัวเครื่อง" โดย Chris Simmonds [2017]
Israr

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