首页 理论教育Capric卡驱动程序加载与卸载技巧

Capric卡驱动程序加载与卸载技巧

【摘要】:在Linux系统中,Capric卡驱动程序的加载与卸载的过程如源代码12-1所示。源代码12-1 Capric卡驱动程序的加载与卸载在上述源代码中,pci_register_driver函数的主要作用是将capric_drv结构与PCI设备的pci_dev结构[94]进行绑定,并在初始化时执行capric_probe函数,而在结束时执行capric_re-move函数。这段源代码的主要作用是将Capric卡驱动程序使用的“软件结构pci_driver”与“硬件结构pci_dev”建立联系。Capric卡的卸载过程是加载的逆过程,其调用顺序为pci_unregister_driver函数、driver_unregister函数、bus_remove_driver函数、driver_detach函数和__device_release_driver函数,并最终调用capric_remove函数。

在Linux系统中,Capric卡驱动程序的加载与卸载的过程如源代码12-1所示。这部分程序并不会直接操作PCIe设备,而是通过pci_register_driver函数向内核注册一个pci_driver结构,即capric_drv,并由capric_probe函数完成Capric卡的初始化

源代码12-1 Capric卡驱动程序的加载与卸载

在上述源代码中,pci_register_driver函数的主要作用是将capric_drv结构与PCI设备的pci_dev结构[94]进行绑定,并在初始化时执行capric_probe函数,而在结束时执行capric_re-move函数。这段源代码的主要作用是将Capric卡驱动程序使用的“软件结构pci_driver”与“硬件结构pci_dev”建立联系。本文并不会深入分析pci_register_driver和pci_unregister_driver函数的实现细节,而仅介绍该函数的执行顺序。对Linux系统有一定经验的读者,可以从中获得必要的知识。

pci_register_driver函数首先调用__pci_register_driver→driver_register→bus_add_driver函数。bus_add_driver函数进行一些必要的初始化操作后,调用driver_attach→bus_for_each_dev函数查找Capric卡的pci_dev结构。

在Linux系统中,bus_for_each_dev函数是一个重要的函数,该函数将遍历Capric卡所在PCI总线树上的所有pci_dev结构,并依次判断pci_dev结构中的DeviceID、VendorID等信息是否与capric_ids结构中包含的对应信息相同,如果相同则调用capric_probe函数。bus_for_each_dev函数调用__driver_attach函数实现该过程。(www.chuimin.cn)

__driver_attach函数调用drv→bus→match函数(即pci_bus_match函数),而pci_bus_match函数将继续调用pci_match_device→pci_match_id函数,判断capric_ids所包含的内容是否在当前PCI总线树的pci_dev中出现。如果出现,将capric_drv结构与实际的PCI设备进行绑定。之后继续调用driver_probe_device→really_probe函数。

really_probe函数将调用dev→bus→probe函数(即pci_device_probe函数),pci_device_probe函数将调用__pci_device_probe→pci_call_probe→local_pci_probe函数,并最终调用Cap-ric卡的probe函数,即capric_probe函数。

Capric卡的卸载过程是加载的逆过程,其调用顺序为pci_unregister_driver函数、driver_unregister函数、bus_remove_driver函数、driver_detach函数和__device_release_driver函数,并最终调用capric_remove函数。

对于Capric卡,初始化与结束操作是在capric_probe和capric_remove函数中完成的。在capric_ids结构中使用的id号,是联系Capric卡的pci_driver结构和pci_dev结构的桥梁。在该结构中的PCI_VENDOR_ID_XILINX和PCI_DEVICE_ID_EP_PIPE即为Capric卡的Vendor ID和DeviceID,分别为0x10EE和0x0007。