网络设备轮询设计与实现详解.doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络设备轮询设计与实现 --BSD操作系统核心新技术 作者:xie_minix(谢小荣) 1.1 引言 polling(轮询)技术是一种在一定时间内不断的探测目标,以获取目标在满足条件后进行相应处理的技术。从大多数情况来讲,这种技术并没有以中断为代表的技术先进。但是在一些特定场合,如主机作为一个大型的网关,并且流量巨大,选用轮询技术还是比较合适的。本文是针对FreeBSD操作系统及其代码来进行分析其设计思路和实现过程。目前BSD类操作系统中只有FreeBSD4.10和FreeBSD5.3以上版本才加入了对轮询的支持,NetBSD和OpenBSD还未实现。作为大多数防火墙首选的操作系统OpenBSD到是应该实现轮询技术。 在《TCP/IP详解》第二卷中,书中作者曾经提到过该技术,而且好象冯.杰克布森已经在一些实验中实现过。直到不久前我们才看到这些代码在FreeBSD中实现,要知道在核心中加入一项新的技术工作量是非常之大,轮询代码不但是要在核心中增加一些代码文件,而且把所有网卡驱动程序都要进行大量相应的改动。我们以VIA Rhine(威盛的莱因型芯片,通常的DLINK 530TX网卡使用的芯片)的驱动程序if_vr.c和他的头文件if_vrreg.h(后面具体涉及到硬件驱动程序的代码都以vr代码做实例分析)来简单讲述代码的一些改动。 XX_softc结构中的改动: XX是代表各芯片的简称,本文使用的是vr芯片代码,所以是vr_softc结构。在结构的最后部分,增加了以下代码: #ifdef DEVICE_POLLING int rxcycles; #endif 以上代码出现在源代码if_vrreg.h中的第472行中。DEVICE_POLLING是由核心配置决定。如果核心配置文件中加入了该定义,则在#ifdef 和#endif行之间的代码将编译进核心。也就是说,所有的支持POLLING的代码都应该在#ifdef DEVICE_POLLING定义之下和#endif之上。图中的rxcycles变量是用来存放在核心进入vr驱动程序时,POLLING要求驱动程序的底半部分(即读出和写入)进行多少次的循环。 在连接该设备驱动程序到设备程序链表时的一些改动: 任何以太网络设备在探测到该设备存在后(xx_probe函数,xx在这是代表芯片在系统中的简称),紧接着执行设备链入函数(xx_attach),他的工作主要是进行硬件的一些初始化(中断的分配、??卡缓存的内存映射等等)和ifnet结构的初始化。 #ifdef DEVICE_POLLING ifp-if_capabilities |= IFCAP_POLLING; #endif上图是if_vr.c中的第742行中关于对POLLING支持时候的一段代码。if_capabilities成员是用来判断网卡支持性能的成员。比如对VLAN技术的支持,POLLING技术的支持等标志都是放在此成员中。 1.2代码介绍 所有的轮询代码主体在1个C文件和各支持轮询的网络设备驱动程序中,以及一些相关的支撑文件。图1-1中没有列出所有的网络设备驱动程序。 文件说明 net/if_var.h pci/if_vrreg.h申明一些函数 修改ifnet结构以支持轮询kern/kern_poll.c kern/kern_clock.c net/netisr.c pci/if_vr.c …轮询的核心部分代码 一段定时调用kern_poll.c中轮询代码 网络软中断代码 网络设备驱动程序(基于vr芯片的卡) 其他的网络设备驱动程序图 1-1 本文包含的文件 1.2.1 全局变量 从第106行开始,都是POLLING相关的全局变量.首先是建立一SYSCTL树的节点.下图中的SYSCTL_NODE宏代表在父节点_kern下建立一个_kern_polling节点. SYSCTL_NODE(_kern, OID_AUTO, polling, CTLFLAG_RW, 0, Device polling parameters); 下图中的变量全部可用sysctl来查看,大部分都可以调整设置.这些全局变量都是使用宏SYSCTL_UINT把他们加入到_kern_polling节点下,成为该节点的叶子.之所以这样,是因为可以通过用户区来调整这些参数. static u_int32_t poll_burst = 5; ------ kern_poll.c static

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档