Linux 驱动程序:ioctl 还是 sysfs?

Posted

技术标签:

【中文标题】Linux 驱动程序:ioctl 还是 sysfs?【英文标题】:Linux driver: ioctl or sysfs? 【发布时间】:2016-11-10 13:53:57 【问题描述】:

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

在过去(即 15 年前)我使用 ioctls 进行此操作,但现在我正在研究 sysfs 作为可能的替代方案。

据我了解,ioctl 并未完全弃用,但首选 sysfs (?) 我需要同时读取/写入一组值,即通过一个 sysfs 条目。我读到这并不理想,但如有必要是可以接受的 (?) 驱动程序需要有“mutex”保护,这样一次只能有一个应用程序对其进行写入。 (我确实有一些只读的“信息”条目,我希望所有人都可以随时访问)。

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

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

如果是sysfs,那么如果驱动没有read/write/ioctl fops,是否需要open/release?!

(这是一个“私人”驱动程序,所以我不太在意;),但我想如果新方法更适用,那么我不妨掌握它们!)

谢谢。

【问题讨论】:

【参考方案1】:

我将尝试至少部分回答您的问题。随时评论要求我扩大(或缩小!)

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

【讨论】:

感谢迈克尔的意见。我认为您对权衡取舍的看法与我的感觉相符,

以上是关于Linux 驱动程序:ioctl 还是 sysfs?的主要内容,如果未能解决你的问题,请参考以下文章

Linux用户与内核空间交互—ioctl

Linux用户与内核空间交互—ioctl

linux 内核中Netlink

linux device driver —— ioctl

使用 fgetc 读取 gpio 的 linux sysfs

Linux用户与内核空间交互—debugfs