网卡驱动注册到PCI总线这一过程的分析
Author: scutan
大家好,最近在看网络部分的代码,目前看到了网卡的初始化部分。书上讲到的内容主要是网卡
驱动程序对网卡自身的初始化部分,即网卡驱动的probe函数是如何执行的,而很少讲到网卡是
如何注册到系统中去的这一部分。
现在的网卡大部分都是连接到PCI总线上的。因此,网卡驱动是如何连接到PCI总线,又是如何
与网卡设备联系起来,网卡在注册的最后又是如何调用到该网卡的probe函数的,这一个过程将
在后面的文章中进行描述。整个文章分成两个部分,第一部分是讲解总线、设备以及驱动三者的
联系,为第二部分具体讲解PCI总线、网卡设备和驱动做一点铺垫。
由于我在这方面也是初学,之所以想总结出来是想到在总结的过程中对自己的学习也是一个梳
理的过程。所以有什么地方写得不好的,还请各位多多指正,非常感谢!也希望能在这里结识更
多的朋友。
在总结的过程中参考了下面一些资料,在此表示感谢:
[1] <Understanding Linux Network Internals>
[2] <Linux那些事儿之我是U盘>
[3] <Essential Linux Device Drivers>
[4] <Linux Device Driver> 3rd Edition.
1. 总线、设备和驱动
1.1 简单介绍
Linux设备模型中三个很重要的概念就是总线、设备和驱动,即bus,device和driver。它们分
别对应的数据结构分别为struct bus_type,struct device和struct device_driver。
总线是处理器与一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连。在
最底层,Linux系统中的每一个设备都用device结构的一个实例来表示。而驱动则是使总线上的
设备能够完成它应该完成的功能。
在系统中有多种总线,如PCI总线、SCSI总线等。系统中的多个设备和驱动是通过总线让它们
联系起来的。在bus_type中两个很重要的成员就是struct kset drivers和struct kset
devices。它分别代表了连接在这个总线上的两个链,一个是设备链表,另一个则是设备驱动链
表。也就是说,通过一个总线描述符,就可以找到挂载到这条总线上的设备,以及支持该总线的
不同的设备驱动程序。
1.2 总线、设备与驱动的绑定
在系统启动时,它会对每种类型的总线创建一个描述符,并将使用该总线的设备链接到该总线
描述符的devices链上来。也即是说在系统初始化时,它会扫描连接了哪些设备,并且为每个设
备建立一个struce device变量,然后将该变量链接到这个设备所连接的总线的描述符上去。另
一方面,每当加载了一个设备驱动,则系统也会准备一个struct device_driver结构的变量,然
后再将这个变量也链接到它所在总线的描述符的drivers链上去。
评论0