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

正文內(nèi)容

基于arm的linux網(wǎng)卡驅(qū)動(dòng)程序的開發(fā)與設(shè)計(jì)(論文最終完成)(編輯修改稿)

2025-02-12 13:04 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 et_device *dev);配置一個(gè)光纖分布數(shù)據(jù)接口(FDDI)網(wǎng)絡(luò)的接口。void hippi_setup(struct net_device *dev);初始化高性能并行接口(HIPPI)的高速互連驅(qū)動(dòng)的成員。void tr_setup(struct net_device *dev);處理令牌環(huán)網(wǎng)絡(luò)接口的設(shè)置。大部分設(shè)備都?xì)w于這些類別中的一類。如果設(shè)備是一個(gè)嶄新的類,就需要手工設(shè)置下面的成員:unsigned short hard_header_len。硬件頭部長(zhǎng)度,即數(shù)據(jù)包中位于IP頭、或者其他協(xié)議信息之前的octet數(shù)目。對(duì)于以太網(wǎng)接口hard_header_len的值是14(ETH_HLEN)。unsigned mtu;最大傳輸單元(MTU)[5]。網(wǎng)絡(luò)層使用該成員變量驅(qū)動(dòng)數(shù)據(jù)包的傳輸。以太網(wǎng)的MTU是1500octet (ETH_DATA_LEN)。unsigned long tx_queue_len;設(shè)備發(fā)送隊(duì)列中可以排隊(duì)的最大幀數(shù)。這個(gè)值由ether_setup設(shè)置為100,但是可以改它。例如,plip設(shè)置為10來避免浪費(fèi)系統(tǒng)內(nèi)存(相比真實(shí)以太網(wǎng)接口,plip 有一個(gè)低些的吞吐量)。unsigned short type;接口的硬件類型.。這個(gè)type成員由ARP用來決定接口支持什么樣的硬件地址。對(duì)以太網(wǎng)接口正確的值是ARPHRD_ETHER,這是由ether_setup設(shè)置的值??勺R(shí)別的類型定義于linux/中。unsigned char addr_len;unsigned char broadcast[MAX_ADDR_LEN];unsigned char dev_addr[MAX_ADDR_LEN];硬件(MAC)地址長(zhǎng)度和設(shè)備硬件地址。以太網(wǎng)地址長(zhǎng)度是6個(gè)字節(jié)(即接口板卡的硬件ID),廣播地址由6個(gè)0xff字節(jié)組成。ether_setup會(huì)對(duì)上述值進(jìn)行正確地設(shè)置。另外,設(shè)備地址必須以特定于設(shè)備的方式從接口板卡中讀出,驅(qū)動(dòng)程序應(yīng)當(dāng)將它拷貝到dev_addr中。unsigned short flags;int features;這個(gè)flags 成員是一個(gè)位掩碼。某些標(biāo)志由內(nèi)核管理,而其他一些則由接口在初始化期間設(shè)置,用來聲明接口的各種能力及其他特性。有效的標(biāo)志定義在linux/中。 網(wǎng)卡驅(qū)動(dòng)程序的基本方法每個(gè)網(wǎng)絡(luò)設(shè)備都聲明了很多能操作它的函數(shù)。在這里討論一下能夠?qū)W(wǎng)絡(luò)接口進(jìn)行的操作。有些操作可以留作NULL,其他的一些則無需修改, 因?yàn)閑ther_setup給它們賦予了正確的方法。網(wǎng)絡(luò)接口的設(shè)備方法可分為兩個(gè)類型:基本的和可選的。基本方法包括使用接口必須的方法;可選的方法實(shí)現(xiàn)了更為高級(jí)的功能,但并不是嚴(yán)格要求的功能。下面的是基本方法:int (*open)(struct net_device *dev);打開接口。在ifconfig[8,9]激活接口時(shí),接口將被打開。open方法應(yīng)該注冊(cè)設(shè)備需要的所有系統(tǒng)資源(I/O口、IRQ、DMA等等),打開硬件,并對(duì)設(shè)備執(zhí)行其他所需的設(shè)置。int (*stop)(struct net_device *dev);停止接口。當(dāng)接口終止時(shí)當(dāng)它應(yīng)該被關(guān)閉。在該函數(shù)中執(zhí)行的操作與打開時(shí)執(zhí)行的操作是相反的。int (*hard_start_xmit) (struct sk_buff *skb, struct net_device *dev);該方法初始化數(shù)據(jù)包的傳輸。完整的數(shù)據(jù)包(協(xié)議頭和所有)包含在一個(gè)套接字緩存區(qū)(sk_buff)結(jié)構(gòu)中。int (*hard_header) (struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len);該方法根據(jù)之前取到的源和目的硬件地址來建立硬件頭,并在 hard_start_xmit前被調(diào)用。該函數(shù)的任務(wù)是將作為參數(shù)傳入的信息組織成一個(gè)合適的特定于設(shè)備的硬件頭。eth_header是以太網(wǎng)類型接口的默認(rèn)函數(shù), ether_setup將該成員賦值成eth_header。int (*rebuild_header)(struct sk_buff *skb);該函數(shù)用來在ARP[4]解析完成之后、在報(bào)文發(fā)送之前重新建立硬件頭。在以太網(wǎng)設(shè)備使用的缺省的函數(shù)中通過使用ARP協(xié)議來填充數(shù)據(jù)包缺少的硬件地址信息。void (*tx_timeout)(struct net_device *dev);如果數(shù)據(jù)包的傳輸在合理的時(shí)間段內(nèi)失敗了,則假定中斷或接口被鎖住,這時(shí),網(wǎng)絡(luò)代碼將調(diào)用該方法,它負(fù)責(zé)解決問題并重新開始數(shù)據(jù)包的傳輸。struct net_device_stats *(*get_stats)(struct net_device *dev);任何時(shí)候當(dāng)一個(gè)應(yīng)用程序需要獲取接口的統(tǒng)計(jì)信息,則調(diào)用這個(gè)方法。例如,當(dāng)ifconfig或者netstat i運(yùn)行時(shí)將利用到該方法。int (*set_config)(struct net_device *dev, struct ifmap *map);在改變接口配置時(shí),這個(gè)方法是配置驅(qū)動(dòng)的入口點(diǎn)。設(shè)備的 I/O 地址和中斷號(hào)可以通過運(yùn)行set_config來改變。在探測(cè)不到接口時(shí),系統(tǒng)管理員可使用該函數(shù)。除開上面提及到的基本方法以外,還有很多的可選方法。通過這些可選的方法,實(shí)現(xiàn)禁止中斷、輪詢模式操作接口、執(zhí)行接口特有的ioctl命令、改變硬件地址、改變接口的MTU、以及hhcache的查詢更新等功能。 套接字緩沖區(qū)介紹套接字緩沖區(qū)這個(gè)結(jié)構(gòu)處于 Linux 內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的核心,Linux內(nèi)核中網(wǎng)絡(luò)數(shù)據(jù)包的傳輸和接收都是通過套接字緩沖區(qū)實(shí)現(xiàn)的。在linux/中, 能看到該結(jié)構(gòu)和函數(shù)原型。(1). 重要成員變量這里描述的成員都是驅(qū)動(dòng)程序需要訪問的。struct net_device *dev;接收或發(fā)送該緩沖區(qū)的設(shè)備。union { /*… */ } h;union { /* …*/ } nh;union { /*…*/} mac;指向報(bào)文中包含的各級(jí)的頭的指針。union中的每個(gè)成員都是一個(gè)不同數(shù)據(jù)結(jié)構(gòu)類型的指針。h中含有傳輸層頭部指針(例如struct tcphdr *th);nh包含網(wǎng)絡(luò)層頭部(例如struct iphdr *iph);以及mac包含鏈路層頭部指針(例如struct ethkr * ethernet)。網(wǎng)絡(luò)驅(qū)動(dòng)程序要負(fù)責(zé)設(shè)置傳入數(shù)據(jù)包的mac指針,這個(gè)任務(wù)正常是由 eth_type_trans 處理,但是非以太網(wǎng)驅(qū)動(dòng)不得直接設(shè)置skb。unsigned char *head;unsigned char *data;unsigned char *tail;unsigned char *end;指向數(shù)據(jù)包中數(shù)據(jù)的指針。head 指向分配內(nèi)存的開頭,data是有效字節(jié)的開始(并且常常稍微比head大一些),tail是有效字節(jié)的結(jié)尾,end指向tail能夠到達(dá)的最大地址。通過它們可以計(jì)算出可用的緩存空間(skbend skbhead)和當(dāng)前使用的空間(skbtail skbdata)。unsigned int len;unsigned int data_len;len是報(bào)文中全部數(shù)據(jù)的長(zhǎng)度,data_len是報(bào)文存儲(chǔ)于單個(gè)片中的數(shù)據(jù)片段的長(zhǎng)度,如果使用sctter/gather I/O,data_len 成員的值為0。unsigned char ip_summed;對(duì)報(bào)文的校驗(yàn)策略。該成員由驅(qū)動(dòng)程序?qū)魅霐?shù)據(jù)包進(jìn)行設(shè)置。unsigned char pkt_type;在發(fā)送過程使用的數(shù)據(jù)包類型。驅(qū)動(dòng)程序負(fù)責(zé)將其設(shè)置為PACKET_HOST (數(shù)據(jù)包是給我的),PACKET_OTHERHOST,PACKET_BROADCAST,或者PACKET_MULTICAST。以太網(wǎng)驅(qū)動(dòng)不顯式修改 pkt_type,因?yàn)閑th_type_trans會(huì)完成這個(gè)工作。shinfo(struct sk_buff *skb);unsigned int shinfo(skb)nr_frags;skb_frag_t shinfo(skb)frags;處于對(duì)性能方面的考慮,skb中的一些信息分散存儲(chǔ)在內(nèi)中與其緊鄰的其他結(jié)構(gòu)中。(2) 作用于緩沖區(qū)的函數(shù)使用sk_buff[11]結(jié)構(gòu)的網(wǎng)絡(luò)驅(qū)動(dòng)程序通過一些正式的接口函數(shù)來操作該結(jié)構(gòu)。下面是最常用的幾個(gè)函數(shù)。struct sk_buff *alloc_skb(unsigned int len, int priority);struct sk_buff *dev_alloc_skb(unsigned int len);分配一個(gè)緩存區(qū)。alloc_skb函數(shù)分配一個(gè)緩存并且將skbdata和skbtail 都初始化成skbhead。dev_alloc_skb函數(shù)以GFP_ATOMIC的優(yōu)先級(jí)調(diào)用 alloc_skb函數(shù),并且在skbhead和skbdata之間保留了一些空間,網(wǎng)絡(luò)層使用這一數(shù)據(jù)空間進(jìn)行優(yōu)化工作,驅(qū)動(dòng)程序不應(yīng)該訪問它。void kfree_skb(struct sk_buff *skb);void dev_kfree_skb(struct sk_buff *skb);void dev_kfree_skb_irq(struct sk_buff *skb);void dev_kfree_skb_any(struct sk_buff *skb);釋放一個(gè)緩沖區(qū)。kfree_skb調(diào)用由內(nèi)核在內(nèi)部使用。一個(gè)驅(qū)動(dòng)應(yīng)當(dāng)使用一種dev_kfree_skb形式的函數(shù)。在非中斷上下文中使用dev_kfree_skb,在中斷上下文中使用dev_kfree_skb_irq,dev_kfree_skb_any在上面兩種情況下均可以使用。unsigned char *skb_put(struct sk_buff *skb, int len);unsigned char *__skb_put(struct sk_buff *skb, int len);更新sk_buff構(gòu)中的tail和len成員;可用這些函數(shù)在緩沖區(qū)尾部添加數(shù)據(jù)。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ù)是添加到報(bào)文的開始而不是結(jié)尾以外,它們的功能與skb_put相似。在傳輸數(shù)據(jù)包之前,可使用該函數(shù)添加硬件頭。int skb_tailroom(struct sk_buff *skb);該函數(shù)返回緩沖區(qū)中可用空間的大小。如果驅(qū)動(dòng)程序釋放了多于它能持有的數(shù)據(jù)到緩存中,則系統(tǒng)會(huì)出現(xiàn)panic來標(biāo)識(shí)出這個(gè)錯(cuò)誤。int skb_headroom(struct sk_buff *skb);。返回data前面的可用空間數(shù)量,也即是有多少字節(jié)能夠保存在該緩沖區(qū)中。void skb_reserve(struct sk_buff *skb, int len);這個(gè)函數(shù)遞增data和tail。這個(gè)函數(shù)可用來在填充數(shù)據(jù)前保留報(bào)文頭部空間(headroom)。大部分以太網(wǎng)接口在數(shù)據(jù)包之前保留2個(gè)字節(jié),這樣IP頭可在14字節(jié)的以太網(wǎng)頭之后,在16字節(jié)邊界上對(duì)齊。unsigned char *skb_pull(struct sk_buff *skb, int len);從報(bào)文的頭部刪除數(shù)據(jù)。它遞減skblen和遞增skbdata;這是從傳入的數(shù)據(jù)包的頭部剝離硬件頭所使用的方法。int skb_is_nonlinear(struct sk_buff *skb);如果這個(gè)skb分離為多個(gè)片為發(fā)散/匯聚 I/O,則該函數(shù)返回一個(gè)真值。int skb_headlen(struct sk_buff *skb);返回skb的第一個(gè)片的長(zhǎng)度(該部分指向skbdata)。void *kmap_skb_frag(skb_frag_t *frag);void kunmap_skb_frag(void *vaddr);如果要在內(nèi)核中直接訪問非線性skb中的數(shù)據(jù)片段,這些函數(shù)負(fù)責(zé)映射和解除映射。由于使用了原子性的kmap,因此不能一次映射多個(gè)片段。 驅(qū)動(dòng)模塊的加載和卸載在構(gòu)造好驅(qū)動(dòng)模塊之后,需要將其裝入到內(nèi)核,或者在裝入到內(nèi)后以后在某個(gè)時(shí)刻又需要將其卸載。Linux驅(qū)動(dòng)程序的加載有兩種方式:一種是編譯成模塊以供動(dòng)態(tài)加載,使用insmod或者rmmod加載或卸載設(shè)備驅(qū)動(dòng)程;另一種是靜態(tài)編譯進(jìn)內(nèi)核。模塊設(shè)計(jì)是Linux中特有的技術(shù),它使Linux內(nèi)核功能易于擴(kuò)展,采用模塊方式來設(shè)計(jì)Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序也很方便,并且能夠形成固定的模式。在嵌入式設(shè)備中,硬件一般只是完成比較特定、專一的功能,一般選擇將驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核,這樣可以獲得更高的效率。根據(jù)這兩種方式的特點(diǎn),本工程在調(diào)試過程中采用模塊加載,方便調(diào)試,省去了反復(fù)編譯內(nèi)核的麻煩,調(diào)試成功后將其編譯進(jìn)內(nèi)核,以獲得更高的運(yùn)行效率。模塊加載設(shè)計(jì)步驟如圖31:Insmod命令I(lǐng)nit module()初始化Register_retdev()注冊(cè)Init指針初始化函數(shù)Rmmod命令關(guān)閉網(wǎng)卡設(shè)備數(shù)據(jù)包發(fā)送和接收打開網(wǎng)卡設(shè)備圖31 模塊加載步驟圖通過模塊加載命令insmod把網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序插入到內(nèi)核之中,入口函數(shù)init_module()通過調(diào)用register_netdev0函數(shù)在Linux系統(tǒng)中注冊(cè)該網(wǎng)絡(luò)設(shè)備。如果注冊(cè)成功,則調(diào)用init函數(shù)指針?biāo)赶虻某跏蓟瘮?shù)來對(duì)設(shè)備初始化,將設(shè)備的net_device數(shù)據(jù)結(jié)構(gòu)插入到鏈表的末尾。初始化結(jié)束后,就可以打開設(shè)備進(jìn)行數(shù)據(jù)包的發(fā)送和接收。在需要卸
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1