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

正文內容

linux下網絡驅動程序設計與開發(fā)(編輯修改稿)

2025-08-03 11:57 本頁面
 

【文章內容簡介】 頭部指針(例如 struct tcphdr *th) ;nh 包含網絡層頭部(例如 struct iphdr *iph) ;以及 mac 包含鏈路層頭部指針(例如 struct ethkr * ether) 。網絡驅動程序要負責設置傳入數據包的 mac 指針,這個任務正常是由 eth_type_trans 處理,但是非以太網驅動不得直接設置 skb。unsigned char *head;unsigned char *data;unsigned char *tail;unsigned char *end;指向數據包中數據的指針。head 指向分配內存的開頭,data 是有效字節(jié)的開始(并且常常稍微比 head 大一些) ,tail 是有效字節(jié)的結尾, end 指向 tail 能夠到達的最大地址。通過它們可以計算出可用的緩存空間(skbend skbhead)和當前使用的空間(skbtail skbdata ) 。unsigned int len;unsigned int data_len;len 是報文中全部數據的長度,data_len 是報文存儲于單個片中的數據片段的長度,如果使用 sctter/gather I/O,data_len 成員的值為 0。unsigned char ip_summed;對報文的校驗策略。該成員由驅動程序對傳入數據包進行設置。unsigned char pkt_type;在發(fā)送過程使用的數據包類型。驅動程序負責將其設置為 PACKET_HOST (數據包是給我的) ,PACKET_OTHERHOST,PACKET_BROADCAST,或者PACKET_MULTICAST。以太網驅動不顯式修改 pkt_type,因為 eth_type_trans 會完成這個工作。shinfo(struct sk_buff *skb);unsigned int shinfo(skb)nr_frags;skb_frag_t shinfo(skb)frags;處于對性能方面的考慮,skb 中的一些信息分散存儲在內中與其緊鄰的其他結構中。(2) 作用于緩沖區(qū)的函數使用 sk_buff[11]結構的網絡驅動程序通過一些正式的接口函數來操作該結構。下面是最常用的幾個函數。struct sk_buff *alloc_skb(unsigned int len, int priority);struct sk_buff *dev_alloc_skb(unsigned int len);分配一個緩存區(qū)。alloc_skb 函數分配一個緩存并且將 skbdata 和 skbtail 都初始化成 skbhead。dev_alloc_skb 函數以 GFP_ATOMIC 的優(yōu)先級調用 alloc_skb函數,并且在 skbhead 和 skbdata 之間保留了一些空間,網絡層使用這一數據空間進行優(yōu)化工作,驅動程序不應該訪問它。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);釋放一個緩沖區(qū)。kfree_skb 調用由內核在內部使用。一個驅動應當使用一種dev_kfree_skb 形式的函數。在非中斷上下文中使用 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 構中的 tail 和 len 成員;可用這些函數在緩沖區(qū)尾部添加數據。unsigned char *skb_push(struct sk_buff *skb, int len);unsigned char *__skb_push(struct sk_buff *skb, int len);遞減 skbdata 和遞增 skblen 的函數。除了數據是添加到報文的開始而不是結尾以外,它們的功能與 skb_put 相似。在傳輸數據包之前,可使用該函數添加硬件頭。int skb_tailroom(struct sk_buff *skb);該函數返回緩沖區(qū)中可用空間的大小。如果驅動程序釋放了多于它能持有的數據到緩存中,則系統(tǒng)會出現 panic 來標識出這個錯誤。int skb_headroom(struct sk_buff *skb);。返回 data 前面的可用空間數量,也即是有多少字節(jié)能夠保存在該緩沖區(qū)中。void skb_reserve(struct sk_buff *skb, int len);這個函數遞增 data 和 tail。這個函數可用來在填充數據前保留報文頭部空間(headroom) 。大部分以太網接口在數據包之前保留 2 個字節(jié),這樣 IP 頭可在 14字節(jié)的以太網頭之后,在 16 字節(jié)邊界上對齊。unsigned char *skb_pull(struct sk_buff *skb, int len);從報文的頭部刪除數據。它遞減 skblen 和遞增 skbdata;這是從傳入的數據包的頭部剝離硬件頭所使用的方法。int skb_is_nonlinear(struct sk_buff *skb);如果這個 skb 分離為多個片為發(fā)散/匯聚 I/O,則該函數返回一個真值。int skb_headlen(struct sk_buff *skb);返回 skb 的第一個片的長度(該部分指向 skbdata)。void *kmap_skb_frag(skb_frag_t *frag);void kunmap_skb_frag(void *vaddr);如果要在內核中直接訪問非線性 skb 中的數據片段,這些函數負責映射和解除映射。由于使用了原子性的 kmap,因此不能一次映射多個片段。 驅動模塊的加載和卸載對驅動模塊構造好之后,我們需要把驅動模塊裝入內核,在必要的時候我們也需要將其卸載。 Linux 驅動程序的加載有兩種方式:一種是動態(tài)加載,使用 insmod 或者 rmmod加載或卸載設備驅動程;另外一種是靜態(tài)加載。Linux 中獨有的技術是模塊設計,模塊設計能夠很方便的擴展 Linux 的內核功能,我們在設計 Linux 網絡設備驅動程序時,應用模塊方式也很簡單易行,而且可以固定模式。在嵌入式設備中,硬件的功能一般是特定、專一的,在將驅動程序編進內核時,我們通常選擇靜態(tài)編譯來獲得更高的效率?;谶@兩種方式的特點,我們在調試過程中,采用模塊加載的方法,這樣做是為了調試方便,可以使編譯內核更加簡單,在調試成功以后,我們就把其編譯進內核,這樣運行效率會更高。模塊加載設計步驟如圖 31:圖 模塊加載步驟圖在加載命令 insmod 時,通過模塊我們可以使網絡設備驅動程序插入進內核,入口函數 init_module()可以調用 register_dev0 函數,網絡設備就是在 Linux系統(tǒng)中注冊。注冊成功后,就可以調用 init 函數指針所指向的初始化函數,初始化設備,把設備中的 _device 數據結構進行處理,在鏈表的末尾插入。在結束初始化后,就能夠打開設備,發(fā)送和接收數據包。進行模塊卸載時,先關閉設備,再通過執(zhí)行模塊卸載命令 rmmod 來調用驅動 cleanup_moduIe()函數卸載該模塊。Rmmod 工具完成模塊從內核中的模塊移除任務。如果內核認為模塊仍然在使用狀態(tài)(例如,某個程序正打開由該模塊導出的設備文件) ,或者內核被配置為禁止移除該模塊,則無法移除該模塊 編寫網絡驅動程序的一些基本概念所有操作系統(tǒng)的驅動程序具有通用的概念。同時操作系統(tǒng)給予驅動程序的支持也一樣。對于網絡設備驅動程序的若干基本要求,我們通過下面的文字簡單介紹一下。Insmod 命令Init module()初始化Register_retdev()注冊Init 指針初始化函數Rmmod 命令關閉網卡設備數據包發(fā)送和接收打開網卡設備 發(fā)送和接收發(fā)送和接收是網絡設備最基本的功能。網卡的本職工作就是收發(fā)。因此在驅動程序里,需要通知系統(tǒng)發(fā)送函數的位置,在有數據要發(fā)送時,系統(tǒng)會調用發(fā)送程序。有的驅動程序因為是直接操縱硬件的,因此驅動程序能最先得到這個數據,驅動程序的任務是把原始數據進行必須的處理后,然后傳入到系統(tǒng)里。操作系統(tǒng)需要提供兩個不同的機制,首先是發(fā)現驅動程序的發(fā)送函數,然后驅動程序接收數據后,把它傳給系統(tǒng)。 中斷在現代計算機結構中,中斷有著很特殊的作用。操作系統(tǒng)一定得提供驅動程序響應中斷的能力。通常情況就是把一個中斷處理程序注冊到系統(tǒng)里。硬件中斷發(fā)生后,操作系統(tǒng)使用驅動程序,通過驅動程序處理程序。Linux 支持對中斷的共享,就是對一個中斷,許多個設備共享。 時鐘時鐘在實現驅動程序時侯,會應用到很多地方。比如超時處理,缺乏中斷機制的硬件輪詢。操作系統(tǒng)可以為驅動程序提供定時機制。通常回調注冊的時鐘函數是在預定時間過了之后。在網絡驅動程序中,假如硬件缺乏中斷性能,定時器可以提供輪詢(poll)方式,從而存取硬件。第四章 系統(tǒng)分析 S3C2410 ARM 開發(fā)板介紹CPU:S3C2410 ARM 的 CPU 采用 SAMSUNG S3C2410 ARM920t ,集成有串口,SD 卡控制器,USB Host 和 USB device 控制器,LCD 控制器,Nand Flash 控制器等。存儲器由以下部分構成:64M SDRAM,64M Nand Flash,32M Intel StrataFlash 32M(默認不焊接) ,SD 卡,一個 VGA(直接連接普通 PC 顯示器) , CS8900 以太網控制器,IDE 接口,一個 USB 主機接口,一個 USB 設備接口(可以切換成第二主機,需要更改驅動) ,一個總線擴展接口(包含 16 位數據,12 位地址,兩個片選,可以通過 CPLD 控制) 。其他關聯(lián)設備:2 個串口輸出,一個 MIC 輸入接口,一個 LINE 音頻輸入接口,一個耳機輸出接口,2 個 CPU 可控 LED,AD 轉換輸入接口,SPI 和 IIC 接口,JTAG調試接口,CPLD 編程接口,擴展 GPRS 和 CDMA 專用接口(包含 電平的串口,SPI 口,IO 引腳,電源等) 。 需求分析以及 MII 接口隨著 內核代碼不斷的提高級別,我們看到隨著升級,內核代碼的編寫也趨于混亂,就現在來看,在清晰度上, 比 更加有優(yōu)勢,也分類定義了資源,具有很好的可讀性,修改起來也很簡單; 的代碼大量使用 C 的 struct,從而具有 C++的面向對象風格; 支持標準的高級電源管理;在同一個目標板上,的內核相比 的內核,具有更高的效能。 三星的 sdmk 開發(fā)板使用這種內核,相比較而言, 的內核的驅動程序比較全,大部分國內的 2410 應用的是 的內核。目前在 s3c2410 開發(fā)板上, 的內核能夠很穩(wěn)定的運行,通過完成驅動程序,很快就可以實現移植。MII(Media Independent Interface 介質無關接口) [13],或稱為媒體獨立接口,它是 定義的以太網行業(yè)標準。它包括一個數據接口,以及一個MAC 和 PHY 之間的管理接口。數據接口包括分別用于發(fā)送器和接收器的兩條獨立信道。每條信道都有自己的數據、時鐘和控制信號。MII 數據接口總共需要 16 個信號。管理接口是個雙信號接口:一個是時鐘信號,另一個是數據信號。通過管理接口,上層能監(jiān)視和控制 PHY。MII(Management interface)只有兩條信號線。MII 標準接口用于連接 Fast Ether MACblock 與 PHY。在不對 MAC 硬件重新設計或替換的情況下,任何類型的 PHY 設備都可以正常工作。在其他速率下工作的與 MII 等效的接口有:AUI(10M 以太網)、GMII(Gigabit 以太網)和XAUI(10Gigabit 以太網)。在 中規(guī)定的 MII 總線是一種用于將不同類型的 PHY 與相同網絡控制器(MAC)相連接的通用總線。網絡控制器可以用同樣的硬件接口與任何 PHY 進行連接。以太網媒體接口有:MII,RMII,SMII,GMII,所有的這些接口都從 MII 而來,MII 是(Medium Independent Interface)的意思,是指不用考慮媒體是銅軸、光纖、電纜等,因為這些媒體處理的相關工作都有 PHY 或者叫做 MAC 的芯片完成。MII 支持 10 兆和 100 兆的操作,一個接口由 14 根線組成,它的支持還是比較靈活的,但是有一個缺點是因為它一個端口用的信號線太多,如果一個 8 端口的交換機要用到 112 根線,16 端口就要用到 224 根線,到 32 端口的話就要用到 448 根線,一般按照這個接口做交換機,是不太現實的,所以現代的交換機的制作都會用到其它的一些從 MII 簡化出來的標準,比如 RMII、SMII、MII 等。 寄存器的訪問方式上面已經說過,MAC 對 PHY 寄存器的讀寫訪問是通過MII 接口實現的。標準寄存器都可以通
點擊復制文檔內容
試題試卷相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1