資源描述:
《網(wǎng)絡設(shè)備輪詢設(shè)計與實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、網(wǎng)絡設(shè)備輪詢設(shè)計與實現(xiàn)--BSD操作系統(tǒng)核心新技術(shù)作者:xie_minix(謝小榮)1.1引言polling(輪詢)技術(shù)是一種在一定時間內(nèi)不斷的探測目標,以獲取目標在滿足條件后進行相應處理的技術(shù)。從大多數(shù)情況來講,這種技術(shù)并沒有以中斷為代表的技術(shù)先進。但是在一些特定場合,如主機作為一個大型的網(wǎng)關(guān),并且流量巨大,選用輪詢技術(shù)還是比較合適的。本文是針對FreeBSD操作系統(tǒng)及其代碼來進行分析其設(shè)計思路和實現(xiàn)過程。目前BSD類操作系統(tǒng)中只有FreeBSD4.10和FreeBSD5.3以上版本才加入了對輪詢的支持,NetBSD和Open
2、BSD還未實現(xiàn)。作為大多數(shù)防火墻首選的操作系統(tǒng)OpenBSD到是應該實現(xiàn)輪詢技術(shù)。在《TCP/IP詳解》第二卷中,書中作者曾經(jīng)提到過該技術(shù),而且好象馮.杰克布森已經(jīng)在一些實驗中實現(xiàn)過。直到不久前我們才看到這些代碼在FreeBSD中實現(xiàn),要知道在核心中加入一項新的技術(shù)工作量是非常之大,輪詢代碼不但是要在核心中增加一些代碼文件,而且把所有網(wǎng)卡驅(qū)動程序都要進行大量相應的改動。我們以VIARhine(威盛的萊因型芯片,通常的DLINK530TX網(wǎng)卡使用的芯片)的驅(qū)動程序if_vr.c和他的頭文件if_vrreg.h(后面具體涉及到硬件驅(qū)
3、動程序的代碼都以vr代碼做實例分析)來簡單講述代碼的一些改動。A.XX_softc結(jié)構(gòu)中的改動:XX是代表各芯片的簡稱,本文使用的是vr芯片代碼,所以是vr_softc結(jié)構(gòu)。在結(jié)構(gòu)的最后部分,增加了以下代碼:#ifdefDEVICE_POLLINGintrxcycles;#endif以上代碼出現(xiàn)在源代碼if_vrreg.h中的第472行中。DEVICE_POLLING是由核心配置決定。如果核心配置文件中加入了該定義,則在#ifdef和#endif行之間的代碼將編譯進核心。也就是說,所有的支持POLLING的代碼都應該在#ifde
4、fDEVICE_POLLING定義之下和#endif之上。圖中的rxcycles變量是用來存放在核心進入vr驅(qū)動程序時,POLLING要求驅(qū)動程序的底半部分(即讀出和寫入)進行多少次的循環(huán)。B.在連接該設(shè)備驅(qū)動程序到設(shè)備程序鏈表時的一些改動:任何以太網(wǎng)絡設(shè)備在探測到該設(shè)備存在后(xx_probe函數(shù),xx在這是代表芯片在系統(tǒng)中的簡稱),緊接著執(zhí)行設(shè)備鏈入函數(shù)(xx_attach),他的工作主要是進行硬件的一些初始化(中斷的分配、網(wǎng)卡緩存的內(nèi)存映射等等)和ifnet結(jié)構(gòu)的初始化。#ifdefDEVICE_POLLINGifp->i
5、f_capabilities
6、=IFCAP_POLLING;#endif上圖是if_vr.c中的第742行中關(guān)于對POLLING支持時候的一段代碼。if_capabilities成員是用來判斷網(wǎng)卡支持性能的成員。比如對VLAN技術(shù)的支持,POLLING技術(shù)的支持等標志都是放在此成員中。1.2代碼介紹所有的輪詢代碼主體在1個C文件和各支持輪詢的網(wǎng)絡設(shè)備驅(qū)動程序中,以及一些相關(guān)的支撐文件。圖1-1中沒有列出所有的網(wǎng)絡設(shè)備驅(qū)動程序。文件說明net/if_var.hpci/if_vrreg.h申明一些函數(shù)修改ifnet結(jié)構(gòu)以支持輪詢ke
7、rn/kern_poll.ckern/kern_clock.cnet/netisr.cpci/if_vr.c…輪詢的核心部分代碼一段定時調(diào)用kern_poll.c中輪詢代碼網(wǎng)絡軟中斷代碼網(wǎng)絡設(shè)備驅(qū)動程序(基于vr芯片的卡)其他的網(wǎng)絡設(shè)備驅(qū)動程序圖1-1本文包含的文件1.2.1全局變量從第106行開始,都是POLLING相關(guān)的全局變量.首先是建立一SYSCTL樹的節(jié)點.下圖中的SYSCTL_NODE宏代表在父節(jié)點_kern下建立一個_kern_polling節(jié)點.SYSCTL_NODE(_kern,OID_AUTO,polling
8、,CTLFLAG_RW,0,"Devicepollingparameters");下圖中的變量全部可用sysctl來查看,大部分都可以調(diào)整設(shè)置.這些全局變量都是使用宏SYSCTL_UINT把他們加入到_kern_polling節(jié)點下,成為該節(jié)點的葉子.之所以這樣,是因為可以通過用戶區(qū)來調(diào)整這些參數(shù).staticu_int32_tpoll_burst=5;------kern_poll.cstaticu_int32_tpoll_each_burst=5;staticu_int32_tpoll_burst_max=150;stati
9、cu_int32_tpoll_in_idle_loop=0;u_int32_tpoll_in_trap;staticu_int32_tuser_frac=50;staticu_int32_treg_frac=20;staticu_int32_tshort_tic