Linux驱动程序:ioctl还是sysfs?

时间:2016-11-10 13:53:58

标签: linux-device-driver ioctl sysfs

我正在编写驱动程序来控制某些自定义硬件。

在过去(即15年前),我使用ioctls执行此操作,但现在正在挖掘sysfs作为替代方案。

  • 据我了解,ioctls并未完全弃用,但首选sysfs(?)
  • 我需要同时读取/写入值集,即通过一个sysfs条目。我已经知道这不是理想的,但如果有必要可以接受(?)
  • 需要' mutex'保护驱动程序,以便一次只有一个应用程序可以写入它。 (我确实有一些只读的'信息条目,我希望所有人都可以随时访问这些条目。)

鉴于上述情况,最好的方法是什么 - ioctl或sysfs?

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

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

(这是一个私人'驱动程序,所以我不太关心;)但是如果新的方法更适用,那么我可能会抓住它们!)

感谢。

1 个答案:

答案 0 :(得分:17)

我会尝试至少部分回答你的问题。随意评论,让我扩展(或缩小!)

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