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

我正在阅读有关Linux中的misc驱动程序,我对它们和字符驱动程序之间的差异有些困惑。 一个来源, Linux杂志写道:

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

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

好吧,从这里我得到有一个简单的驱动程序(在这种情况下只有一个入口点),这是一个misc驱动程序。 然后,另一个来源,基本Linux设备驱动程序,指出:

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

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

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

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

在这种情况下, misc API似乎使您在编写小字符驱动程序时更加轻松,并且不希望仅为了使用次要号码而分配新的主号码。 它简化了一切,但所有的文件操作仍然可以使用struct miscdevicefops成员。 基本的区别是你只能得到一个次要的数字每个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驱动程序也是没有什么特别的。

更新 : 霍尼韦尔罗盘驱动器就是一个很好的例子。 这是小而直接。

它使用I²C与实际的指南针进行通信。 这个设备不会显示为一个字符设备,所以忘记主要数字10.然而,它将出现在sysfs中的/sys/bus/i2c/devices ,就像所有的I²C设备一样。 你会看到它添加到它的组的Sysfs属性,比如heading0_input ,它将在读取时显示当前的罗盘方向。

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

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

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

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

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