freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于arm的linux網(wǎng)卡驅(qū)動程序的開發(fā)與設(shè)計(論文最終完成)-在線瀏覽

2025-03-05 13:04本頁面
  

【正文】 的不懈努力,加上計算機(jī)公司的支持,Linux的影響和應(yīng)用日益廣泛,發(fā)展成為目前世界上用戶最多的一種類UNIX操作系統(tǒng)。經(jīng)過十多年的發(fā)展,到2003年,Linux ,這在Linux發(fā)展史中具有極其重要的作用。 Linux內(nèi)核簡介在最開始的時候,Linux系統(tǒng)并沒有現(xiàn)在所看到的Linux系統(tǒng)的體積這么龐大,各種免費開放的驅(qū)動代碼也還沒有來得及加入到系統(tǒng)中,所以,之初的Linux實際意義上就是Linux內(nèi)核。這是用戶應(yīng)用程序執(zhí)行的地方。GNU C Library (glibc)也在這里,它提供了連接內(nèi)核的系統(tǒng)調(diào)用接口,還提供了在用戶空間應(yīng)用程序和內(nèi)核之間進(jìn)行轉(zhuǎn)換的機(jī)制。實際上,體系結(jié)構(gòu)可能并不像圖1所示的一樣清晰。Linux系統(tǒng)支持多個進(jìn)程的并發(fā)運行,每個進(jìn)程都請求系統(tǒng)資源,比如運算、內(nèi)存、網(wǎng)絡(luò)連接或其他一些資源等。相反,Linux是具有創(chuàng)新意義的Unix類操作系統(tǒng)。作為Unix類操作系統(tǒng),Linux內(nèi)核具有下列基本特征:Linux內(nèi)核的組織形式為整體式結(jié)構(gòu)。從信息隱藏的觀點看,它沒有任何程度的隱藏,每個過程都對其它過程都是可見的。另外,基于過程的結(jié)構(gòu)也有助于不同的人參與不同過程的開發(fā),從這個角度來說,Linux內(nèi)核又是開放式的結(jié)構(gòu),它允許任何人對其進(jìn)行修正、改進(jìn)和完善??梢哉fLinux在追求效率和調(diào)度方式上也是優(yōu)勢明顯。Linux支持內(nèi)核線程(或稱守護(hù)進(jìn)程)。Linux中有許多標(biāo)準(zhǔn)的內(nèi)核線程,其中有一些周期地運行來完成特定的任務(wù)(如swapd),而其余一些則連續(xù)地運行,等待處理某些特定的事件(如inetd和lpd)。Linux支持多種平臺的虛擬內(nèi)存管理。Linux內(nèi)核另一個獨具特色的部分是虛擬文件系統(tǒng)(VFS)。Linux的模塊機(jī)制使得內(nèi)核保持獨立而又易于擴(kuò)充。增加系統(tǒng)調(diào)用以滿足開發(fā)者的特殊需求。網(wǎng)絡(luò)部分采用了面向?qū)ο蟮脑O(shè)計思想,使得Linux內(nèi)核支持多種協(xié)議、多種網(wǎng)卡驅(qū)動程序變得更加的容易,為驅(qū)動的開發(fā)提供了便捷性,減少了工作量,提高了工作效率。它們是截然不同的黑盒子,使某個特定硬件響應(yīng)一個定義好的內(nèi)部編程接口,這些接口隱藏了設(shè)備工作的細(xì)節(jié)。設(shè)備驅(qū)動程序的角色就是將這些調(diào)用映射到作用于實際硬件設(shè)備相關(guān)的操作上。這種模塊化的的特點使得Linux驅(qū)動程序的編寫非常的簡單,因此內(nèi)核驅(qū)動程序的數(shù)目也增長及其迅速,目前已經(jīng)有成百上千的驅(qū)動程序可以在linux下被使用。Linux系統(tǒng)的設(shè)備分為字符設(shè)備(chardevice)和網(wǎng)絡(luò)設(shè)備(netdevice)三種:字符設(shè)備:字符(char)設(shè)備是個能夠像字節(jié)流一樣被訪問的設(shè)備,由字符設(shè)備的驅(qū)動程序來實現(xiàn)這種特性。字符設(shè)備可以通過文件系統(tǒng)節(jié)點來訪問,比如/dev/tty1和/dev/loop0等。當(dāng)然,也存在具有數(shù)據(jù)特性的字符設(shè)備,訪問它們時可以前后移動訪問位置。塊設(shè)備:如同字符設(shè)備,塊設(shè)備也是通過位于/dev目錄下的文件系統(tǒng)節(jié)點來存取。Linux可以讓應(yīng)用程序像字符設(shè)備一樣地讀寫塊設(shè)備,允許依次傳遞任意多的字節(jié)的數(shù)據(jù)。網(wǎng)絡(luò)接口:任何網(wǎng)絡(luò)事件都是通過一個網(wǎng)絡(luò)接口形成的,一個網(wǎng)絡(luò)接口就是一個能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備。網(wǎng)絡(luò)接口由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)動,負(fù)責(zé)數(shù)據(jù)包的接收和發(fā)送,但它不需要了每項事務(wù)是如何映射到實際傳送的數(shù)據(jù)包的。網(wǎng)絡(luò)驅(qū)動程序不需要知道各個連接的相關(guān)信息,它只要處理數(shù)據(jù)包即可。Unix訪問網(wǎng)絡(luò)接口的方法仍然是給他們分配一個唯一的名字(比如eth0),但這個名字在文件系統(tǒng)中不存在對應(yīng)的節(jié)點。 編寫網(wǎng)絡(luò)驅(qū)動程序的一些基本概念無論是什么操作系統(tǒng)的驅(qū)動程序,都有一些通用的概念。下面簡單介紹一下網(wǎng)絡(luò)設(shè)備驅(qū)動程序的一些基本的也是最重要的概念。發(fā)送和接收:這是一個網(wǎng)絡(luò)設(shè)備最基本的功能。驅(qū)動程序由于是直接操縱硬件的,所以網(wǎng)絡(luò)硬件有數(shù)據(jù)收到時,最先能得到這個數(shù)據(jù)的就是驅(qū)動程序,它負(fù)責(zé)把這些原始數(shù)據(jù)進(jìn)行必要的處理,然后送給系統(tǒng)。中斷:中斷在現(xiàn)代計算機(jī)結(jié)構(gòu)中占有重要的地位。Linux支持中斷的共享,即多個設(shè)備共享一個中斷。如某些協(xié)議里的超時處理,沒有中斷機(jī)制的硬件的輪詢等,操作系統(tǒng)應(yīng)為驅(qū)動程序提供定時機(jī)制,一般是在預(yù)定的時間過了以后,系統(tǒng)自動回調(diào)注冊的時鐘函數(shù)。第3章 Linux網(wǎng)卡驅(qū)動程序設(shè)計的理論探討網(wǎng)絡(luò)接口是第三類標(biāo)準(zhǔn)Linux設(shè)備,網(wǎng)絡(luò)設(shè)備使用特定的內(nèi)核數(shù)據(jù)結(jié)構(gòu)注冊自身,以備與外界進(jìn)行數(shù)據(jù)交換時調(diào)用。內(nèi)核中的網(wǎng)絡(luò)驅(qū)動程序接口是為不同模式的操作而精心設(shè)計的。 網(wǎng)卡驅(qū)動程序設(shè)計要用到的數(shù)據(jù)結(jié)構(gòu)net_device[1]結(jié)構(gòu)處于網(wǎng)絡(luò)驅(qū)動層的非常核心的位置并且值得完全的描述。(1) 全局信息結(jié)構(gòu) net_device 的第一部分是由下面成員組成:char name[IFNAMSIZ];設(shè)備名稱。unsigned long state;設(shè)備狀態(tài)。驅(qū)動程序在正常情況下不直接操作這些標(biāo)志,相反,內(nèi)核提供了一組工具函數(shù)來專門操作該標(biāo)志。驅(qū)動程序不應(yīng)該修改這個成員。如果設(shè)置了這個指針,這個函數(shù)被 register_netdev 調(diào)用來完成對net_device結(jié)構(gòu)的初始化。(2).硬件信息下面的成員包含了相對簡單設(shè)備的低層硬件信息。unsigned long rmem_end;unsigned long rmem_start;unsigned long mem_end;unsigned long mem_start;設(shè)備的內(nèi)存信息.。如果設(shè)備有不同的接收和發(fā)送內(nèi)存,mem成員由發(fā)送內(nèi)存使用,rmem成員由接收內(nèi)存使用。根據(jù)規(guī)定,end成員的設(shè)置要保證end start等于可用的板卡內(nèi)存量。這個成員由驅(qū)動在設(shè)備探測時賦值。base_addr可以在系統(tǒng)啟動時、或者在模塊加載時在內(nèi)核命令行中顯式賦值。unsigned char irq;被賦予的中斷號。這個值常常在啟動或者加載時設(shè)置,其后可以通過ifconfig命令修改。例如,如果這個設(shè)備同時支持同軸電纜(IF_PORT_10BASE2)和雙絞線(IF_PORT_100BSAET)以太網(wǎng)連接,就可以使用該變量。unsigned char dma;為設(shè)備分配的DMA通道。 除了用于顯示信息(ifconfig命令)之外,它不在設(shè)備驅(qū)動自身以外使用。以太網(wǎng)卡可以依賴這個通用的函數(shù)設(shè)置大部分這些成員,但是flags和dev_addr成員是特定設(shè)備的, 必須在初始化期間顯示賦值。deviers/net/ 輸出了一些類似的函數(shù),包括下列:void ltalk_setup(struct net_device *dev);設(shè)置一個 LocalTalk 設(shè)備的函數(shù)。void fddi_setup(struct net_device *dev);配置一個光纖分布數(shù)據(jù)接口(FDDI)網(wǎng)絡(luò)的接口。void tr_setup(struct net_device *dev);處理令牌環(huán)網(wǎng)絡(luò)接口的設(shè)置。如果設(shè)備是一個嶄新的類,就需要手工設(shè)置下面的成員:unsigned short hard_header_len。對于以太網(wǎng)接口hard_header_len的值是14(ETH_HLEN)。網(wǎng)絡(luò)層使用該成員變量驅(qū)動數(shù)據(jù)包的傳輸。unsigned long tx_queue_len;設(shè)備發(fā)送隊列中可以排隊的最大幀數(shù)。例如,plip設(shè)置為10來避免浪費系統(tǒng)內(nèi)存(相比真實以太網(wǎng)接口,plip 有一個低些的吞吐量)。這個type成員由ARP用來決定接口支持什么樣的硬件地址??勺R別的類型定義于linux/中。以太網(wǎng)地址長度是6個字節(jié)(即接口板卡的硬件ID),廣播地址由6個0xff字節(jié)組成。另外,設(shè)備地址必須以特定于設(shè)備的方式從接口板卡中讀出,驅(qū)動程序應(yīng)當(dāng)將它拷貝到dev_addr中。某些標(biāo)志由內(nèi)核管理,而其他一些則由接口在初始化期間設(shè)置,用來聲明接口的各種能力及其他特性。 網(wǎng)卡驅(qū)動程序的基本方法每個網(wǎng)絡(luò)設(shè)備都聲明了很多能操作它的函數(shù)。有些操作可以留作NULL,其他的一些則無需修改, 因為ether_setup給它們賦予了正確的方法?;痉椒òㄊ褂媒涌诒仨毜姆椒ǎ豢蛇x的方法實現(xiàn)了更為高級的功能,但并不是嚴(yán)格要求的功能。在ifconfig[8,9]激活接口時,接口將被打開。int (*stop)(struct net_device *dev);停止接口。在該函數(shù)中執(zhí)行的操作與打開時執(zhí)行的操作是相反的。完整的數(shù)據(jù)包(協(xié)議頭和所有)包含在一個套接字緩存區(qū)(sk_buff)結(jié)構(gòu)中。該函數(shù)的任務(wù)是將作為參數(shù)傳入的信息組織成一個合適的特定于設(shè)備的硬件頭。int (*rebuild_header)(struct sk_buff *skb);該函數(shù)用來在ARP[4]解析完成之后、在報文發(fā)送之前重新建立硬件頭。void (*tx_timeout)(struct net_device *dev);如果數(shù)據(jù)包的傳輸在合理的時間段內(nèi)失敗了,則假定中斷或接口被鎖住,這時,網(wǎng)絡(luò)代碼將調(diào)用該方法,它負(fù)責(zé)解決問題并重新開始數(shù)據(jù)包的傳輸。例如,當(dāng)ifconfig或者netstat i運行時將利用到該方法。設(shè)備的 I/O 地址和中斷號可以通過運行set_config來改變。除開上面提及到的基本方法以外,還有很多的可選方法。 套接字緩沖區(qū)介紹套接字緩沖區(qū)這個結(jié)構(gòu)處于 Linux 內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的核心,Linux內(nèi)核中網(wǎng)絡(luò)數(shù)據(jù)包的傳輸和接收都是通過套接字緩沖區(qū)實現(xiàn)的。(1). 重要成員變量這里描述的成員都是驅(qū)動程序需要訪問的。union { /*… */ } h;union { /* …*/ } nh;union { /*…*/} mac;指向報文中包含的各級的頭的指針。h中含有傳輸層頭部指針(例如struct tcphdr *th);nh包含網(wǎng)絡(luò)層頭部(例如struct iphdr *iph);以及mac包含鏈路層頭部指針(例如struct ethkr * ethernet)。unsigned char *head;unsigned char *data;unsigned char *tail;unsigned char *end;指向數(shù)據(jù)包中數(shù)據(jù)的指針。通過它們可以計算出可用的緩存空間(skbend skbhead)和當(dāng)前使用的空間(skbtail skbdata)。unsigned char ip_summed;對報文的校驗策略。unsigned char pkt_type;在發(fā)送過程使用的數(shù)據(jù)包類型。以太網(wǎng)驅(qū)動不顯式修改 pkt_type,因為eth_type_trans會完成這個工作。(2) 作用于緩沖區(qū)的函數(shù)使用sk_buff[11]結(jié)構(gòu)的網(wǎng)絡(luò)驅(qū)動程序通過一些正式的接口函數(shù)來操作該結(jié)構(gòu)。struct sk_buff *alloc_skb(unsigned int len, int priority);struct sk_buff *dev_alloc_skb(unsigned int len);分配一個緩存區(qū)。dev_alloc_skb函數(shù)以GFP_ATOMIC的優(yōu)先級調(diào)用 alloc_skb函數(shù),并且在skbhead和skbdata之間保留了一些空間,網(wǎng)絡(luò)層使用這一數(shù)據(jù)空間進(jìn)行優(yōu)化工作,驅(qū)動程序不應(yīng)該訪問它。kfree_skb調(diào)用由內(nèi)核在內(nèi)部使用。在非中斷上下文中使用dev_kfree_skb,在中斷上下文中使用dev_kfree_skb_irq,dev_kfree_skb_any在上面兩種情況下均可以使用。unsigned char *skb_push(struct sk_buff *skb, int len);unsigned char *__skb_push(struct sk_buff *skb, int len);遞減skbdata和遞增skblen的函數(shù)。在傳輸數(shù)據(jù)包之前,可使用該函數(shù)添加硬件頭。如果驅(qū)動程序釋放了多于它能持有的數(shù)據(jù)到緩存中,則系統(tǒng)會出現(xiàn)panic來標(biāo)識出這個錯誤。返回data前面的可用空間數(shù)量,也即是有多少字節(jié)能夠保存在該緩沖區(qū)中。這個函數(shù)可用來在填充數(shù)據(jù)前保留報文頭部空間(headroom)。unsigned char *skb_pull(struct sk_buff *skb, int len);從報文的頭部刪除數(shù)據(jù)。int skb_is_nonlinear(struct sk_buff *skb);如果這個skb分離為多個片為發(fā)散/匯聚 I/O,則該函數(shù)返回一個真值。void *kmap_skb_frag(skb_frag_t *frag);void kunmap_skb_frag(void *vaddr);如果要在內(nèi)核中直接訪問非線性skb中的數(shù)據(jù)片段,這些函數(shù)負(fù)責(zé)映射和解除映射。 驅(qū)動模塊的加載和卸載在構(gòu)造好驅(qū)動模塊之后,需要將其裝入到內(nèi)核,或者在裝入到內(nèi)后以后在某個時刻又需要將其卸載。模塊設(shè)計是Linux中特有的技術(shù),它使Linux內(nèi)核功能易于擴(kuò)展,采用模塊方式來設(shè)計Linux網(wǎng)絡(luò)設(shè)備驅(qū)動程序也很方便,并且能夠形成固定的模式。根據(jù)這兩種方式的特點,本工程在調(diào)試過程中采用模塊加載,方便調(diào)試,省去了反復(fù)編譯內(nèi)核的麻煩,調(diào)試成功后將其編譯進(jìn)內(nèi)核,以獲得更高的運行效率。如果注冊成功,則調(diào)用init函數(shù)指針?biāo)赶虻某跏蓟瘮?shù)來對設(shè)備初始化,將設(shè)備的net_device數(shù)據(jù)結(jié)構(gòu)插入到鏈表的末尾。在需要卸載模塊時,先關(guān)閉設(shè)備,再通過執(zhí)行模塊卸載命令rmmod來調(diào)用驅(qū)動cleanup_moduIe()函數(shù)卸載該模塊。如果內(nèi)核認(rèn)為模塊仍然在使用狀態(tài)(例如,某個程序正打開由該模塊導(dǎo)出的設(shè)備文件),或者內(nèi)核被配置為禁止移除該模塊,則無法移除該模塊。XLR處理器這是一款專用的多核多線程網(wǎng)絡(luò)處理器,被廣泛的應(yīng)用于網(wǎng)絡(luò)安全、網(wǎng)絡(luò)服務(wù)等領(lǐng)域。由于該設(shè)備是一款網(wǎng)絡(luò)設(shè)備,所以網(wǎng)卡就成了該設(shè)備的重要組件。經(jīng)過篩選和對比最終選擇了三星2410 ARM開發(fā)板,接下來將介紹三星2410 ARM開發(fā)板。存儲器包括下列幾部分:64M SDRAM,64M Nand Flash(用于存放應(yīng)用程序),32M Intel St
點擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1