Mik*_*ike 16 c linux linux-device-driver
我正在读Linux中的misc驱动程序,我对它们和char驱动程序之间的差异感到有些困惑.一个来源,Linux期刊写道:
Alessandro告诉我们如何使用misc驱动程序注册需要单个入口点的小型设备.
有时人们需要编写"小"设备驱动程序,以支持自定义黑客 - 无论是硬件还是软件.为此,以及托管一些真正的驱动程序,Linux内核导出一个接口,允许模块注册自己的小驱动程序.misc驱动程序是为此目的而设计的.
好的,所以从这里我得到一个简单的驱动程序(在这种情况下有一个入口点),这是一个misc驱动程序.然后另一个源,Essential Linux设备驱动程序,指出:
其他(或其他)驱动程序是具有某些共同特征的简单字符驱动程序.因为misc驱动程序是char驱动程序,所以早期关于char驱动程序入口点的讨论也适用于misc驱动程序.
现在,这似乎是说,其它司机都只是字符驱动,但也许一部分功能,而字符驱动可以有多个入口点(如一个ioctl()
或一个open()
或read()
电话)
那么,在Linux C编码术语中,char和misc设备驱动程序之间的区别是什么?(除了明显的所有misc驱动程序的主要编号(10)).支持的入口点是否有区别?我的假设是否正确,misc设备驱动程序只有一个完整的char设备驱动程序可以获得的子集?
eep*_*epp 15
编辑:我以为你在谈论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"
Run Code Online (Sandbox Code Playgroud)
所有在此的Kconfig的项目不依赖于任何" misc
核心",但在其他核心(i2c
,pci
,tty
等).通常,当驱动程序真正使用驱动程序核心时,您将在其Kconfig中看到它.例如,几乎所有的leds
驱动程序(drivers/leds
)都依赖于leds
类核心并在其Kconfig节点中具有此功能:
depends on LEDS_CLASS
Run Code Online (Sandbox Code Playgroud)
也许misc
司机都是角色驱动程序(我没有检查所有这些),但其他东西仍然可以在那里工作,虽然它可能在错误的地方.我相信现在很多misc
司机都可以搬到更好的地方......一位经验丰富的内核黑客可以证实这一点.
所以,回答你的问题:misc
驱动程序不一定是字符驱动程序,所以这两个类别完全不相关.一个misc
因为司机带来什么比一个字符驱动程序的更多misc
驱动程序,同样,没有什么特别的.
更新:霍尼韦尔罗盘驱动器就是一个很好的例子.它小巧而直接.
它使用I²C与实际罗盘进行通信.这个设备不会显示为字符设备,所以忘记主要的数字10.然而,它会出现在Sysfs的某个地方/sys/bus/i2c/devices
,就像所有的I²C设备一样.并且您将看到它添加到其组中的Sysfs属性,就像heading0_input
在读取时将显示当前指南针方向.
所以在这里你拥有它:一个misc
不是角色驱动程序的驱动程序.
小智 5
\n\n\n现在这似乎表明,misc 驱动程序只是 char 驱动程序,但可能是函数的子集,并且 char 驱动程序可以有多个入口点(例如 ioctl() 或 open() 或 read() 调用)
\n
是的,它只是Charater驱动程序,Misc驱动程序也有多个入口点read(),write(),ioctl()(因为在miscdevice的结构中已经有filefile_operations结构)
\n\n根据我的理解,当我们需要编写一个小型驱动程序(只有一个入口点或更多(2,3,...入口点)<<<表示小型驱动程序)时,我们应该使用杂项驱动程序。如果我们注册新的主编号,它将防止 RAM 的浪费。
\n\n\n\n现在,由于内核保留了设备驱动程序的静态表,因此主编号的无意义分配相当浪费 RAM。因此,Linux 内核为简单的驱动程序\xe2\x80\x94 提供了一个简化的接口,这些驱动程序将注册单个入口点。请注意,一般来说,将主编号的整个名称空间分配给每个设备是有益的。这允许处理多个终端、多个串行端口和多个磁盘分区,而无需内核本身的任何开销:单个驱动程序负责处理所有这些,并使用次要编号来区分。
\n