20

我正在阅读 Linux 中的 misc 驱动程序,但我对它们与 char 驱动程序之间的区别感到有些困惑。一个来源,Linux 杂志,写道:

Alessandro 告诉我们如何使用 misc 驱动程序注册需要单个入口点的小型设备。

有时人们需要编写“小型”设备驱动程序,以支持自定义 hack——硬件或软件。为此,除了托管一些真正的驱动程序外,Linux 内核还导出了一个接口以允许模块注册自己的小型驱动程序。misc 驱动程序就是为此目的而设计的。

好的,从这里我知道有一个简单的驱动程序(在这种情况下只有一个入口点),这是一个 misc 驱动程序。然后另一个来源 Essential Linux Device Drivers 指出:

杂项(或杂项)驱动程序是具有某些共同特征的简单字符驱动程序。因为 misc 驱动程序是 char 驱动程序,所以前面关于 char 驱动程序入口点的讨论也适用于 misc 驱动程序。

现在这似乎是说 misc 驱动程序只是char 驱动程序,但可能是函数的子集,并且 char 驱动程序可以有多个入口点(例如 an ioctl()or an open()or a read()call)

那么,在 Linux C 编码术语中,char 和 misc 设备驱动程序之间的区别是什么?(除了所有杂项驱动程序的明显主要编号分配(10))。支持的入口点有区别吗?我的假设是否正确,即 misc 设备驱动程序只有您在完整 char 设备驱动程序中可以获得的子集?

4

2 回答 2

20

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

在这种情况下,misc当您编写一个小字符驱动程序并且不希望分配一个新的主要号码时,API 似乎让您的生活更轻松,例如,只使用一个次要号码。它简化了事情,但所有文件操作仍然可以使用fops. struct miscdevice基本区别是每个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不是字符驱动程序的驱动程序。

于 2013-08-27T04:11:42.360 回答
4

现在这似乎表明 misc 驱动程序只是 char 驱动程序,但可能是函数的子集,并且 char 驱动程序可以有多个入口点(例如 ioctl() 或 open() 或 read() 调用)

是的,它只是 Charater 驱动程序,而 Misc 驱动程序也有多个入口点 read()、write()、ioctl()(因为在 miscdevice 的结构中已经有 filefile_operations 结构)

在我的理解中,当我们需要编写一个小驱动程序(只有一个入口点或更多(2,3,...入口点)<<<表示小驱动程序)时,我们应该使用misc驱动程序。如果我们注册新的主要编号,它将防止 RAM 的浪费。

现在,由于内核保留了设备驱动程序的静态表,因此无意义地分配主要编号是相当浪费 RAM 的。因此,Linux 内核为简单的驱动程序提供了一个简化的接口——那些将注册一个入口点的驱动程序。请注意,一般来说,将主设备号的整个名称空间分配给每个设备是有益的。这允许处理多个终端、多个串行端口和多个磁盘分区,而无需内核本身的任何开销:单个驱动程序处理所有这些,并使用次要编号来区分。

于 2013-08-27T04:35:33.283 回答