misc驱动程序和char驱动程序有什么区别?

时间:2013-08-27 02:49:35

标签: c linux linux-device-driver

我正在读Linux中的misc驱动程序,我对它们和char驱动程序之间的差异感到有些困惑。一个来源the Linux journal写道:

  

Alessandro告诉我们如何注册需要单个设备的小型设备   与misc司机的切入点。

有时人们需要写作   “小”设备驱动程序,以支持自定义黑客 - 硬件或   软件。为此,以及主持一些真正的司机,   Linux内核导出一个接口,允许模块注册它们   自己的小司机。 misc驱动程序是为此目的而设计的。

好的,所以从这里我得到一个简单的驱动程序(在这种情况下有一个入口点),这是一个misc驱动程序。然后另一个来源,Essential Linux设备驱动程序,声明:

  

杂项(或杂项)驱动程序是共享的简单char驱动程序   某些共同特征。因为misc驱动程序是char驱动程序,   关于char驱动程序入口点的早期讨论适用于misc   司机也是。

现在这似乎说misc驱动程序 只是char驱动程序,但也许是函数的子集,而char驱动程序可以有多个入口点(例如ioctl()open()read()来电

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

2 个答案:

答案 0 :(得分:14)

编辑:我以为您在谈论drivers/misc个驱动程序,但我看到您使用misc_register(以及{{1中的所有API)引用了字符驱动程序}})。你应该在你的问题中指明这一点。

在这种情况下,drivers/char/misc.c API似乎可以让您在编写小型字符驱动程序时更轻松,并且不希望仅使用一个次要编号来分配新的主要编号,例如。它简化了操作,但使用misc的{​​{1}}成员仍然可以使用所有文件操作。基本区别是每个fops设备只能获得一个次要编号。

我之前的无关答案是,记录:

快速查看drivers/misc:您将找不到任何“struct miscdevice核心”。这意味着:misc不是设备类;它只是一堆不适合任何其他类别的驱动程序。气压计,DAC,测试套件和其他奇怪的东西。

查看misc的顶部:

misc

所有此Kconfig中的项目不依赖于任何“drivers/misc/Kconfig核心”,而是依赖于其他核心(# # Misc strange devices # menu "Misc devices" misc,{{1等等)。通常,当驱动程序真正使用驱动程序核心时,您将在其Kconfig中看到它。例如,几乎所有i2c个驱动程序(pci)都依赖于tty类核心,并且在Kconfig node中有这个:

leds

也许drivers/leds驱动程序都是字符驱动程序(我没有检查所有驱动程序),但其他东西仍然工作,尽管它可能位于错误的位置。我相信很多leds司机现在可以搬到更好的地方......一位经验丰富的内核黑客可以证实这一点。

所以,回答你的问题:depends on LEDS_CLASS 驱动程序不一定是字符驱动程序,因此这两个类别完全不相关。 misc驱动程序只带来一个字符驱动程序,因为misc驱动程序再没什么特别的。

更新Honeywell compass driver就是一个很好的例子。它小而直接。

使用I²C与实际指南针通信。这个设备不会显示为字符设备,所以忘记主要的数字10.然而,它会出现在Sysfs的某个地方,misc下,就像所有的I²C设备一样。并且您将看到它添加到其组中的Sysfs属性,例如misc,它将在读取时显示当前的罗盘方向。

所以在这里你拥有它:一个misc驱动程序,它不是一个字符驱动程序。

答案 1 :(得分:3)

  

现在这似乎说misc驱动程序只是char驱动程序,但也许是函数的子集,而char驱动程序可以有多个入口点(例如ioctl()或open()或read()致电)

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

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

  

现在由于内核保留了设备驱动程序的静态表,因此主要数字的轻率分配相当浪费RAM。因此,Linux内核为简单的驱动程序提供了简化的接口 - 那些将注册单个入口点的驱动程序。注意,通常,将主要编号的整个名称空间分配给每个设备是有益的。这允许处理多个终端,多个串行端口和多个磁盘分区,而不需要内核中的任何开销:单个驱动程序负责所有这些,并使用次要编号进行区分。