一直在找一种了解linux kernel方法,总是看书无法真正的了解某一部分;想从理论当中到代码中,感觉总是深刻;借此研究e1000网卡驱动,了解kernel内核加载 驱动功工作原理和内核网路协议栈的处理过程;e1000 是在虚拟机上加载可以使用的;
问题1,内核如何找到对应的驱动
问题2,网卡如何加载
问题3,网卡驱动工作原理
调研这三个问题:
在e1000目下面驱动文件:
e1000_ethtool.c e1000.h e1000_hw.c e1000_hw.h e1000_main.c e1000_osdep.h e1000_param.c
kernel是如何发现设备和e1000加载的那?
抛开所有的资料,仔细读取源码
e1000_main.c驱动开始的第一个.c文件,文件中是该模块被加载的开端
242 * e1000_init_module is the first routine called when the driver is
243 * loaded. All it does is register with the PCI subsystem.
264 module_init(e1000_init_module);
驱动加载时e1000_init_module程序第一个被调用的。 PCI 子系统注册好一切的准备工作;
从这句话中我们可以去了解PCI子系统如何去要加在e1000驱动而不是如何去加载其他的驱动;
PCI 是外围设备总线,有很多设备都连接到PCI总线上。PCI总线知识,我们计算机组成原理中也有到过
这个是讲述linux PCI驱动模型的文章
就是从Host/PCI桥开始进行探测和扫描,逐个“枚举”连接在第一条PCI总线上的所有设备并记录在案。如果其中的某个设备是PCI-PCI桥,则又进一步再探测和扫描连在这个桥上的次级PCI总线。就这样递归下去,直到穷尽系统中的所有PCI设备。
阅读(4197) | 评论(1) | 转发(0) |