设备文件,ioctl,sysfs,netlink之间的用法差异


12

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

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

Answers:


9

ioctl倾向于与/dev条目并驾齐驱;您的典型代码会做

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

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

当然,这意味着与使用块/字符读写活动相比,设备可以暴露更多的东西。许多事情可以通过ioctl电话来完成。从shell脚本使用起来不是那么容易,但是从Cor perlpythonor或类似的东西就很容易使用。

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

netlink(我认为!)主要集中在网络数据传输上,但也可以用于其他方面。这对于大量数据传输确实非常有用,并且ioctl在某些情况下可以替代它。

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


1
更令人困惑的是:“ ioctl:但是,ioctl在内核中已被弃用,您会发现很难在上游接受使用ioctl的新用途的任何驱动程序。内核维护者不喜欢ioctl,因为它使内核代码和应用程​​序代码过于相互依赖。 ,并且很难使它们在内核版本和体系结构之间保持同步。” [第255页]克里斯·西蒙兹(Chris Simmonds)的“掌握嵌入式Linux编程” [2017]。
Israr

这就提出了一个问题:那么我们可以从C中访问sysfs吗?
Israr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.