杂项驱动程序和字符驱动程序有什么区别?

21
我正在阅读有关Linux中的杂项驱动程序,并且有点困惑它们与字符驱动程序之间的区别。 Linux杂志 的一位作者写道:
Alessandro告诉我们如何使用misc驱动程序注册需要单个入口点的小型设备。 有时候人们需要编写“小型”设备驱动程序,以支持自定义黑客(硬件或软件)。 为此,以及托管一些真正的驱动程序,Linux内核导出了一个接口,允许模块注册自己的小驱动程序。 杂项驱动程序就是为此目的而设计的。
好的,从这里我得出结论,有一个简单的驱动程序(在这种情况下只有一个入口点),那就是misc驱动程序。然后另一来源Essential Linux设备驱动程序指出:
杂项(或杂项)驱动程序是共享某些通用特征的简单字符驱动程序。因为misc驱动程序是字符驱动程序,所以先前对字符驱动程序入口点的讨论也适用于misc驱动程序。
现在看起来似乎是说杂项驱动程序只是字符驱动程序的一部分功能,而字符驱动程序可以有多个入口点(例如ioctl()、open()或read()调用)。那么,在Linux C编码术语中,字符设备驱动程序和misc设备驱动程序之间有什么区别?(除了所有misc驱动程序都分配了明显的主要编号(10)之外)。支持的入口点有区别吗?我的假设是否正确,即misc设备驱动程序只有完整字符设备驱动程序的子集?
2个回答

22

编辑:我原以为你在谈论drivers/misc驱动程序,但现在我看到你提到了使用misc_register的字符驱动程序(以及drivers/char/misc.c中的所有API)。你应该在你的问题中明确说明这一点。

在这种情况下,当你编写一个小的字符驱动程序并且不想需要分配新的主设备号只是为了使用一个次设备号时,misc API似乎可以使你的生活更轻松。它简化了事情,但是所有的文件操作仍然可以使用struct miscdevicefops成员。基本区别在于每个misc设备只有一个次设备号。

我的之前的、与此无关的回答是:

快速查看一下drivers/misc:你不会在那里找到任何"misc核心"。这意味着:misc不是一种设备类;它只是一堆不适合其他任何类别的驱动程序。像气压计、DAC、测试套件和其他奇怪的东西。

看一下drivers/misc/Kconfig的顶部:

#
# Misc strange devices
#

menu "Misc devices"

所有此Kconfig中的项目都不依赖于任何“misc核心”,而是依赖于其他核心(i2cpcitty等)。通常情况下,当驱动程序真正使用驱动程序核心时,您会在其Kconfig中看到它。例如,几乎所有leds驱动程序(drivers/leds)都依赖于leds类核心,并在其Kconfig节点中有此内容:

depends on LEDS_CLASS

也许misc驱动程序都是字符驱动程序(我没有检查所有驱动程序),但其他东西仍然可以在那里工作,尽管可能会放错位置。我认为现在很多misc驱动程序可以移动到更好的位置……一位经验丰富的内核黑客可以证实。

因此,回答您的问题:misc驱动程序不必是字符驱动程序,因此这两个类别是完全无关的。一个misc驱动程序带来的比字符驱动程序多不了什么,因为一个misc驱动程序,再次强调,没有什么特别的。

更新:霍尼韦尔指南针驱动程序是一个绝佳的例子。它非常简单明了。

它使用I²C与实际指南针进行通信。这个设备不会显示为字符设备,所以忘记大号10了。然而,它将出现在Sysfs的某个位置下,位于/sys/bus/i2c/devices下,就像所有I²C设备一样。您将看到它添加到其组中的Sysfs属性,例如在读取时将显示当前指南针方向的heading0_input

所以这里你有一个不是字符驱动程序的misc驱动程序。


我在原始答案中的misc API添加了一个小提示(必须经过同行评审)。之后,您介意去掉历史部分(“编辑:”和原始答案)吗? - doak

5
现在看起来似乎是说杂项驱动程序只是字符驱动程序的一部分功能,而字符驱动程序可以有多个入口点(如ioctl()、open()或read()调用)。
是的,它只是字符驱动程序,而且杂项驱动程序也有多个入口点read()、write()、ioctl()(因为在miscdevice的结构中已经有file_operations结构)。
在我看来,当我们需要编写一个小型驱动程序(只有一个入口点或一些更多(2,3,...入口点)<<<意味着小型驱动程序)时,应该使用杂项驱动程序。如果我们注册新的主设备号,它将防止浪费RAM。
现在由于内核保留了设备驱动程序的静态表,所以不必要地分配主设备号会浪费RAM。因此,Linux内核为简单的驱动程序提供了简化的接口——那些将注册单个入口点的驱动程序。请注意,在一般情况下,将整个主设备号的命名空间分配给每个设备是有益的。这允许处理多个终端、多个串行端口和几个磁盘分区,而不会在内核中产生任何开销:一个驱动程序负责所有这些,并使用次设备号进行区分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接