新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux网卡驱动程序编写

Linux网卡驱动程序编写

作者:时间:2012-05-09来源:网络收藏

工作需要写了我们公司一块。经历一个从无到有的过程,深感技术交流的重要。作为挑战微软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把程序文档贴出来,希望和大家探讨技术和应用,促进Linux在中国的普及。

本文引用地址:http://www.eepw.com.cn/article/149108.htm

Linux操作系统网络

一.Linux系统设备概述

1.1Linux设备驱动程序分类

1.2驱动程序的一些基本概念

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

2.1网络驱动程序的结构

2.2网络驱动程序的基本方法

2.3网络驱动程序中用到的数据结构

2.4常用的系统支持

三.Linux网络驱动程序中可能遇到的问题

3.1中断共享

3.2硬件发送忙时的处理

3.3流量控制(flowcontrol)

3.4调试

四.进一步的阅读

五.杂项

一.Linux系统设备驱动程序概述

1.1Linux设备驱动程序分类

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

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

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

1.2编写驱动程序的一些基本概念

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

1.2.1发送和接收

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

1.2.2中断

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

1.2.3时钟

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

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

2.1网络驱动程序的结构

所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this引用)。

一个网络设备最基本的方法有初始化、发送和接收。

----------------------------------------

|deliverpackets||receivepacketsqueue|

|(dev_queue_xmit())||them(netif_rx())|

----------------------------------------

||/

/||

-------------------------------------------------------

|methodsandvariables(initialize,open,close,hard_xmit,|

|interrupthandler,config,resources,status...)|

-------------------------------------------------------

||/

/||

---------------------------------------

|sendtohardware||receivcefromhardware|

---------------------------------------

||/

/||

-----------------------------------------------------

|hardwaremedia|

-----------------------------------------------------

初始化程序完成硬件的初始化、device中变量的初始化和系统资源的申请。发送程序是在驱动程序的上层协议层有数据要发送时自动调用的。一般驱动程序中不对发送数据进行缓存,而是直接使用硬件的发送功能把数据发送出去。接收数据一般是通过硬件中断来通知的。在中断处理程序里,把硬件帧信息填入一个skbuff结构中,然后调用netif_rx()传递给上层处理。

2.2网络驱动程序的基本方法

网络设备做为一个对象,提供一些方法供系统访问。正是这些有统一接口的方法,掩蔽了硬件的具体细节,让系统对各种网络设备的访问都采用统一的形式,做到硬件无关性。

下面解释最基本的方法。

2.2.1初始化(initialize)

驱动程序必须有一个初始化方法。在把驱动程序载入系统的时候会调用这个初始化程序。它做以下几方面的工作。检测设备。在初始化程序里你可以根据硬件的特征检查硬件是否存在,然后决定是否启动这个驱动程序。配置和初始化硬件。在初始化程序里你可以完成对硬件资源的配置,比如即插即用的硬件就可以在这个时候进行配置(Linux内核对PnP功能没有很好的支持,可以在驱动程序里完成这个功能)。配置或协商好硬件占用的资源以后,就可以向系统申请这些资源。有些资源是可以和别的设备共享的,如中断。有些是不能共享的,如IO、DMA。接下来你要初始化device结构中的变量。最后,你可以让硬件正式开始工作。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 4 5 6 下一页

评论


相关推荐

技术专区

关闭