
1. 总线,设备和驱动程序
1.1简介
Linux设备模型中的三个非常重要的概念是总线,设备和驱动程序,即总线,设备和驱动程序. 相应的数据结构为struct bus_type,struct device和struct device_driver.
总线是处理器与一个或多个设备之间的通道. 在设备模型中,所有设备都通过总线连接. 在最低级别上,Linux系统中的每个设备都由设备结构的一个实例表示. 驱动程序将使总线上的设备能够完成应完成的功能.
系统中有多个总线,例如PCI总线,SCSI总线等. 系统中的多个设备和驱动程序通过总线连接. bus_type中两个非常重要的成员是struct kset驱动程序和struct kset设备. 它代表连接到此总线的两条链,一条是设备链接列表linux 网卡 驱动,另一条是设备驱动程序链接列表. 也就是说,通过总线描述符,您可以找到安装在该总线上的设备以及支持该总线的不同设备驱动程序.
1.2总线,设备和驱动程序的绑定
系统启动时,它将为每种总线类型创建一个描述符,并将使用该总线的设备链接到该总线描述符的设备链. 也就是说,在初始化系统时,它将扫描连接的设备,并为每个设备创建一个struce设备变量,然后将该变量链接到该设备所连接的总线的描述符. 另一方面,每当加载设备驱动程序时,系统也会准备一个struct device_driver结构变量,然后将该变量链接到其所在总线的描述符的驱动程序链.
对于设备,结构struct设备中有两个重要成员,一个是struct bus_type * bus,另一个是struct device_driver * driver. 总线成员指示设备连接到哪个总线,驱动程序成员指示哪个驱动程序正在驱动当前设备. 对于驱动程序,结构struct device_driver中还有两个成员,struct bus_type * bus和struct list_head devices,其中总线成员还指向此驱动程序链接到的总线,并且设备的链接列表表示当前的此驱动程序. 可以去驱动那些设备. 一个驱动程序可以支持一个或多个设备,而一个设备只能绑定到一个驱动程序.

有两种主要方法可以在device和device_driver之间建立连接. 首先,当计算机启动时,总线开始扫描与其连接的设备,为每个设备建立一个struct device变量,并将其链接到总线的设备链,然后开始初始化不同的驱动程序. 总线所在的设备链遍历尚未绑定到驱动程序的每个设备,然后检查它是否可以支持该设备. 如果它可以支持此设备,则该设备与此驱动程序关联. 也就是说,将此设备的设备变量添加到驱动程序的设备链中,并让struct设备中的device_driver指向当前驱动程序. 第二种是热插拔. 即,在系统运行时插入设备. 此时,内核将找到在总线链上注册的device_driver,然后将设备连接到驱动程序. 根据设备和驱动程序的连接规则,将在以下各章中详细描述它们与代码的连接方式.
1.3 PCI总线
PCI是用于CPU和I / O设备之间的高速数据传输的总线. 有许多使用PCI总线的设备,网卡就是其中之一. 我们在前面谈到了那些总线,设备和驱动程序的知识,因为网卡已连接到PCI总线,所以PCI总线,网卡设备和网卡驱动程序已成为我们研究网络的重要线索. 卡,尤其是在网络的链路层部分. 下图显示了系统中PCI设备的框图:

500)this.width = 500;“ border = 0>
图1. PCI
PCI子系统声明了bus_type结构,即pci_bus_type. 它是PCI总线的描述符. 在此变量上,链接了PCI设备和支持PCI设备的驱动程序.
1.4 PCI设备和驱动程序

PCI设备通常由一组参数唯一标识,这些参数由vendorID,deviceID和类节点(即设备制造商,型号等)标识. 这些参数存储在pci_device_id结构中. 每个PCI设备都分配了一个pci_dev变量linux 网卡 驱动,内核使用此数据结构表示一个PCI设备.
所有PCI驱动程序必须定义pci_driver结构变量,该变量包含此PCI驱动程序提供的不同功能的功能,并且在此结构中还包含device_driver结构. 此结构定义PCI子系统和PCI设备之间的接口. 注册PCI驱动程序时,将初始化此结构,并将pci_driver变量链接到pci_bus_type中的驱动链.
pci_driver中有一个成员struct pci_device_id * id_table,该成员列出了该设备驱动程序可以处理的所有PCI设备的ID值.
1.5 PCI设备和驱动程序的绑定过程
以下描述了绑定PCI设备和驱动程序的过程. 首先,当系统启动时,PCI总线会扫描连接到该总线的设备,并同时为每个设备创建pci_dev结构. 该结构中有一个设备成员,并将这些pci_dev结构链接到PCI总线描述符. 在设备链上. 如下图所示:

500)this.width = 500;“ border = 0>
图2.将设备链接到总线描述符

第二步是在加载PCI驱动程序时,将初始化pci_driver结构. 此过程在函数pci_register_driver中:
drv-> driver.bus =&pci_bus_type;
drv-> driver.probe = pci_device_probe;
最后,将调用driver_register(&drv-> driver)将这个PCI驱动程序安装到总线描述符的驱动链上. 同时,在注册过程中,根据pci_driver中id_table中的ID值查看驱动程序支持哪些设备,将这些设备安装到pci_driver中的设备链上. 如下图所示:

500)this.width = 500;“ border = 0>
图3.加载设备驱动程序
对于不同的设备,驱动程序可能不同,因此对于上图中的Dev3,可能需要另一个驱动程序来驱动它. 因此,在加载Dev3驱动程序时,原理图如下:


500)this.width = 500;“ border = 0>
图4.不同的设备驱动程序
以上三个描述了总线,设备和驱动程序在系统中如何交互. 先前对于驱动程序注册的这些功能的描述相对简单,因为网卡是PCI设备,因此稍后我再讨论网卡注册时,我将详细说明与PCI注册相关的功能以及其他功能.
1.6摘要
这部分主要说明有关总线,设备和驱动程序的一些知识. 由于网卡是PCI设备,因此专门讨论了PCI总线,PCI设备和相应的PCI驱动程序,但是由于PCI本身是一个非常大的子系统,因此无法在此处进行详细说明. 在稍后的网卡分析中,将说明网卡的PCI相关部分. 本节仍然是入门.
1.7参考文献
对于学习网卡,我必须参考其他人的书和摘要材料. 谢谢你.
[1]
[2]
[3]
[4]第三版.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-253611-1.html
收台湾是大势所趋民心所向