2016-11-10 144 views
8

我正在写驱动程序来控制一些自定义硬件。Linux驱动程序:ioctl或sysfs?

在过去的日子里(即15年前),我用ioctls来做这件事,但现在我正在挖掘sysfs作为一种可能的选择。

  • 据我所知,读写控制不完全弃用,但sysfs中优选(?)
  • 我需要通过一个sysfs的条目读/写集同时即值。我读过这样的说法并不理想,但可以接受(?)
  • 驱动程序需要'mutex'保护,以便一次只能有一个应用程序写入。 (我确实有一些只读的'info'条目,我希望随时都可以访问这些条目)。

鉴于上述情况,最佳的处理方式是什么 - ioctl或sysfs?

如果是sysfs,那我该如何实现独占访问?

如果是sysfs,那么如果驱动程序没有读/写/ ioctl fops,它是否需要打开/释放?

(这是一个“私人”的驱动程序,所以我不关心大规模;)!,但想通如果新方法更适用话,我还不如去抓住他们)

感谢。

回答

8

我会尽力至少部分回答你的问题。欢迎发表评论我要问我扩大(或缩小!)

  • 首先,这几天读写控制不再被视为过时了,因为人们还没有找到他们所解决的问题更好的解决方案。尽管如此,人们希望更有纪律的定义ioctl接口,并且如果可能的话真实地表达他们将读写ioctl数字编码的内容。 ioctls和sysfs有不同的优势。
  • sysfs主要用于将设备的特定属性暴露给用户空间,特别是向控制台或shell脚本上的用户显示,并让这些属性或设备配置发生变化。单个sysfs文件通常映射到单个属性,并且通常可读(和/或可写)为简单的文本字符串。例如,它可能会暴露设备的当前电源管理状态(例如“关闭”),并让您使用“cat”shell命令编写新的电源管理状态。
  • sysfs确实没有绑定到一个打开/释放会话(你不应该实现这些来使用它),所以它可能只适合全局属性。如果用户只希望一次在设备上执行单一操作,但不会执行问题(因此可能不太适合您的“同时使用的数据集”,除非您将它们全部编码为一弦)。是的,你想要保护你的任何驱动程序数据,你将从你的sysfs处理程序使用互斥体访问,可能每个逻辑数据集有一个互斥量(或多个逻辑集)。
  • ioctl更适合在用户空间和驱动程序之间传递二进制信息,并且需要C程序或类似的程序才能使用它。自定义ioctls非常适合在内核中编写最小驱动程序,并将逻辑放入匹配的用户空间程序中。与sysfs不同,它不需要额外的逻辑来解释文本字符串 - 它可以直接从用户进程内存中读取和写入数据 - 这意味着不需要的代码,但也有更多的机会不彻底检查数据。
+0

感谢您的意见迈克尔。我认为你对这种权衡的看法与我的感觉相符, – ColH

+0

也许你可以“接受”答案,那么如果这对你来说似乎是合理的?谢谢。 – michaeljt