2013-08-27 63 views
15

我正在阅读有关Linux中的misc驱动程序,我对它们和字符驱动程序之间的差异有些困惑。一个消息来源,the Linux journal,写道:misc驱动程序和字符驱动程序有什么区别?

亚历山德罗告诉我们如何注册一个小装置,需要与其它驱动器单 切入点。

有时候人们需要编写 “小”设备驱动程序,以支持定制攻击 - 无论是硬件还是软件版本。为此,为了托管一些真正的驱动程序,Linux内核将导出一个接口,以允许模块注册其自己的小驱动程序。 misc驱动程序是为此目的而设计的。

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

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

现在,这似乎是说,其它司机只是字符驱动,但也许一部分功能,而字符驱动可以有多个入口点(如ioctl()open()read()通话)

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

回答

14

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

在这种情况下,例如,编写小​​字符驱动程序时,misc API似乎使您的生活更轻松,并且不希望为仅使用一个次编号分配新的主号码。它简化了一切,但所有的文件操作仍然可以使用 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 node

depends on LEDS_CLASS 

也许misc司机都是字符驱动程序(我没有检查所有的人),但其他东西仍然工作那里,虽然它可能会在错误的地方。我相信很多misc驱动程序现在可以转移到更好的地方......一个经验丰富的内核黑客可以证实这一点。

所以,回答你的问题:misc驱动程序不一定是字符驱动程序,所以这两个类别是完全无关的。一个misc驱动程序带来的不过是一个字符驱动程序,因为驱动程序misc再次没有什么特别之处。

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

它使用I²C与实际指南针进行通信。此设备不会显示为字符设备,因此请勿忘记主号码10.但​​是,它将出现在Sysfs中的某个位置,在/sys/bus/i2c/devices之下,就像所有的I²C设备一样。您将看到它添加到其组中的Sysfs属性,如heading0_input,它将在读取时显示当前指南针方向。

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

3

现在这似乎是说,misc驱动程序只是字符驱动程序,但也许是一个函数的子集,并且字符驱动程序可以有多个入口点(例如ioctl()或open()或a阅读()调用)

是的,它只是柴拉特驱动程序,和其它驱动器也有)阅读(多个切入点,写()的ioctl()(因为在miscdevice的结构已经有filefile_operations结构)

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

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

相关问题