设备文件、ioctl、sysfs、netlink的用法区别

Con*_*ine 14 devices sysfs ioctl

我试图阐明哪种是在 Linux 中与设备交互的最有用(就功能而言)方法。据我了解,设备文件只公开了部分功能(块设备中的地址块,字符设备中的流等......)。 ioctl(2)似乎是最常用的,但有人说它不安全,等等。

一些好的文章或其他相关的指针将受到欢迎。

Ste*_*ris 9

ioctl往往与/dev条目齐头并进;你的典型代码会做

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
Run Code Online (Sandbox Code Playgroud)

这是完全标准的 Unix 行为。在内核驱动程序中,您可以放置​​访问控制(例如,只能root做一些事情,或者需要特定的能力来进行更细粒度的访问),这使得它非常灵活和强大。

当然,这意味着设备可以公开的不仅仅是使用块/字符读写活动;很多事情都可以通过ioctl调用来完成。从 shell 脚本中使用起来不是那么容易,但是从Cperlpython或类似的东西中使用起来却很容易。

sysfs条目是与驱动程序交互的另一种方式。通常,每种类型的命令都有不同的条目,因此编写驱动程序可能很复杂,但通过用户空间访问它非常容易;简单的 shell 脚本可以操作很多东西,但可能效率不高

netlink主要关注(我认为!)网络数据传输,但它可以用于其他东西。它非常适合大量数据传输,并且ioctl在某些情况下是继任者。

所有的选择都很好;您的用例可能会更好地确定从您的驱动程序公开哪种类型的接口。

  • 添加更多令人困惑的内容:" ioctl :但是,ioctl 在内核中已被弃用,您会发现很难让任何具有 ioctl 新用途的驱动程序被上游接受。内核维护人员不喜欢 ioctl,因为它使内核代码和应用程​​序代码过于相互依赖,并且很难在内核版本和体系结构中使它们保持同步。” [第 255 页]“掌握嵌入式 Linux 编程”作者:Chris Simmonds [2017]。 (2认同)