ImageVerifierCode 换一换
格式:DOCX , 页数:54 ,大小:102.74KB ,
资源ID:11493684      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11493684.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linux网络设备分析.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

linux网络设备分析.docx

1、linux网络设备分析linux网络设备分析摘要 在本文中,起首概括了收集设备总体特点和工作道理,接着在分析了一个重要的数据构造device后,重点分析了收集设备的全部初始化工作过程;简单地分析了设备的打开和封闭的操作后,是有关数据包的传输和接收的分析;在最后,本文对写收集设备驱动法度榜样做了一个总结。以上的每部分的分析,差不多上在NE2000以太网卡的差不多长进行的。在附录中是一个虚拟的字符设备驱动法度榜样以及写那个法度榜样的领会,该法度榜样已成功应用过,它是在收集设备分析之前本人做的一个小小的实验。一.收集设备概述在LINUX中,为了简化对设备的治理,所有外围的硬件设备被归结为三类:字符设

2、备(如键盘、鼠标等)、块设备(如硬盘、光驱、软驱等)和收集设备(也称为收集接口,network inferface),如以太网卡。在本文中,我们将等效应用“收集设备”和“收集接口”这两个概念,而对某个具体的收集设备,我们将称之为“物理设备”或“物理收集设备”。为了樊篱收集情形中物理收集设备的多样性,LINUX对所有的物理设备进行抽象并定义了一个同一的概念,称之为接口(Interface)。所有对收集硬件的拜望差不多上经由过程接口进行的,接口供给了一个对所有类型的硬件一致化的操作集合来处理全然数据的发送和接收。一个收集接口被看作是一个发送和接收数据包(packets)的实体。关于每个收集接口,都

3、用一个device的数据构造表示,有关该数据构造的具体内容,将在本文的后面具体介绍。平日,收集设备是一个物理设备如以太网卡,但软件也能够作为收集设备,如回送设备(loopback)。在内核启动时,经由过程收集设备驱动法度榜样,将挂号存在的收集设备。设备用标准的支撑收集的机制来转递收到的数据到响应的收集层。所有被发送和接收的包都用数据构造sk_buff表示。这是一个具有专门好的灵活性的数据构造,能够专门轻易增长或删除收集协定数据包的首部。收集设备作为个中的三类设备之一,它有其专门专门的处所。它与字符设备及块设备都有专门大年夜的不合:收集接口不存在于Linux的文件体系中,而是在核心顶用一个dev

4、ice数据构造表示的。每一个字符设备或块设备则在文件体系中都存在一个响应的专门设备文件来表示该设备,如/dev/hda1、/dev/sda1、/dev/tty1等。收集设备在做数据包发送和接收时,直截了当经由过程接口拜望,不须要进行文件的操作;而对字符设备和块设备的拜望都需经由过程文件操作界面。收集接口是在体系初始化时及时生成的,关于核心支撑的但不存在的物理收集设备,将弗成能有与之相对应的device构造。而关于字符设备和块设备,即使该物理设备不存在,在/dev下也必定有响应的专门文件与之相对应。且在体系初始化时,核心将会对所有内核支撑的字符设备和块设备进行挂号,初始化该设备的文件操作界面(s

5、truct file_operations),而不管该设备在物理上是否存在。以上两点是收集设备与其他设备之间存在的最重要的不合。然而,它们之间又有一些合营之处,如在体系中一个收集设备的角色和一个安装的块设备类似。一个块设备在blk_dev数组及核心其他的数据构造中挂号本身,然后依照要求,经由过程本身的request_function函数“发送”和“接收”数据块。类似地,为了能与别处世界进行数据交换,一个收集接口也必须在一个专门的数据构造中挂号本身。在体系内核中,存在字符设备治理表chardevs和块设备治理表blkdevs,这两张储存着指向file_operations构造的指针的设备治理表,

6、分别用来描述各类字符驱动法度榜样和块设备驱动法度榜样。类似地,在内核中也存在着一张收集接口治理表dev_base,但与前两张表不合,dev_base是指向device构造的指针,因为收集设备是经由过程device数据构造来表示的。dev_base实际上是一条device构造链表的表头,在体系初始化完成今后,体系检测到的收集设备将主动地储存在这张链表中,个中每一个链表单位表示一个存在的物理收集设备。当要发送数据时,收集子体系将依照体系路由表选择响应的收集接口进行数据传输,而当接收到数据包时,经由过程驱动法度榜样挂号的中断办事法度榜样进行数据的接收处理(软件收集接口除外)。以下是收集设备工作道理图

7、:图一 Linux收集设备工作道理图每一个具体的收集接口都应当有一个名字,以在体系中能独一标识一个收集接口。平日一个名字仅注解该接口的类型。Linux对收集设备定名有以下商定:(个中N为一个非负整数)ethN 以太网接口,包含10Mbps和100Mbps;trN 令牌环接口;slN SLIP收集接口;pppN PPP收集接口,包含同步和异步;plipN PLIP收集接口,个中N与打印端标语雷同;tunlN IPIP紧缩频道收集接口;nrN NetROM虚拟设备接口;isdnN ISDN收集接口;dummyN 空设备;lo 回送收集接口。二.重要数据构造struct device构造device

8、储备一个收集接口的重要信息,是收集驱动法度榜样的核心。在逻辑上,它能够瓜分为两个部分:可见部分和隐藏部分。可见部分是由外部赋值;隐藏部分的域段仅面向体系内部,它们能够随时被改变。下面我们将对之进行具体的分析和解剖。/* from include/linux/netdevice.h */struct device 1.属性 char *name;设备的名字。假如第一字符为NULL(即0),register_netdev (drivers/net/net_init.c)将会赋给它一个n最小的可用收集设备名ethn。 unsigned long rmem_end; /* shmem recv end

9、 */ unsigned long rmem_start; /* shmem recv start */ unsigned long mem_end; /* shared mem end */ unsigned long mem_start; /* shared mem start */这些域段标识被设备应用的共享内存的首地址及尾地址。假如设备用来接收和发送的内存块不合,则mem域段用来标识发送的内存地位,rmem用来标识接收的内存地位。mem_start和mem_end可在体系启动时用内核的敕令行指定,用ifconfig能够查看它们的值。rmem域段从来不被驱动法度榜样以外的法度榜样所引用。

10、 unsigned long base_addr; /* device I/O address */ unsigned char irq; /* device IRQ number */I/O基地址和中断号。它们差不多上在设备检测时代被赋值的,但也能够在体系启动时指定传入(如传给LILO)。ifconfig敕令可显示及修改他们的当前值。 volatile unsigned char start; /* start an operation */ volatile unsigned char interrupt; /* interrupt arrived */这是两个二值的低层状况标记。平日在设

11、备打开时置start标记,在设备封闭时清start标记。当interrupt置位时,表示有一个中断已达到且正在进行中断办事法度榜样理。 unsigned long tbusy; /* transmitter busy must be long for bitops */标识“发送忙”。在驱动法度榜样不克不及接收一个新的需传输的包时,该域段应当为非零。 struct device *next;指向下一个收集设备,用于爱护链表。 unsigned char if_port;记录哪个硬件I/O端口正在被接口所用,如BNC,AUI,TP等(drivers/net/de4x5.h)。 unsigned

12、char dma; 设备用的DMA通道。一些设备可能须要以上两个域段,但非必须的。 unsigned long trans_start; /* Time (in jiffies) of last Tx */前次传输的时刻点(in jiffies) unsigned long last_rx; /* Time of last Rx */前次接收的时刻点(in jiffies)。如trans_start可用来赞助内核检测数据传输的逝世锁(lockup)。 unsigned short flags; /* interface flags (a la BSD) */该域描述了收集设备的才能和特点。它包

13、含以下flags:(include/linux/if.h)IFF_UP 表示接口在运行中。当接口被激活时,内核将置该标记位。IFF_BROADCAST 表示设备中的广播地址时有效的。以太网支撑广播。IFF_DEBUG 调试模式,表示设备调试打开。当想操纵printk及其他一些基于调试目标的信息显示时,可应用那个标记位。因此当前没有正式的驱动法度榜样应用它,但它能够在法度榜样中经由过程ioctl来设置从而应用它。IFF_LOOPBACK 表示这是一个回送(loopback)设备,回送接口应当置该标记位。核心是经由过程检查此标记位来确信设备是否是回送设备的,而不是看设备的名字是否是lo。IFF_P

14、OINTTOPOINT 表示这是一个点对点链接(SLIP and PPP),点对点接口必须置该标记位。Ifconfig也能够置此标记位及清除它。若置上该标记位,则dev-dstaddr应也响应的置为链接对方的地址。IFF_MASTER /* master of a load balancer */IFF_SLAVE /* slave of a load balancer */此两个标记位在装入平等化中要用到。IFF_NOARP 表示不支撑ARP协定。平日的收集接口能传输ARP包,假如想让接口不履行ARP,可置上该标记位。如点对点接口不须要运行ARP。IFF_PROMISC 全局接收模式。在该模

15、式下,设备将接收所有的包,而不关这些包是发给谁的。在缺省情形下,以太网接口会应用硬件过滤,以包管只接收广播包及发给本收集接口的包。Sniff的道理确实是经由过程设置收集接口为全局接收模式,接收所有达到本接口序言的包,来“偷听”簿子网的“隐秘”。IFF_MULTICAST 能接收多点传送的IP包,具有多点传输的才能。ether_setup缺省是置该标记位的,故若不想支撑多点传送,必须在初始化时清除该标记位。IFF_ALLMULTI 接收所有多点传送的IP包。IFF_NOTRAILERS /*无收集TRAILER*/IFF_RUNNING /*资本被分派*/此标记在Linux中没什么用,只是为了与

16、BSD兼容。 unsigned short family; /* address family ID (AF_INET) */该域段标识本设备支撑的协定地址簇。大年夜部分为AF_INET(英特网IP协定),接口平日不须要用那个域段或赋值给它。 unsigned short metric; /* routing metric (not used) */ unsigned short mtu; 不包含数据链路层帧首帧尾的最大年夜传输单位(Maximum Transfer Unit)。收集层在包传输时要用到。对以太网而言,该域段为1500,不包含MAC帧的帧首和帧尾(MAC帧格局稍后所示)。 uns

17、igned short type; /* interface hardware type */接口的硬件类型,描述了与该收集接口绑在一路的序言类型。Linux收集设备支撑专门多不合种类的序言,如以太网,X.25,令牌环,SLIP,PPP,Apple Localtalk等。ARP在剖断接口支撑哪种类型的物理地址时要用到该域段。若是以太网接口,则在ether_setup中将之设为ARPHRD_ETHER(Ethernet 10Mbps)。 unsigned short hard_header_len; /* hardware hdr length */在被传送的包中IP头之前的字节数。关于以太网接

18、口,该域段为14(ETH_HLEN,includelinuxif_ether.h),那个值可由MAC帧的格局得出:MAC帧格局:目标地址(6字节)+ 源地址(6字节)+ 数据长度(2字节)+ 数据(461500)+FCS void *priv; /* pointer to private data */该指针指向私稀有据,平日该数据构造中包含struct enet_statistics。类似于struct file的private_data指针,但priv指针是在设备初始化时被分派内存空间的(而不是在设备打开时),因为该指针指向的内容包含设备接口的统计数据,而这些数据即使在接口卸下(down)

19、时也应能够获得的,如用户经由过程ifconfig查看。 unsigned char pad; /* make dev_addr aligned to 8 bytes */ unsigned char broadcastMAX_ADDR_LEN; /* hw bcast add */广播地址由六个0xff构成,即表示255.255.255.255。memset(dev-broadcast,0xFF, ETH_ALEN); (drivers/net/net_init.c) unsigned char dev_addrMAX_ADDR_LEN; /* hw address */设备的物理地址。当包传

20、送给驱动法度榜样传输时,要用物理地址来产生精确的帧首。 unsigned char addr_len; /* hardware address length */物理地址的长度。以太网网卡的物理地址为6字节(ETH_ALEN)。 unsigned long pa_addr; /* protocol address */ unsigned long pa_brdaddr; /* protocol broadcast addr */ unsigned long pa_mask; /* protocol netmask */该三个域段分别描述接口的协定地址、协定广播地址和协定的收集掩码。若dev-f

21、amily为AF_INET,则它们即为IP地址。这些域段可用ifconfig赋值。 unsigned short pa_alen; /* protocol address length */协定地址的长度。AF_INET的为4。 unsigned long pa_dstaddr; /* protocol P-P other side addr */点对点协定接口(如SLIP、PPP)用那个域记录连接另一边的IP值。 struct dev_mc_list *mc_list; /* Multicast mac addresses */ int mc_count; /* Number of inst

22、alled mcasts */ struct ip_mc_list *ip_mc_list; /* IP multicast filter chain */这三个域段用于处理多点传输。个中mc_count表示mc_list中的项目数。 _u32 tx_queue_len; /* Max frames per queue allowed */一个设备的传输队列能容纳的最大年夜的帧数。对以太网,缺省为100;而plip则为节俭体系资本,仅设为10。 /* For load balancing driver pair support */ unsigned long pkt_queue; /* Pa

23、ckets queued */ struct device *slave; /* Slave device */ struct net_alias_info *alias_info; /* main dev alias info */ struct net_alias *my_alias; /* alias devs */ struct sk_buff_head buffsDEV_NUMBUFFS;指向收集接口缓冲区的指针。2.办事处理法度榜样以下是一些对收集接口的操作,类似与字符设备和块设备。收集接口操作能够分为两部分,一部分为全然操作,即每个收集接口都必须有的操作;另一部分是可选操作。/*

24、 全然操作 */ int (*init) (struct device *dev); /* Called only once. */初始化函数的指针,仅被调用一次。当挂号一个设备时,核心一样会让驱动法度榜样初始化该设备。初始化函数功能包含以下内容:检测设备是否存在;主动检测该设备的I/O端口和中断号;填写该设备device构造的大年夜部分域段;用kmalloc分派所需的内存空间等。若初始化掉败,该设备的device构培养可不能被链接到全局的收集设备表上。在体系启动时,每个驱动法度榜样都试图挂号本身,当只有那些实际存在的设备才会挂号成功。这与用主设备号及次设备号索引的字符设备和块设备不合。 in

25、t (*open) (struct device *dev);打开收集接口。每当接口被ifconfig激活时,收集接口都要被打开。Open操作做以下工作:挂号一些须要的体系资本,如IRQ、DMA、I/O端口等;打开硬件;将module应用计数器加一。 int (*stop) (struct device *dev);停止收集接口。操作内容与open相逆。 int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev);硬件开端传输。那个操作要求对一个包的传输,那个包原储存在一个socket缓冲区构造中(sk_buff)。 int

26、 (*hard_header) (struct sk_buff *skb, struct device *dev, unsigned short type, void *daddr, void *saddr, unsigned len);那个函数可依照先前获得的源物理地址和目标物理地址建立硬件头(hardware header)。以太网接口的缺省函数是eth_header。 int (*rebuild_header)(void *eth, struct device *dev, unsigned long raddr, struct sk_buff *skb);在一个包被发送之前重建硬件头。关

27、于以太网设备,如有未知的信息,缺省函数将应用ARP填写。 struct enet_statistics* (*get_stats)(struct device *dev);当一个应用法度榜样须要明白收集接口的一些统计数据时,可调用该函数,如ifconfig、netstat等。/* 可选操作 */ void (*set_multicast_list)(struct device *dev);设置多点传输的地址链表(*mc_list)。 int (*set_mac_address)(struct device *dev, void *addr);改变硬件的物理地址。假如收集接口支撑改变它的硬件物理

28、地址,就可用那个操作。专门多硬件不支撑该功能。 int (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd);履行依附接口的ioctl敕令。 int (*set_config)(struct device *dev, struct ifmap *map);改变接口设备。设备的I/O地址和中断号能够经由过程该函数进行及时修改。 void (*header_cache_bind)(struct hh_cache *hhp, struct device *dev, unsigned short htype, _u32 daddr);

29、void (*header_cache_update)(struct hh_cache *hh, struct device *dev, unsigned char * haddr); int (*change_mtu) (struct device *dev, int new_mtu);那个函数负责使接口MTU改变后生效。假如当MTU改变时驱动法度榜样要作一些专门的工作,就应当写那个函数。 struct iw_statistics* (*get_wireless_stats) (struct device *dev);三.收集设备的初始化收集设备的初始化重要工作是检测设备的存在、初始化设备的

30、device构造及在体系中挂号该设备。类似于字符设备和快块设备,体系内核中也存在着一张收集接口治理表dev_base,但与dev_base是指向device构造的,因为收集设备是经由过程device数据构造来表示的。dev_base实际上是一条device构造链表的表头,在体系初始化完成今后,体系检测到的收集设备将主动地储存在这张链表中,个中每一个链表单位表示一个存在的物理收集设备。挂号成功的收集设备必定可在dev_base链表中找到。收集设备的初始化从触发角度看可分为两类:一类是由shell敕令insmod触发的模块化驱动法度榜样(module),只有模块化的收集设备驱动法度榜样才能用这种方

31、法对设备进行初始化,称为“模块初始化模式”;另一类是体系驱动时由核心主动检测收集设备并进行初始化,我们称为“启动初始化模式”。明显,这两种初始化模式存在专门多不合之处,以下我们对两者分别进行分析。1.“模块初始化模式”的分析概述insmod敕令将调用响应模块的init_module(),装载模块。init_module函数在初始化dev-init函数指针后,将调用register_netdev()在体系挂号该设备。若挂号成功,则模块装载成功,不然返回掉足信息。register_netdev起首检查设备名是否已确信,若没赋值则给它一个缺省的值ethN,N为最小的可用以太网设备号注;然后,收集设备本身的init_function,即刚在init_module中赋值的dev-init,将被调用,用来实现对收集接口的实际的初始化工作。若初始化成功,则将该收集接口加到收集设备治理表dev_base的尾部。全部函数调用关系图如下所示。下面我们以用得最广泛以太网卡之一NE2000兼容网卡为例子进行分析。NE2000网卡的重要驱动法度榜样在文件drivers/net/ne.c中。图二 “模块初始化模式”的函数调用关系图init_moduleinit_module-模块初始化

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1