linux设备驱动程序注册过程详解

本文详细介绍了Linux设备驱动程序的注册过程,包括模块初始化、驱动程序入口、模块初始化的具体步骤。重点讲解了Linux总线设备驱动模型,深入剖析了注册函数,特别是driver_match_device函数在驱动-设备匹配中的作用。
摘要由CSDN通过智能技术生成
Linux的驱动程序注册过程,大致分为两个步骤:
  • 模块初始化
  • 驱动程序注册
下面以内核提供的示例代码pci-skeleton.c,详细说明一个pci设备驱动程序的注册过程。其他设备的驱动代码注册过程基本相同,大家可自行查看。使用的内核代码版本是2.6.38。

1. 模块初始化

1.1 驱动程序入口

所有的设备驱动程序都会有如下两行代码:
1922 module_init(netdrv_init_module);
1923 module_exit(netdrv_cleanup_module);
module_init/module_exit是两个宏。module_init是该驱动程序的入口,加载驱动模块时,驱动程序就从netdrv_init_module函数开始执行。而当该驱动程序对应的设备被删除了,则会执行netdrv_cleanup_module这个函数。

1.2 模块初始化

当驱动程序开始执行时,首先会执行该驱动程序的初始化函数netdrv_init_module,代码如下:
1906 static int __init netdrv_init_module(void)
1907 {
1908 /* when a module, this is printed whether or not devices are found in probe */
1909 #ifdef MODULE
1910     printk(version);
1911 #endif
1912     return pci_register_driver(&netdrv_pci_driver);
1913 }
可以看到,初始化函数很简单,只执行了一个pci_register_driver函数就返回了。
其实模块的初始化过程就是这么简单,这也是linux驱动程序的ISO标准流程:module_init-->xx_init_module-->xx_register_driver。相信你看着这里时,还是一头雾水。别着急,我们慢慢来。

2. 驱动程序注册

什么是驱动模块的注册?上面讲到的初始化函数中调用的pci_register_driver函数就是注册驱动程序啦。在介绍注册函数之前,必须要详细说明下linux的总线设备驱动模型,否则下面的内容很难描述清楚。

2.1 linux总线设备驱动模型

关于总线设备驱动模型,很多书上都有详细的讲解,但是都很抽象,很难理解(至少我是这样认为的)。下面我尽量用最简单的方法来说明相关内容。
linux内核中分别用struct bus_type,struct device和struct device_driver来描述总线、设备和驱动。
总线:
 50 struct bus_type {
 51     const char      *name;
 52     struct bus_attribute    *bus_attrs;
 53     struct device_attribute *dev_attrs;
 54     struct driver_attribute *drv_attrs;
 55
 56     int (*match)(struct device *dev, struct device_driver *drv);
 。。。
 68 };
设备:
406 struct device {
407     struct device       *parent;
408
409     struct device_private   *p;
410
411     struct kobject kobj;
412     const char      *init_name; /* initial name of the device */
413     struct device_type  *type;
414
415     struct mutex        mutex;  /* mutex to synchronize calls to
416                      * its driver.
417                      */
418
419     struct bus_type *bus;       /* type of bus device is on */
420     struct device_driver *driver;   /* which driver has allocated this
421                        device */
。。。
456
457     void    (*release)(struct device *dev);
458 };
驱动:
122 struct device_driver {
123     const char      *name;
124     struct bus_type     *bus;
125
126     struct module       *owner;
127     const char      *mod_name;  /* used for built-in modules */
128
129     bool suppress_bind_a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值