Linux网路卡驱动程式分析(NE2000为例)

本文深入探讨Linux网路卡驱动程式,包括探测硬体、中断处理、I/O埠读写,并通过实例分析NE2000网路卡驱动程式。文章指出,在不考虑网路传输时间的情况下,封包处理主要耗时在网路卡发送、接收和DMA操作。此外,文章还提供了中断处理的详细流程,包括快速中断与慢速中断的区别,以及如何避免竞争状态。最后,通过测试分析了封包发送和接收的流程,以及中断处理的时间消耗,为优化驱动程式提供了依据。
摘要由CSDN通过智能技术生成
1
Linux网路卡驱动程式 : 追踪与效能分析
投稿领域:网路软体
陈一玮 林盈达
国立交通大学资讯科学系
新竹市大学路1001号
TEL:(03)5712121 EXT. 56667
E-MAIL:iwchen@cis.nctu.edu.tw , ydlin@cis.nctu.edu.tw
主要联络人:陈一玮TEL:0927308032
摘要
一部电脑的网路元件可分成硬体和软体两部分,硬体方面有网路卡,网路线等,软体方面有网
路卡驱动程式( Adapter driver ),协定驱动程式( protocol driver )及应用软体,其中网路卡驱
动程式负责衔接硬体与软体,本文解说装置驱动程式运作的流程,找出撰写装置驱动程式的重点与
要领,以 Linux网路卡驱动程式为例说明,并对它做一些测试与分析.分析之後发现到在不考虑网
路传输时间(propagation time)的条件下,封包处理上较花时间的顺序为: (1) 网路卡发送
(transmit),接受(receive)封包 ,(2) DMA(直接存取记忆体)封包,(3) 网路卡驱动程式(CPU执行
时间),三者所花的时间比例大约为250 : 30 : 1,这是以封包大小1028byte来测试的结果,封包
愈大三者的比例会愈悬殊,可见发送(或接收)及DMA封包是时间瓶颈所在;除此之外,也了解在
中断处理时"新封包来到"的情形比"封包传送完毕"要花多一点时间.
关键字: Linux,协定驱动程式,网路卡驱动程式,ISR,IRQ,I/O port,DMA.
1. 简介
2
作业系统的主要功能之一就是控制电脑周边装置的输入,输出.而用来控制的软体主要可以分
为四个部分,请参考图一.我们可以看出驱动程式( Driver )在现今的电脑实作架构中处於一个相
当重要的地位,它要能 "吃软" 也要能 "吃硬".通常中断处理常式可以视为是驱动程式的一部
分.
相对於网路卡驱动程式( Adapter driver )而言,它所要吃的 "软" 就是上层的协定驱动程
式( Protocol driver),也就TCP/IP protocol stack;而它所要吃的 "硬"就是下层的网路卡,
说得更详细点,便是要和网路卡上的MAC Controller沟通,透过MAC Controller上的registers
来交换讯息,以达到网路卡驱动程式的主要工作之一:将封包传送给网路卡或者是从网路卡上抓取
已经到达的封包;而另一项主要的工作,是将从网路卡上抓取到的封包传递给上层的协定驱动程式,
或者是将从协定驱动程式收到的封包传递给网路卡,请参考图二.
使用者行程
Device-independent软体
驱动程式
中断处理常式
硬体
I/O call , spooling
Naming , protection , allocation
Setup device registers , check status
Wakeup driver when I/O completed
Perform I/O operations
I/O 请求 I/O 回覆
图一:I/O系统中的分层以及各层的主要函式
I/O 函式
核心 网路卡驱动程式 网路卡
出境封包
入境封包
出境封包
入境封包
图二:网路卡驱动程式的主要工作
3
2. 撰写驱动程式
如何正确地在 Linux作业系统中撰写一个驱动程式呢 以下我们将分为探测硬体 (probe
hardware),中断处理 (interrupt handling),使用I/O埠 (Using I/O ports) 读取及写入资料这三
大部分来一一解说.
2.1 探测硬体(probe hardware)
在一个驱动程式可以和装置做沟通前,必须要做的一些初始化工作包括:探测装置的I/O
ports和IRQ number.有了I/O ports才可以和装置上的某些暂存器(register)沟通,有了IRQ
number才能正确地将中断处理常式注册到核心之中.探测硬体的方法和汇流排(bus)的种类
有关,PCI介面的装置是在开机时(boot)就自动会将所用的I/O ports及IRQ number存在其某
些暂存器上,而驱动程式只需去读取这些暂存器就可以了,并不需要真正的去探测装置,
但ISA介面的装置驱动程式就必须要实际地去做探测的工作.
在PCI介面方面, Linux核心2.4版更进一步地将I/O ports及IRQ number整合在系统资
源中 (pci_dev structure),因此在驱动程式中就不必直接由装置上的暂存器来获得I/O ports
和IRQ number,而只需呼叫下列函式即可由系统资源取得:
int pci_enable_device (struct pci_dev *dev);
unsigned long pci_resource_start(struct pci_dev *dev, int bar);
struct resource *request_region (unsigned long start , unsigned long len , char*
name);
void release_region (unsigned long start , unsigned long len);
想要取得I/O ports和IRQ number以前,一定要呼叫pci_enable_device( )来启动
这个PCI装置,接下来若是要IRQ number,就可从dev->irq中获得,若是要
I/O ports就呼叫pci_resource_start( ) 来取得基底位址( base address ),然後呼叫
request_region( )向系统宣告要用某一段的I/O ports即可使用,最後若没有要用
时要记得呼叫release_region( )来释放这段I/O ports.
至於ISA介面的装置就麻烦许多,在探测I/O ports方面所用的机制( mechanism )是去
"扫瞄"( scan )所有可能的I/O ports,只有与装置连接的I/O ports才会有正确的回应,
4
以下是大概的流程:
1. int check_region (unsigned long start , unsigned long len );
这个函式是用来检查这一段I/O ports是否可以拿来使用.
2. 实际去探测硬体,察看此装置是否存在,在此必须尽量必免"写入"的动作,因为不小心
的写入会让系统出现很多问题.
3. 呼叫reque
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值