📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: jot (guest it), 信区: Linux <BR>标 题: Linux网络驱动程序编写(转寄) <BR>发信站: BBS 水木清华站 (Sun Aug 15 11:32:18 1999) <BR> <BR>发信人: Bordi (halfelf), 信区: linux <BR>标 题: Linux网络驱动程序编写 <BR>发信站: 饮水思源站 (Thu Aug 5 21:56:40 1999) , 转信 <BR> <BR> 工作需要写了我们公司一块网卡的Linux驱动程序。经历一个从无到有的过程, <BR>深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜 <BR>爱。真希望她能在中国迅速成长。把程序文档贴出来,希望和大家探讨Linux技术 <BR>和应用,促进Linux在中国的普及。 <BR> 本文可随意转载,但请不要在盈利性出版物上刊登。 <BR> <BR>------------------ Linux操作系统网络驱动程序编写 ------------------- <BR>------------ Contact the author by <A HREF="mailto:mailto:bordi@bordi.dhs.org">mailto:bordi@bordi.dhs.org</A> ------ <BR> <BR>Linux操作系统网络驱动程序编写 <BR> <BR>一.Linux系统设备驱动程序概述 <BR> 1.1 Linux设备驱动程序分类 <BR> 1.2 编写驱动程序的一些基本概念 <BR>二.Linux系统网络设备驱动程序 <BR> 2.1 网络驱动程序的结构 <BR> 2.2 网络驱动程序的基本方法 <BR> 2.3 网络驱动程序中用到的数据结构 <BR> 2.4 常用的系统支持 <BR>三.编写Linux网络驱动程序中可能遇到的问题 <BR> 3.1 中断共享 <BR> 3.2 硬件发送忙时的处理 <BR> 3.3 流量控制(flow control) <BR> 3.4 调试 <BR>四.进一步的阅读 <BR>五.杂项 <BR> <BR> <BR> <BR> <BR>一.Linux系统设备驱动程序概述 <BR>1.1 Linux设备驱动程序分类 <BR> Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日 <BR>益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构 <BR>还是相对稳定。在2.0.xx到2.2.xx的变动里,驱动程序的编写做了一些改变,但是 <BR>从2.0.xx的驱动到2.2.xx的移植只需做少量的工作。 <BR> <BR> Linux系统的设备分为字符设备(char device),块设备(block device)和网络 <BR>设备(network device)三种。字符设备是指存取时没有缓存的设备。块设备的读写 <BR>都有缓存来支持,并且块设备必须能够随机存取(random access),字符设备则没有 <BR>这个要求。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘 <BR>设备,CD-ROM等。一个文件系统要安装进入操作系统必须在块设备上。 <BR> <BR> 网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket <BR>机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系 <BR>统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。 <BR> <BR> <BR>1.2 编写驱动程序的一些基本概念 <BR> 无论是什么操作系统的驱动程序,都有一些通用的概念。操作系统提供给驱动 <BR>程序的支持也大致相同。下面简单介绍一下网络设备驱动程序的一些基本要求。 <BR> <BR>1.2.1 发送和接收 <BR> 这是一个网络设备最基本的功能。一块网卡所做的无非就是收发工作。所以驱 <BR>动程序里要告诉系统你的发送函数在哪里,系统在有数据要发送时就会调用你的发 <BR>送程序。还有驱动程序由于是直接操纵硬件的,所以网络硬件有数据收到最先能得 <BR>到这个数据的也就是驱动程序,它负责把这些原始数据进行必要的处理然后送给系 <BR>统。这里,操作系统必须要提供两个机制,一个是找到驱动程序的发送函数,一个 <BR>是驱动程序把收到的数据送给系统。 <BR> <BR>1.2.2 中断 <BR> 中断在现代计算机结构中有重要的地位。操作系统必须提供驱动程序响应中断 <BR>的能力。一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后 <BR>调用驱动程序的处理程序。Linux支持中断的共享,即多个设备共享一个中断。 <BR> <BR>1.2.3 时钟 <BR> 在实现驱动程序时,很多地方会用到时钟。如某些协议里的超时处理,没有中 <BR>断机制的硬件的轮询等。操作系统应为驱动程序提供定时机制。一般是在预定的时 <BR>间过了以后回调注册的时钟函数。在网络驱动程序中,如果硬件没有中断功能,定 <BR>时器可以提供轮询(poll)方式对硬件进行存取。或者是实现某些协议时需要的超时 <BR>重传等。 <BR> <BR>二.Linux系统网络设备驱动程序 <BR> <BR>2.1 网络驱动程序的结构 <BR> 所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。 <BR>一个设备就是一个对象(device 结构),它内部有自己的数据和方法。每一个设备的 <BR>方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身 <BR>的数据(类似面向对象程序设计时的this引用)。 <BR> 一个网络设备最基本的方法有初始化、发送和接收。 <BR> <BR> ------------------- --------------------- <BR> |deliver packets | |receive packets queue| <BR> |(dev_queue_xmit()) | |them(netif_rx()) | <BR> ------------------- --------------------- <BR> | | / \ <BR> \ / | | <BR> ------------------------------------------------------- <BR> | methods and variables(initialize,open,close,hard_xmit,| <BR> | interrupt handler,config,resources,status...) | <BR> ------------------------------------------------------- <BR> | | / \ <BR> \ / | | <BR> ----------------- ---------------------- <BR> |send to hardware | |receivce from hardware| <BR> ----------------- ---------------------- <BR> | | / \ <BR> \ / | | <BR> ----------------------------------------------------- <BR> | hardware media | <BR> ----------------------------------------------------- <BR> <BR> 初始化程序完成硬件的初始化、device中变量的初始化和系统资源的申请。发送 <BR>程序是在驱动程序的上层协议层有数据要发送时自动调用的。一般驱动程序中不对发 <BR>送数据进行缓存,而是直接使用硬件的发送功能把数据发送出去。接收数据一般是通 <BR>过硬件中断来通知的。在中断处理程序里,把硬件帧信息填入一个skbuff结构中,然 <BR> <BR>------------------ Linux操作系统网络驱动程序编写 ------------------- <BR>------------ Contact the author by <A HREF="mailto:mailto:bordi@bordi.dhs.org">mailto:bordi@bordi.dhs.org</A> ------ <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -