Linux驱动程序:ioctl还是sysfs?

Col*_*olH 13 ioctl linux-device-driver sysfs

我正在编写一个驱动程序来控制一些自定义硬件.

在过去(即15年前),我正在这样做ioctls,但现在正在挖掘sysfs作为一种可能的选择.

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

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

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

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

(这是一个'私人'司机,所以我不在乎大规模;)但是如果新的方式更适用,那么我可能会抓住它们!)

谢谢.

mic*_*ljt 19

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

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