4

我试图了解设备驱动程序在 linux 中的工作原理。

  1. 我有一个设备节点如下(主编号89,设备名称i2c-0)

     crw-r--r--    1 0        0         89,   0 Sep 29 01:36 /dev/i2c-0
    
  2. 我有带有名称的 i2c 驱动程序,i2c.ko我将insmod i2c.ko在启动期间执行此操作。

  3. 在驱动程序中,初始化期间将调用以下函数:

    register_chrdev(89, "i2c", &i2chtv_fops)<0    // not "i2c-0"
    

我的问题是:当用户调用open("/dev/i2c-0", O_RDWR)时,内核如何知道使用哪个驱动程序?我注意到设备名称是i2c-0,但注册的设备名称是i2c。是因为它们使用相同的主编号,内核可以使用正确的驱动程序吗?

4

2 回答 2

4

主设备号告诉您哪个驱动程序处理哪个设备文件。次要编号仅由驱动程序本身用于区分它在哪个设备上运行,以防驱动程序处理多个设备。

将驱动程序添加到系统意味着将其注册到内核。这与在模块初始化期间为其分配主编号相同。您可以使用由 linux/fs.h 定义的 register_chrdev 函数来执行此操作。

 int register_chrdev(unsigned int major, const char *name,
       struct file_operations *fops); 

其中 unsigned int major 是您要请求的主要编号, const char *name 是设备的名称,因为它将出现在 /proc/devices 中, struct file_operations *fops 是指向驱动程序的 file_operations 表的指针。负返回值表示注册失败。请注意,我们没有将次要编号传递给 register_chrdev。那是因为内核不关心次要号码;只有我们的司机使用它。

这里

于 2009-10-06T12:32:02.883 回答
3

是的,主要数字选择驱动程序,次要数字选择“单位”(无论是什么;对于控制台驱动程序,它是不同的屏幕)。

您看到的-0是“单元”(如果您的系统中有多个 i2c 总线)。

于 2009-10-06T09:11:16.033 回答