工作需要写了我们公司一块网卡的Linux驱动程式。经历一个从无到有的过程,
深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜
爱。真希望她能在中国迅速成长。把程式文档贴出来,希望和大家探讨Linux技术
和应用,促进Linux在中国的普及。
本文可随意转载,但请不要在盈利性出版物上刊登。

Linux驱动程式


工作需要写了我们公司一块网卡的Linux驱动程式。经历一个从无到有的过程,
深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜
爱。真希望她能在中国迅速成长。把程式文档贴出来,希望和大家探讨Linux技术
和应用,促进Linux在中国的普及。
本文可随意转载,但请不要在盈利性出版物上刊登。

------------------ Linux操作系统网络驱动程式编写 -------------------
------------ Contact the author by mailto:bordi@bordi.dhs.org ------

Linux操作系统网络驱动程式编写

一.Linux系统设备驱动程式概述
1.1 Linux设备驱动程式分类
1.2 编写驱动程式的一些基本概念
二.Linux系统网络设备驱动程式
2.1 网络驱动程式的结构
2.2 网络驱动程式的基本方法
2.3 网络驱动程式中用到的数据结构
2.4 常用的系统支持
三.编写Linux网络驱动程式中可能碰到的问题
3.1 中断共享
3.2 硬件发送忙时的处理
3.3 流量控制(flow control)
3.4 调试
四.进一步的阅读
五.杂项




一.Linux系统设备驱动程式概述
1.1 Linux设备驱动程式分类
Linux设备驱动程式在Linux的内核源代码中占有很大的比例,源代码的长度日
益增加,主要是驱动程式的增加。在Linux内核的不断升级过程中,驱动程式的结构
还是相对稳定。在2.0.xx到2.2.xx的变动里,驱动程式的编写做了一些改变,但是
从2.0.xx的驱动到2.2.xx的移植只需做少量的工作。

Linux系统的设备分为字符设备(char device),块设备(block device)和网络
设备(network device)三种。字符设备是指存取时没有缓存的设备。块设备的读写
都有缓存来支持,并且块设备必须能够随机存取(random access),字符设备则没有
这个需要。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘
设备,CD-ROM等。一个文档系统要安装进入操作系统必须在块设备上。

网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket
机制。在系统和驱动程式之间定义有专门的数据结构(sk_buff)进行数据的传递。系
统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。


1.2 编写驱动程式的一些基本概念
无论是什么操作系统的驱动程式,都有一些通用的概念。操作系统提供给驱动
程式的支持也大致相同。下面简单介绍一下网络设备驱动程式的一些基本需要。

1.2.1 发送和接收
这是个网络设备最基本的功能。一块网卡所做的无非就是收发工作。所以驱
动程式里要告诉系统您的发送函数在哪里,系统在有数据要发送时就会调用您的发
送程式。更有驱动程式由于是直接操纵硬件的,所以网络硬件有数据收到最先能得
到这个数据的也就是驱动程式,他负责把这些原始数据进行必要的处理然后送给系
统。这里,操作系统必须要提供两个机制,一个是找到驱动程式的发送函数,一个
是驱动程式把收到的数据送给系统。

1.2.2 中断
中断在现代电脑结构中有重要的地位。操作系统必须提供驱动程式响应中断
的能力。一般是把一个中断处理程式注册到系统中去。操作系统在硬件中断发生后
调用驱动程式的处理程式。Linux支持中断的共享,即多个设备共享一个中断。

1.2.3 时钟
在实现驱动程式时,很多地方会用到时钟。如某些协议里的超时处理,没有中
断机制的硬件的轮询等。操作系统应为驱动程式提供定时机制。一般是在预定的时
间过了以后回调注册的时钟函数。在网络驱动程式中,假如硬件没有中断功能,定
时器能够提供轮询(poll)方式对硬件进行存取。或是实现某些协议时需要的超时
重传等。

二.Linux系统网络设备驱动程式

2.1 网络驱动程式的结构
任何的Linux网络驱动程式遵循通用的接口。设计时采用的是面向对象的方法。
一个设备就是个对象(device 结构),他内部有自己的数据和方法。每一个设备的
方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就能够存取自身
的数据(类似面向对象程式设计时的this引用)。
一个网络设备最基本的方法有初始化、发送和接收。

------------------- ---------------------
|deliver packets | |receive packets queue|
|(dev_queue_xmit()) | |them(netif_rx()) |

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!