课程设计(论文)-Linux网络设备驱动程序设计

上传人:aa****6 文档编号:30011165 上传时间:2018-01-26 格式:DOC 页数:24 大小:91KB
返回 下载 相关 举报
课程设计(论文)-Linux网络设备驱动程序设计_第1页
第1页 / 共24页
课程设计(论文)-Linux网络设备驱动程序设计_第2页
第2页 / 共24页
课程设计(论文)-Linux网络设备驱动程序设计_第3页
第3页 / 共24页
课程设计(论文)-Linux网络设备驱动程序设计_第4页
第4页 / 共24页
课程设计(论文)-Linux网络设备驱动程序设计_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《课程设计(论文)-Linux网络设备驱动程序设计》由会员分享,可在线阅读,更多相关《课程设计(论文)-Linux网络设备驱动程序设计(24页珍藏版)》请在金锄头文库上搜索。

1、彭胜 Linux 网络驱动程序设计 第 1 页 共 24 页1 引 言Linux 网络设备驱动程序是 Linux 操作系统网络应用中的一个重要的组成部分,分析其运行机理,对于设计 Linux 网络应用程序是很有帮助的。我们可以在网络驱动程序这一级做一些与应用相关联的特殊事情,例如,在设计 Linux防火墙和网络入侵检测系统时可以在网络驱动程序的基础上拦截网络数据包,继而对其进行分析。由于 Linux 是开放源代码的,这给我们提供了一个绝好的机会来分析和改造网络驱动程序使其满足自己的特殊应用。本文就 Linux 内核中的网络驱动程序部分进行了详细的讨论,并给出了实现 Linux 网络驱动程序的重

2、要过程及一种实现模式和具体实例。随着当今世界经济的发展,计算机网络被广泛应用到各个领域,而网络设备的应用都必须要驱动程序来驱动,因而设计功能强大的网络设备驱动程序设计成为开发和设计的关键,而 Linux 操作系统源代码的开放性和较强的可移植性味操作人员提供了一个分析和编写网络驱动程序的优越环境,可以达到特殊应用的要求。1.1 Linux 设备驱动程序分类Linux 设备驱动程序在 Linux 的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在 Linux 内核的不断升级过程中,驱动程序的结构还是相对稳定。在 2.0.xx 到 2.2.xx 的变动里,驱动程序的编写做了

3、一些改变,但是从 2.0.xx 的驱动到 2.2.xx 的移植只需做少量的工作。Linux 系统的设备分为字符设备(char device) ,块设备(block device) 和网络设备(net work device)三种。字符设备是指存取时没有缓存的设备。块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access),字符设备则没有这个要求。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM 等。一个文件系统要安装进入操作系统必须在块设备上。网络设备在Linux 里做专门的处理。Linux 的网络系统主要是基于 BSD unix 的

4、socket 机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支彭胜 Linux 网络驱动程序设计 第 2 页 共 24 页持 【1】 。 1.2 驱动程序的一些基本概念无论是什么操作系统的驱动程序,都有一些通用的概念。操作系统提供给驱动程序的支持也大致相同。下面简单介绍一下网络设备驱动程序的一些基本要求。(1)发送和接收这是一个网络设备最基本的功能。一块网卡所做的无非就是收发工作。所以驱动程序里要告诉系统你的发送函数在哪里,系统在有数据要发送时就会调用你的发 送程序。还有驱动程序由于是直接操

5、纵硬件的,所以网络硬件有数据收到最先能得到这个数据的也就是驱动程序,它负责把这些原始数据进行必要的处理然后送给系统。这里,操作系统必须要提供两个机制,一个是找到驱动程序的发送函数,一个是驱动程序把收到的数据送给系统 【2】 。(2)中断中断在现代计算机结构中有重要的地位。操作系统必须提供驱动程序响应中断的能力。一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后 调用驱动程序的处理程序。Linux 支持中断的共享,即多个设备共享一个中断。(3)时钟在实现驱动程序时,很多地方会用到时钟。如某些协议里的超时处理,没有中断机制的硬件的轮询等。操作系统应为驱动程序提供定时机制。一般是在预定

6、的时 间过了以后回调注册的时钟函数。在网络驱动程序中,如果硬件没有中断功能,定时器可以提供轮询(poll)方式对硬件进行存取。或者是实现某些协议时需要的超时重传等 【3】 。彭胜 Linux 网络驱动程序设计 第 3 页 共 24 页2 驱动程序设计原理2.1 体系结构图 1 Linux 网络驱动程序体系结构Linux 网络驱动程序的体系结构如图 1 所示。可以划分为四层,从上到下分别为协议接口层,网络设备接口层,再就是提供实际功能的设备驱动功能层,以及网络设备和网络媒介层。我们在设计网络驱动程序时,最主要的工作就是完成设备驱动功能层,使其满足我们自己所需的功能。在 Linux 中对所有网络设

7、备都抽 象 为 一 个 接 口 , 这 个 接 口 提 供 了 对 所 有 网 络 设 备 的 操 作 集 合 。 由 数据 结 构 struct device 来表示网络设备在内核中的运行情况,即网络设备接口,它既包括纯软件网络设备接口,如环路(Loopback) ,也可以包括硬件网络设备接口,如以太网卡。而由以 dev_base 为头指针的设备链表来集体管理所有网络设备,该设备链表中的每个元素代表一个网络设备接口。数据结构 device 中有很多供系访问和协议层调用的设备方法,包括供设备初始化和往系统注册用的init 函数,打开和关闭网络设备的 open 和 stop 函数,处理数据包发送

8、的函数hard_start_xmit,以及中断处理函数等。有关 device 数据结构(在内核中也就是net_device)的详细内容,请参看 /linux/include/linux/netdevice.h。2.2 初始化网络设备的初始化主要是由 device 数据结构中的 init 函数指针所指的初始化函数来完成的,当内核启动或加载网络驱动模块的时候,就会调用初始化过程。dev_queue_xmit() netif_rx()struct device数据包发送hard_start_xmit()网络物理设备媒介中断处理(数据包接收)网络协议接口层网络设备接口层设备驱动功能层设备媒介层彭胜 L

9、inux 网络驱动程序设计 第 4 页 共 24 页在这其中将首先检测网络物理设备是否存在,这是通过检测物理设备的硬件特征来完成,然后再对设备进行资源配置,这些完成之后就要构造设备的 device 数据结构,把检测到的数值来对 device 中的变量初始化,这一步很重要。最后向Linux 内核中注册该设备并申请内存空间。2.3 数据包的发送与接收数据包的发送和接收是实现 Linux 网络驱动程序中两个最关键的过程,对这两个过程处理的好坏将直接影响到驱动程序的整体运行质量。图 1 中也很明确地说明了网络数据包的传输过程。首先在网络设备驱动加载时,通过 device 域中的 init 函数指针调用

10、网络设备的初始化函数对设备进行初始化,如果操作成功就可以通过 device 域中的 open 函数指针调用网络设备的打开函数打开设备,再通过 device 域中的建立硬件包头函数指针 hard_header 来建立硬件包头信息。最后通过协议接口层函数 dev_queue_xmit(详见/linux/net/core/dev.c)来调用device 域中的 hard_start_xmit 函数指针来完成数据包的发送。该函数将把存放在套接字缓冲区中的数据发送到物理设备,该缓冲区是由数据结构 sk_buff (详见/linux/include/linux/sk_buff.h)来表示的。数据包的接收是

11、通过中断机制来完成的,当有数据到达时,就产生中断信号,网络设备驱动功能层就调用中断处理程序,即数据包接收程序来处理数据包的接收,然后网络协议接口层调用 netif_rx 函数(详见/linux/net/core/dev.c)把接收到的数据包传输到网络协议的上层进行处理。彭胜 Linux 网络驱动程序设计 第 5 页 共 24 页3 实现模式实现 Linux 网络设备驱动功能主要有两种形式,一是通过内核来进行加载,当内核启动的时候,就开始加载网络设备驱动程序,内核启动完成之后,网络驱动功能也随即实现了,再就是通过模块加载的形式。比较两者,第二种形式更加灵活,在此着重对模块加载形式进行讨论。模块设

12、计是 Linux 中特有的技术,它使 Linux 内核功能更容易扩展。采用模块来设计 Linux 网络设备驱动程序会很轻松,并且能够形成固定的模式,任何人只要依照这个模式去设计,都能设计出优良的网络驱动程序。先简要概述一下基于模块加载的网络驱动程序的设计步骤,后面还结合具体实例来讲解。首先通过模块加载命令 insmod 来把网络设备驱动程序插入到内核之中。然后insmod 将调用 init_module()函数首先对网络设备的 init 函数指针初始化,再通过调用 register_netdev()函数在 Linux 系统中注册该网络设备,如果成功,再调用 init 函数指针所指的网络设备初始

13、化函数来对设备初始化,将设备的 device数据结构插入到 dev_base 链表的末尾。最后可以通过执行模块卸栽命令 rmmod 来调用网络驱动程序中的 cleanup_module()函数来对网络驱动程序模块卸载。具体实现过程见图 2 所示。insmod 命令init_module()打开网络接口设备init 指针调用初始化函数register_netdev()关闭网络接口设备模块卸载数据包发送与接收操作彭胜 Linux 网络驱动程序设计 第 6 页 共 24 页图 2 Linux 网络设备驱动程序实现模式通过模块初始化网络接口是在编译内核时标记为编译为模块,系统在启动时并不知道该接口的存

14、在,需要用户在/etc/rc.d/目录中定义的初始启动脚本中写入命令或手动将模块插入内核空间来激活网络接口。这也给我们在何时加载网络设备驱动程序提供了灵活性。彭胜 Linux 网络驱动程序设计 第 7 页 共 24 页4 详细设计4.1 网络驱动程序的结构所有的 Linux 网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device 结构) ,它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的 this 引用) 。一个网络设备最基本的方法有初始化、发送和接收。- - |deliver packets | |receive packets queue| |(dev_queue_xmit() | |them(netif_rx() | - - | | / / | | -| methods and variables(initialize,open,close,hard_xmit,| | interrupt handler,config,resources,status.) | - | | / / | | - - |send to hardware | |receivce from hardware| - - | | / / | | -

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号