主要号码次要号码和驱动程序加载

时间:2012-06-22 19:35:40

标签: linux linux-kernel driver device

我是初学者。我对与设备驱动程序相关的主要数字和次要数字有所了解。另外我知道可以插入Linux系统的大多数设备都有一个主要数字。并且基于该主要编号,加载相应的驱动程序。 我有这个疑问,请告诉我内核在插入时如何从设备中读取主要数字? 请解释从设备插件到驱动程序加载的步骤,尽可能简单。

提前致谢。

2 个答案:

答案 0 :(得分:16)

主要/次要数字适用于阻止字符设备。

您没有检测来自设备的主要号码。也许您认为USB设备可以通信设备号而Linux使用这些设备号,但USB供应商/产品ID与主要数字无关。如果将完全愚蠢的串行设备插入串口怎么办?内核无法知道你插入/拔掉了什么东西。

因此,如果你想要一个主要设备的主号码,你可以使用

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
像NKamrath说的那样,或者你使用绝对的。但请注意many are reserved

据我所知,以下是您要求的步骤:

  1. 您将一些块/字符设备插入某些总线
  2. 根据总线(USB,PCI,PCI Express,SCSI,I²C等),总线(可能)发送一个中断信号,有一天会到达CPU并且因此对Linux。
  3. 中断例程执行必要的工作,知道总线类型及其内部机制,为该设备加载适当的驱动程序(如果它存在,并且肯定是这样)并执行其初始化功能
  4. 设备驱动程序的初始化函数(例如register_chrdev_region)注册一个主要编号,如果它有一个保留(参见这个着名的reserved list);否则它要求内核为它分配一个(例如alloc_chrdev_region);司机还会为这名司机预留一个小区域。
  5. 驱动程序设置一些回调(打开/关闭/读/写)并要求内核将它们与设备号相关联。
  6. 此时,您可以使用其设备号与驱动程序通信,但如何? /dev中没有任何内容......当您知道要与之通信的主要/次要对时,使用mknod的一种方法是使用# mknod /dev/mydevice c 232 4 。你会发出:

    /dev/mydevice

    ...这是:请在c创建一个设备节点,该节点链接到具有主要232和次要4的字符(printk)设备。但是,您如何知道这些数字呢?它们可能是绝对的(保留列表)或驱动程序device_create,因此您可以手动执行。

    但是这里有更好的东西。

    仍在设备驱动程序的初始化函数中:驱动程序将设备注册为Sysfs设备(请参阅/sys)。这会将设备放入uevent树中,其节点(目录)将有一个名为cat的文件。如果你MAJOR=232 MINOR=4 DEVNAME=whatever ,它会输出类似

    的内容
    $ cat /sys/class/tty/console/uevent
    

    试一试:

    $ ls -l /dev/console
    

    是否匹配

    /dev

    现在,udev是负责管理/sys的用户空间计划。总的来说,它只是扫描/dev树,以便自动填充$ ls /sys/dev/char $ ls /sys/dev/block 。您还可以看到所有主要/次要的字符和块设备:

    /dev

    就是这样。如果您想更好地理解这一切,请开发一个虚拟驱动程序并尝试将其自动显示在{{1}}中。

答案 1 :(得分:2)

如果您事先知道主要号码,可以使用

int register_chrdev_region(dev_t first, unsigned int count);

允许内核为设备动态分配一个主要号码

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, 
                    char *name);

要阅读主要号码,请使用

int MAJOR(dev_t dev);

要插入设备或驱动程序,您必须使用insmod命令。然后内核尝试使用您给出的数字,或者如果您使用alloc函数,则动态地为其分配一个空闲的主号码。正确解释内核和驱动程序设计的内部工作原理需要大量解释。但是,有一本很好的免费书籍,这本书很容易阅读(代码簿)Linux Device Drivers 3rd Edition,它会给你一个非常好的驱动程序介绍,即使你只阅读前3章(大约100页)你会对我的想法有一个很好的理解。此外,这些示例的所有源代码都可用,因此您可以破解他们的演示并开始更快地编写驱动程序!