- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- 跨学科主题作业设计.docx
- 2023年北京首都师大附中英语九上期末质量检测模拟试题含解析.doc VIP
- 第18课《我的白鸽》习题教学设计-2024-2025学年统编版语文七年级上册(2024).docx
- 5.1质量守恒定律-九年级化学人教版(2024)上册.pptx
- 2024如何高质量开好“经营分析会”培训课件分享.pdf
- AP宏观经济学 2010年真题 (选择题+问答题) AP Macroeconomics 2010 Released Exam and Answers (MCQ+FRQ).pdf VIP
- AP微观经济学 2010年真题 (选择题+问答题) AP Microeconomics 2010 Released Exam and Answers (MCQ+FRQ).pdf VIP
- 高中数学单元教学设计(9篇).docx VIP
- 16BJ7-1 楼梯平台栏杆及扶手.pdf
- 多维阅读第9级A-Bag-in-the-Jungle-公开课课件.pptx
文档评论(0)