⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000004.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -