具有 "module_pci_driver" 的 pci 设备驱动程序与具有“__init()”但在 Linux 中没有 "module_pci_driver()" 的 pci 驱动程序之间的区别

difference between a pci device driver with "module_pci_driver" and a pci driver with "__init()" but without "module_pci_driver()" in Linux

我在 pci 设备驱动程序中看到过这一行

   module_pci_driver(cp_driver);

但在其他 pci 设备驱动程序中是这样的

     module_init(rtl8139_init_module);

在不同驱动程序的驱动程序 .c 文件末尾找到的两行

我所知道的是:我可以使用 __init 创建一个 pci 设备驱动程序,但我也可以创建一个没有 __init

的 pci 设备驱动程序

即 [Realtek Ethernet 在 Linux source

中有两个驱动程序

1) 139cp.c(没有__init

2) 8139too.c__init].

我认为两者之间的主要区别很简单,如果我必须在使用 insmod 命令加载驱动程序模块后立即使用 pci 设备驱动程序,那么我使用设备驱动程序的实现__init.

问题 相反,如果我只想加载pci设备驱动程序而不使用它,那么我是否应该创建一个带module_pci_driver()的pci设备驱动程序(所以不需要添加__init)?它有什么作用(module_pci_driver)?它与 __init

的 pci 驱动程序有何不同

我想知道我可能有一个误解,请任何人澄清。当我使用 insmod 命令加载驱动程序时,两种类型驱动程序的 probe 功能是否也会 运行 ?什么时候?如果是,那有什么区别,因为大多数设备配置都是在问题功能中完成的

总结一下 当初始化发生在带有 module_pci_driver(cp_driver); 的驱动程序中时,因为它们没有实现 __init。使用了什么命令

module_pci_driver() 是一个帮助程序,适用于在模块初始化和退出时没有做任何特殊操作的驱动程序(即,其初始化和退出功能只是 register/unregister 的模块)。

它为您生成初始化和退出函数,减少了一些样板文件。

在这种特定情况下,8139too 驱动程序除了注册驱动程序(在这种情况下,记录驱动程序名称)之外可能还会做一些事情,所以没有使用 module_pci_driver()

为匹配 ID table 且尚未拥有的现有或新设备调用 probe 函数(有关详细信息,请参阅 How To Write Linux PCI Drivers)。 它 returns 一个值,指示驱动程序是否将获得设备的所有权(0 或错误代码)。