我正在读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设备驱动程序只有一个完整字符设备驱动程序可以获得的子集?
答案 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内核为简单的驱动程序提供了简化的接口 - 那些将注册单个入口点的驱动程序。注意,通常,将主要编号的整个名称空间分配给每个设备是有益的。这允许处理多个终端,多个串行端口和多个磁盘分区,而不需要内核中的任何开销:单个驱动程序负责所有这些,并使用次要编号进行区分。