前面我们对网卡的各种类型进行了描述,不同的网卡如何开发相应的linux驱动呢?有没有一个捷径,或者统一的标准,让我们一学就会,快速上手呢?
很遗憾,这么多的分类使用的技术各不相同,无法用一个统一的开发模版!因此,开发网卡驱动需要有侧重点的实现。
同时需要补充的一点,前面列举的网卡都是eth(以太网)卡,对于令牌网卡等不做介绍。读者可以自行领悟。
1。开发网卡驱动的首要因素
网卡的首要参数是
速率!对于不同的速率,开发人员必须小心对待。
假定CPU是1G,网卡是10M/100M速率。这时候网卡工作于中断模式,对CPU性能没有太大影响。
假定CPU是1G,网卡是1000M速率。这时候网卡工作于中断模式,对CPU性能影响就很大了。
网卡速率的不同,必然要求我们的驱动工作方式与之匹配,才能达到最佳工作状态。
因此,开发网卡必须对速率首要关心。
2。网卡涉及到的技术细节
网卡本身没有太多的技术可言,即使是MAC和PHY的关系,也不是多么负责。
网卡的技术复杂度来源于
总线类型
相同的网卡芯片,若采用了不同的总线类型,用到的技术差别很大。
网卡的接入总线类型决定因素很多:
很多网卡本身提供了ISA,PCI接口。
网卡通过外接总线控制器,完成接口转换。例如网卡芯片是PCI接口,通过外接其他芯片,做成USB网卡
任何插入到系统中的网卡,从CPU的角度首先看到的是总线,随后才是网卡芯片。
总线驱动要先于网卡驱动实现!
总线往往是复杂繁琐,然而又是标准统一的。
总线的标准化,使其很难做到百花齐放,也给开发人员带来了便利。
3。网卡驱动在linux内核中的配置依赖性
PCMCIA网卡要求内核首先支持PCMCIA总线。
USB网卡要求内核首先支持USB总线。
总线是由总线控制器实现,总线控制器作为一个物理设备当然也是需要驱动程序支持。
这就是所谓的依赖性了。
4。举个网卡驱动开发的例子,讲述一下分析过程。
目前有个项目要求如下:
1。该网卡采用芯片A ,芯片A的定位于桌面系统应用。
2。芯片A只支持1000M速率
3。网卡要求提供两种型号,USB接口,PCI-E接口。
4。芯片A内部含有MAC,没有PHY
思考题:该网卡是有线还是无线的呢??
分析过程:
1。驱动程序要提供两个,一个是USB网卡驱动,一个是PCI-E驱动。
2。网卡速率为1000M,由于对电脑的接口不同,对驱动开发来说存在很大差异性。
USB2.0的速率为480M,PCI-E受E*X的影响。网卡体现到CPU面前的速率差别比较大。
USB网卡要考虑提升性能,PCI-E网卡考虑对CPU负荷的影响。
3。USB网卡的驱动必须符合USB规范,使用USB内核接口注册设备
PCI-E网卡的驱动符合PCI规范,使用PCI内核接口即可。
4。驱动代码具体实现发送数据包和接收数据包时,必须考虑1000M速率对性能的影响。
到底是采用中断方式还是查询方式,取决于应用环境。
将来作为产品测试性能时:
USB网卡的实际速率<<1000M,可能才100M
PCI-E网卡的实际速率<1000M,但可能有800M的吞吐量