Linux下网络驱动程序设计与开发.doc
《Linux下网络驱动程序设计与开发.doc》由会员分享,可在线阅读,更多相关《Linux下网络驱动程序设计与开发.doc(42页珍藏版)》请在沃文网上搜索。
1、滨州学院本科毕业设计(论文) Linux下网络驱动程序设计与开发摘 要作为Unix操作系统的一个衍生系统,Linux普及与发展的非常迅速,Linux操作系统被许多企业和个人所使用, Linux操作系统可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机,这就使Linux下设备驱动程序的开发变得愈来重要,但是Linux操作系统的设备种类繁多,缺少一种通用的驱动程序适用于Linux操作系统的各种设备之中,针对Linux网络设备,需要设计出相应的网络驱动程序。本论文通过对Linux 网络设备驱动程序的工作原理和结构组成的研究,探讨Linux环境下网
2、络驱动程序的开发过程,首先详细的对Linux设备驱动程序进行分析介绍,其次介绍了ARM驱动程序开发的硬件环境和软件环境,阐述了该驱动程序在开发时的需求分析。第三对Linux环境下网络驱动程序的设计与实现作了理论上的探讨。 对于驱动程序而言,核心问题之一就是如何完成调试,本论文在对网络驱动程序的调试过程中, 使用了一种独特的printk方法,是调试过程变得简单,避免了对驱动程序的重复操作 。关键词:Linux; 网络驱动程序;TCP/IP协议Development and design of linux network card drivers AbstractLinux technology
3、is a hotspot among computer technology nowadays, and it developes at high speed not only in our country but also in the whole world, and it has applied widely in embedded system, server, network system, security area and so on. So it makes that grasping the development technology under the Linux env
4、ironment is more and more noticeable in computer industry.One of the many advantages of free operating systems, as typified by Linux, is that their internals are open for all to view. The Linux kernel remains large and complex body of code. User activities are performed by means of a set of standard
5、ized calls that are independent of the specific driver; mapping those calls to device-specific operations that act on real hardware is then the role of the device driver.Allocating IP addresses and subnet masks differentiating network and host, through construction of TCP/IP network in Linux. Config
6、uring hosts IP arguments dynamically to well solve the problem of manual configuration, through Key words:linux; network card drivers;The TCP/IP protocol II目 录第一章 绪论11.1课题的目的和意义11.1.1课题的研究目的11.1.2课题的研究意义11.2课题的国内外研究现状11.3 本文主要内容2第二章 LINUX设备驱动程序42.1 Linux设备驱动程序概述42.1.1 Linux设备驱动程序分类4第三章 LINUX下网络驱动程序6
7、3.1 Linux下网络驱动程序设计的数据结构和方法63.1.1网络驱动程序设计用到的数据结构63.1.2驱动网络驱动程序的基本方法93.2套接字缓冲区介绍113.3驱动模块的加载和卸载143.4编写网络驱动程序的一些基本概念153.4.1发送和接收153.4.2中断153.4.3时钟15第四章 系统分析174.1 S3C2410 ARM 开发板介绍174.2需求分析以及MII接口17第五章 LINUX下网络驱动程序具体实现205.1 Linux网络驱动程序体系结构205.1.1加载模块及初始化设备225.1.2初始化设备成员和函数245.1.3注册、打开、关闭设备285.1.4接受和发送数据
8、305.1.5设置参数和统计数据325.1.6统计网卡数据信息335.1.7 网络驱动程序调试33结论34参考文献35谢辞36附录 网络驱动程序代码36ii42滨州学院本科毕业设计(论文)第一章 绪论1.1课题的目的和意义随着人们对开放源代码软件热情的日益增高,Linux作为一个功能强大而稳定的开源操作系统,越来越受到计算机专家与爱好者的关注。在嵌入式领域中,通过对Linux进行小型化裁剪后,使其能够固化在容量只有几十兆字节的存储器芯片或单片机中,成为应用于特定场合的嵌入式Linux系统。Linux强大的网络支持功能实现了对包括TCP/IP在内的多种协议的支持,可以为嵌入式系统应用联网的需求提
9、供相应的解决方法。因此,在嵌入式系统开发调试时,Linux下网络驱动设计成为不可缺少的步骤。1.1.1课题的研究目的Linux操作系统的设备种类繁多,缺少一种通用的驱动程序适用于Linux操作系统的各种设备之中,由于Linux是开放的源代码,能够方便的给用户提供分析和设计网络驱动程序的机会,本课题针对Linux 网络设备驱动程序的结构组成和工作原理进行分析,主要对Linux下网络驱动程序的开发技术进行探究,着重对网络驱动的开发流程及具体实现细节进行讨论,最后进行必要的调试,设计出基于ARM的LINUX网络驱动程序。1.1.2课题的研究意义Linux系统的设备主要由字符设备,块设备和网络设备构成
10、,Linux设备驱动程序的增加,相应的Linux的内核源代码就会增加,Linux 网络设备驱动程序在Linux 操作系统内核中占有重要地位,掌握了Linux网络设备驱动程序的原理与设计技术,对于我们从事基于Linux平台的网络产品开发具有十分重要的意义。1.2课题的国内外研究现状Linux以其特有的高效、安全、可动态加载及源代码开放等特点,实现了快速的发展,Linux下网络驱动程序作为Linux操作系统网络应用的一个重要组成部分,其强大的网络处理能力、高稳定性和较强的安全性得到了普遍的认同,但不可回避的是Linux上的应用程序相对来说还十分有限,对各种硬件的支持远不如Windows系统,没有一
11、种能够通用的驱动程序适用于Linux各种硬件,在国内外的Linux网络驱动的研究中,人们发现网络设备作为三大设备之一,有着其非常特殊的地方,它与字符设备及块设备有很大的区别:1、在 Linux 的文件系统中,网络接口并不存在,在核心里,用device数据结构表示。在文件系统中,每一个字符设备或块设备都有一个对应的特殊设备文件来表示该设备,如/dev/hda1、/dev/sda1、/dev/tty1 等。在网络设备进行数据包的发送和接收时,可以径直通过接口访问,不需要进行文件的操作;而对字符设备和块设备的访问都需通过文件操作界面。 2、在系统初始化时,网络接口实时生成,对于核心支持的但不存在的物
12、理网络设备,将不可能有与之相对应的 device 结构。而对于字符设备和块设备,即使该物理设备不存在,在/dev 下也必定有相应的特殊文件与之相对应。且在系统初始化时,核心将会对所有内核支持的字符设备和块设备进行登记,初始化该设备的文件操作界面(struct file_operations) ,而不管该设备在物理上是否存在。1.3 本文主要内容论文首先对Linux下设备驱动程序设计的基本知识进行介绍,其中包括对Linux的发展历程、内核、特性的概述,Linux设备的分类及编写驱动程序的一些基本概念等,以及模块的加载和卸载。其次介绍了ARM驱动程序开发的硬件环境和软件环境。阐述了该驱动程序在开发
13、时的需求分析。第三对Linux环境下网卡驱动程序的设计与实现作了理论上的探讨,重点从网卡驱动模块的加载、网络设备的初始化、设备打开与关闭、数据的发送与接收、信息统计、网卡驱动模块的卸载等方面按步骤的进行了详细的讨论。通过组建在Linux操作系统下的TCP/IP网络,来分配IP地址以及区分网络号和主机号的子网掩码,通过配置DHCP服务器,实现动态地为主机配置IP参数,解决手工配置存在的问题。最后介绍了在驱动程序开发设计过程中所遇到的问题和困难以及是如何去克服这些困难的,并提出了今后的努力方向。38第二章 Linux设备驱动程序2.1 Linux设备驱动程序概述在 Linux内核里,驱动程序起着特
14、殊的作用。驱动程序可以让某个固定的硬件回应另一个定义好的编程接口,这些接口没有显示设备工作的具体过程。用户的活动通过一套规范的调用来实施,但是这些调用不隶属于特定的驱动程序。设备驱动程序的任务就是将这些调用映射到与作用到实际硬件设备有关的操作上。 这个编程接口能够允许驱动程序独立于内核其他部分而建立,需要的情形下能够在系统运行的时侯,“插入”内核。这种特点造成Linux驱动程序的编写非常容易,所以内核驱动程序的数目增长非常快,截至到现在已经有许多的驱动程序能够在Linux下被应用。2.1.1 Linux设备驱动程序分类在Linux的内核源代码中,Linux设备驱动程序占有比较大的比例,源代码的
15、长度的增加,增加的是驱动程序。随着Linux内核的升级,驱动程序的结构比较稳定。在Linux系统中,设备可以分为字符设备(char device),块设备(block device)和网络设备(net work device)三种。字符设备:字符设备是指存取时没有缓存的设备,块设备的读写都有缓存来支 持,并且块设备必须能够随机存取(random access),字符设备则没有这个要求。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。一个文件系统要安装进入操作系统必须在块设备上。块设备:块设备通过位于/dev目录下的文件系统节点来存取。块设备上可以包纳文件系统
16、。Linux能够允许应用程序如字符设备一样地读写块设备。网络接口:任何网络事件都是通过一个网络接口形成的,一个网络接口就是一个能够和其他主机交换数据的设备。通常,接口都是硬件设备,但也可能是纯软件设备,比如回环(loopback)接口。网络接口由内核中的网络子系统驱动,负责数据包的接收和发送,但它不需要了每项事务是如何映射到实际传送的数据包的。许多网络连接是面向流的,但网络设备却围绕数据包的传输和接收而设计。网络驱动程序不需要知道各个连接的相关信息,它只要处理数据包即可。第三章 Linux下网络驱动程序3.1 Linux下网络驱动程序设计的数据结构和方法全部Linux网络驱动程序使用通用的接口
17、。设计Linux下网络驱动程序时,我们使用的是面向对象的方法。一个设备就是一个对象(device 结构),在它内部,有自己的数据和方法。在调用每一个设备的方法时,第一个参数就是这个设备对象本身。这种方法就能够存取本身的数据。3.1.1网络驱动程序设计用到的数据结构位于网络驱动层核心位置的net_device1结构是我们理解网卡设备的最好切入点。(1) 全局信息net_device结构的第一部分是由以下成员构成:char nameIFNAMSIZ;设备称谓。如果由驱动程序设置名称,这样就包含%d格式串, register_netdev 用一个数字代替它使之成为一个唯一的名字,我们在分配时,编号从
18、0开始。unsigned long state;设备状态。设备状态包含一些数量的标志。在正常情况下,驱动程序不直接参与到操作这些标志的行动,而是由内核提供一组工具函数对这些标志进行特定操作。struct net_device *next;这是个指针,指向全局列表中下一个设备。驱动程序不参与修改这个成员。int (*init)(struct net_device *dev);初始化函数。如果对这个指针进行设置,register_netdev 调用这个函数用来完成对net_device结构的初始化。很多当今的网络驱动程序已经不再运用这个函数,它们的初始化工作是在注册接口前完成的。(2).硬件信息以
19、下的成员含有相对简单设备的低层硬件信息。它们延续了早期 Linux的 网络特点,它们仍然被现在许多驱动程序使用。unsigned long rmem_end;unsigned long rmem_start;unsigned long mem_end;unsigned long mem_start;设备的内存信息.。设备使用了共享内存,这些共享内存的开始地址和结束地址由这些成员保存。如果设备使用不同的接收和发送内存,发送内存使用mem成员,接收内存使用rmem成员。在驱动之外,rmem成员不被引用。根据要求,设置end成员的时候,我们要保证end - start等于可用的板卡内存量。unsig
20、ned long base_addr;网络接口的I/O基地址。我们驱动设备探测时给这个成员赋值。 Ifconfig命令能够来显示或修改当前值。在系统启动时、或者在模块加载时,base_addr在内核命令行中显式赋值。和内存成员一样的是,内核不使用它们。unsigned char irq;被赋予的中断号。当列出接口时,ifconfig命令打印出dev-irq的值。通常情况,这个值在启动或者加载时设置,然后用ifconfig命令修改。unsigned char if_port;在多端口设备中,指定使用哪个端口。例如,如果这个设备支持同轴电缆(IF_PORT_10BASE2)的同时,也支持双绞线(I
21、F_PORT_100BSAET)以太网连接,就可以使用该变量。完整的已知端口类型设置定义在。unsigned char dma;为设备分配的DMA通道。这个成员仅仅对一些外设总线有用,比如 ISA。 它仅仅用于显示信息(ifconfig命令)。ether_setup函数正确设置有关接口的许多信息,或者任何其他给定硬件类型适合的设置函数。以太网卡可以通过这个通用的函数,从而设置大部分这些成员,flags和dev_addr成员例外,它们是特定设备的, 所以在初始化时显示赋值。在一些非以太网接口中,我们也可以应用像ether_setup的辅助函数。deviers/net/net_init.c 输出了
22、包括下列的类似函数:void ltalk_setup(struct net_device *dev);设置一个 LocalTalk 设备的函数。void fc_setup(struct net_device *dev);初始化光通道设备。void fddi_setup(struct net_device *dev);配置一个光纤分布数据接口(FDDI)网络接口。void hippi_setup(struct net_device *dev);对高性能并行接口(HIPPI)的高速互连驱动的成员进行初始化。void tr_setup(struct net_device *dev);对令牌环网络接口
23、的设置进行处理。我们把大部分设备都归于这些类别中的一类。假如设备是一个比较新的类,就需要对下面的成员进行手工设置:unsigned short hard_header_len;硬件头部长度,就是在数据包中,位于IP头、其他协议信息之前的octet数目。对于以太网接口hard_header_len的值是14(ETH_HLEN)。unsigned mtu;最大传输单元(MTU)5。在网络层中,对于数据包的传输,使用该成员变量来驱动。 unsigned long tx_queue_len;设备发送队列中可以排队的最大帧数ether_setup把这个值设置为100,特殊的是我们可以更改它。例如,设置p
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 网络 驱动程序 设计 开发