




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、嵌入式嵌入式Linux系統高級開發講義系統高級開發講義 第四天 日程l嵌入式Linux網絡子系統分析 l嵌入式Linux網卡驅動編寫實例 日程安排l嵌入式嵌入式Linux網絡子系統分析網絡子系統分析ISO/OSI七層協議模型TCP/IP協議族lTCPTransmission Control Protocoll傳輸控制協議,基于銜接的效力lUDPUser Datagram Protocoll用戶數據報協議,無銜接的效力lIPInternet ProtocollInternet協議,信息傳送機制OSI模型與TCP/IP協議的對比TCP或UDPIP和路由網卡驅動TelnetFTPWWW等音訊包的逐層
2、遞增Linux網絡協議棧分層l系統調用接口層l協議無關的接口層,就是SOCKET層。l 屏蔽底層的不同協議,以便與系統調用層之間的接口可以簡單,一致l網絡協議實現層IP,ICMP,ARP,RARP,TCP,UDP等 l與詳細設備無關的驅動接口層l驅動程序層日程安排l嵌入式嵌入式Linux網卡驅動編寫網卡驅動編寫l網絡設備驅動程序簡介網絡設備驅動程序簡介ldevice數據構造數據構造lsk_buff數據構造數據構造l內核的驅動程序接口內核的驅動程序接口l以太網控制器以太網控制器sk_buff構造l一個sk_buff代表著一個網絡報文。既包含報文的數據,也包含報文的控制信息。lstruct sk_
3、buff ll struct net_device *dev; /接納和發送sk_buff的設備l union h; /h,nh,mac等指向sk_buff中各層報文頭l unsigned char *head,*data,*tail,*end; /head和tail指向已分配空間的開頭和結尾,data和tail分別是有效數據的開頭與結尾。l lsk_buff分配與釋放l分配:lstruct sk_buff *alloc_skb(unsigned int size,int gfp_mask) l克隆:lstruct sk_buff *skb_clone(struct sk_buff *skb,
4、 int gfp_mask)l釋放:lvoid kfree_skb(struct sk_buff *skb) sk_buff的操作函數l在sk_buff緩沖區的尾部添加數據。lunsigned char *skb_put(struct sk_buff *skb, unsigned int len)l在sk_buff緩沖區的頭部添加數據。lunsigned char * skb_push(struct sk_buff *skb, unsigned int len) l在填充sk_buff緩沖區前保管報文頭空間。lvoid skb_reserve(struct sk_buff *skb, unsi
5、gned int len)l從數據包頭中刪除數據。如剝離報文硬件頭部。lunsigned char *skb_pull(struct sk_buff *skb,int len)編寫網絡驅動程序發送和接納發送和接納 這是一個網絡設備最根本的功能這是一個網絡設備最根本的功能如一塊網卡所做的無非就是收發任務。所以驅動程序里如一塊網卡所做的無非就是收發任務。所以驅動程序里要通知系統發送函數在哪里,系統在有數據要發送時要通知系統發送函數在哪里,系統在有數據要發送時就會調用發送程序。就會調用發送程序。驅動程序由于是直接支配硬件的,所以網絡硬件有數據驅動程序由于是直接支配硬件的,所以網絡硬件有數據收到,最先
6、能得到這個數據的也就是驅動程序,它擔收到,最先能得到這個數據的也就是驅動程序,它擔任把這些原始數據進展必要的處置,然后送給系統。任把這些原始數據進展必要的處置,然后送給系統。這里,操作系統必需求提供兩個機制:這里,操作系統必需求提供兩個機制:找到驅動程序的發送函數找到驅動程序的發送函數驅動程序把收到的數據送給系統驅動程序把收到的數據送給系統net_device構呵斥員l一個net_device ,表示一個網絡設備。lstruct net_devicelchar nameIFNAMSIZE; /設備稱號l ulong base_addr; /網絡接口的I/O基地址l uchar irq; /中斷
7、號l ushort hard_header_len;/硬件頭的長度(14)l char addr_len; /MAC地址長度l char dev_addr /設備的硬件MAC地址l ushort flags; /接口標志??梢栽O置網絡設備為混雜方式,組播方式,回環設備,UP形狀標志,不執行ARP等等。l 網絡設備的各種操作方法ll net_device常用方法成員l初始化 : int (*init) (struct net_device *dev)l翻開接口:int (*open) (struct net_device*);l停頓接口:int (*stop) (struct net_devic
8、e*);l 數據發送:int (*hard_start_xmit) (struct sk_buff *skb,struct net_device*);l建立硬件頭:int (*hard_header) (.)l獲取統計信息:網絡設備驅動注冊l分配net_device:lstruct net_device* alloc_netdev(int sizeof_priv, char *name, void (*setup) (struct net_device *);lnet_device初始化l給net_device構造的成員賦值l注冊net_device:lregister_netdev(stru
9、ct net_device *) 網絡驅動程序的-初始化initl驅動程序必需有一個初始化方法l在把驅動程序載入系統的時候會調用這個初始化程序。它做以下幾方面的任務:l檢測設備:在初始化程序里他可以根據硬件的特征檢查硬件能否存在,然后決議能否啟動這個驅動程序。l配置和初始化硬件:在初始化程序里可以完成對硬件資源的配置,比如即插即用的硬件就可以在這個時候進展配置(Linux內核對PnP功能沒有很好的支持,可以在驅動程序里完成這個功能)。l配置或協商好硬件占用的資源以后,就可以向系統懇求這些資源。有些資源是可以和別的設備共享的,如中斷。有些是不能共享的,如IO、DMA。l初始化device構造中的
10、變量l讓硬件正式開場任務 網絡驅動程序網絡驅動程序翻開翻開翻開翻開(open) (open) openopen這個方法在網絡設備驅動程序里是在網絡設備被激這個方法在網絡設備驅動程序里是在網絡設備被激活的時候被調用活的時候被調用( (即設備形狀由即設備形狀由down-up)down-up)實踐上很多在實踐上很多在initializeinitialize中的任務可以放到這里來做。比中的任務可以放到這里來做。比如資源的懇求、硬件的激活。如資源的懇求、硬件的激活。假設假設dev-opendev-open前往非前往非0(error)0(error),那么硬件的形狀還是,那么硬件的形狀還是down dow
11、n openopen方法另一個作用是假設驅動程序做為一個模塊被裝入,方法另一個作用是假設驅動程序做為一個模塊被裝入,那么要防止模塊卸載時設備處于翻開形狀。那么要防止模塊卸載時設備處于翻開形狀。使能隊列使能隊列netif_start_queue (dev);netif_start_queue (dev);網絡驅動程序網絡驅動程序封鎖封鎖封鎖封鎖(stop) (stop) closeclose方法做和方法做和openopen相反的任務??梢葬尫拍承┫喾吹娜蝿???梢葬尫拍承┵Y源以減少系統負擔。資源以減少系統負擔。closeclose是在設備形狀由是在設備形狀由upup轉為轉為downdown時被調用
12、的時被調用的closeclose方法必需前往勝利方法必需前往勝利(0=success)(0=success)制止隊列制止隊列netif_stop_queue (dev); netif_stop_queue (dev); 網絡驅動程序網絡驅動程序發送發送發送發送(hard_start_xmit) (hard_start_xmit) 一切的網絡設備驅動程序都必需有這個發送方法。一切的網絡設備驅動程序都必需有這個發送方法。在系統調用驅動程序的在系統調用驅動程序的xmitxmit時,發送的數據放在一個時,發送的數據放在一個sk_buffsk_buff構造中。構造中。普通的驅動程序把數據傳給硬件發出去。
13、也有一些特殊的設普通的驅動程序把數據傳給硬件發出去。也有一些特殊的設備比如備比如loopbackloopback把數據組成一個接納數據再回送給系統,把數據組成一個接納數據再回送給系統,或者或者 dummydummy設備直接丟棄數據。設備直接丟棄數據。 假設發送勝利,假設發送勝利,hard_start_xmithard_start_xmit方法里釋放方法里釋放sk_buffsk_buff,前往,前往0(0(發送勝利發送勝利) )假設設備暫時無法處置,比如硬件忙,那么前往假設設備暫時無法處置,比如硬件忙,那么前往1 1。這時假。這時假設設dev-tbusydev-tbusy置為非置為非0 0,那么
14、系統以為硬件忙,要等到,那么系統以為硬件忙,要等到dev-tbusydev-tbusy置置0 0以后才會再次發送。以后才會再次發送。tbusytbusy的置的置0 0義務普通義務普通由中斷完成。由中斷完成。網絡驅動程序網絡驅動程序發送續發送續l硬件在發送終了后產生中斷,這時可以把tbusy置0,然后用mark_bh()調用通知系統可以再次發送。l在發送不勝利的情況下,也可以不置dev-tbusy為非0,這樣系統會不斷嘗試重發。l假設hard_start_xmit發送不勝利,那么不要釋放sk_buff。 l傳送下來的sk_buff中的數據曾經包含硬件需求的幀頭。所以在發送方法里不需求再填充硬件幀
15、頭,數據可以直接提交給硬件發送。sk_buff是被鎖住的(locked), 確保其他程序不會存取它。 網絡驅動程序網絡驅動程序接納接納接納接納(reception) (reception) 驅動程序并不存在一個接納方法。有數據收到應驅動程序并不存在一個接納方法。有數據收到應該是驅動程序來通知系統的。該是驅動程序來通知系統的。 普通設備收到數據后都會產生一個中斷,在中斷處普通設備收到數據后都會產生一個中斷,在中斷處置程序中驅動程序懇求一塊置程序中驅動程序懇求一塊sk_buff(skb)sk_buff(skb),從硬,從硬件讀出數據放置到懇求好的緩沖區里。接下來填件讀出數據放置到懇求好的緩沖區里。
16、接下來填充充sk_buffsk_buff中的一些信息。中的一些信息。skb-dev = devskb-dev = dev,判,判別收到幀的協議類型,填入別收到幀的協議類型,填入skb-protocol(skb-protocol(多協多協 議的支持議的支持) )。把指針把指針skb-mac.rawskb-mac.raw指向硬件數據然后丟棄硬件幀指向硬件數據然后丟棄硬件幀頭頭(skb_pull)(skb_pull)。網絡驅動程序網絡驅動程序接納續接納續l還要 設置skb-pkt_type,標明第二層(鏈路層)數據類型??梢允且韵骂愋停?PACKET_BROADCAST : 鏈路層廣播 PACKET
17、_MULTICAST : 鏈路層組播 PACKET_SELF : 發給本人的幀 PACKET_OTHERHOST : 發給他人的幀(監聽方式時會有這種幀) l最后調用netif_rx()把數據傳送給協議層。netif_rx()里數據放入處置隊列然后前往,真正的處置是在中斷前往以后,這樣可以減少中斷時間。l調用netif_rx()以后,驅動程序就不能再存取數據緩沖區skb。 網絡驅動程序網絡驅動程序硬件幀頭硬件幀頭l硬件普通都會在上層數據發送之前加上本人的硬件幀頭,比如以太網(Ethernet)就有14字節的幀頭。這個幀頭是加在上層ip、ipx等數據包的前面的。l驅動程序提供一個hard_hea
18、der方法,協議層(ip、ipx、arp等)在發送數據之前會調用這段程序。 l硬件幀頭的長度必需填在dev-hard_header_len,這樣協議層回在數據之前保管好硬件幀頭的空間。這樣hard_header程序只需調用skb_push然后正確填入硬件幀頭就可以了。 網絡驅動程序網絡驅動程序硬件幀頭續硬件幀頭續1 1l在協議層調用hard_header時,傳送的參數包括:l數據的sk_buff ldevice指針lProtocoll目的地址(daddr) l源地址(saddr) l數據長度(len)l數據長度不要運用sk_buff中的參數,由于調用hard_header時數據能夠還沒完全組織
19、好 lsaddr是NULL的話是運用缺省地址(default)ldaddr是NULL闡明協議層不知道硬件目的地址l假設hard_header完全填好了硬件幀頭,那么前往添加的字節數。網絡驅動程序的根本方法網絡驅動程序的根本方法地址解析地址解析地址解析地址解析(xarp) (xarp) 有些網絡有硬件地址有些網絡有硬件地址( (比如比如Ethernet)Ethernet),并且在發送,并且在發送硬件幀時需求知道目的硬件地址。這樣就需求上層協議硬件幀時需求知道目的硬件地址。這樣就需求上層協議地址地址(ip(ip、ipx)ipx)和硬件地址的對應。這個對應是經過地址和硬件地址的對應。這個對應是經過地
20、址 解析完成的。解析完成的。需求做需求做arparp的的設備在發送之前會調用驅動程序的的的設備在發送之前會調用驅動程序的rebuild_headerrebuild_header方法。調用的主要參數包括:方法。調用的主要參數包括:指向硬件幀頭的指針指向硬件幀頭的指針協議層地址協議層地址假設驅動程序可以解析硬件地址,就前往假設驅動程序可以解析硬件地址,就前往1 1,假設不能,前,假設不能,前往往0 0。 對對rebuild_headerrebuild_header的調用在的調用在net/core/et/core/dev.c的的do_dev_queue_xmit()do_dev_queue_xmit
21、()里。里。 網絡驅動程序網絡驅動程序參數設置和統計數據參數設置和統計數據 參數設置和統計數據參數設置和統計數據 在驅動程序里還提供一些方法供系統對設在驅動程序里還提供一些方法供系統對設備的參數進展設置和讀取信息。備的參數進展設置和讀取信息。普通只需超級用戶普通只需超級用戶(root)(root)權限才干對設備參數進權限才干對設備參數進展設置。展設置。設置方法有:設置方法有: dev-set_mac_address() dev-set_mac_address() 當用戶調用當用戶調用ioctlioctl類型為類型為SIOCSIFHWADDRSIOCSIFHWADDR時是要時是要設置這個設備的設
22、置這個設備的macmac地址。普通對地址。普通對macmac地址的設地址的設置沒有太大意義的。置沒有太大意義的。 網絡驅動程序網絡驅動程序參數設置和統計數據參數設置和統計數據 續續ldev-set_config() 當用戶調用ioctl時類型為SIOCSIFMAP時,系統會調用驅動程序的set_config方法。用戶會傳送一個ifmap構造包含需求的I/O、中斷等參數。 l除次之外驅動程序還可以提供一個dev-get_stats方法,前往一個enet_statistics構造,包含發送接納的統計信息。 lioctl的處置在net/core/dev.c的dev_ioctl()和dev_ifsio
23、c()里 硬件發送忙時的處置l主CPU的處置才干普通比網絡發送要快,所以經常會遇到系統有數據要發,但上一包數據網絡設備還沒發送完。由于在Linux里網絡設備驅動程序普通不做數據緩存,不能發送的數據都是通知系統發送不勝利,所以必需求有一個機制在硬件不忙時及時通知系統接著發送下面的數據。 l普通對發送忙的處置在前面設備的發送方法(hard_start_xmit)里曾經描畫過,即假設發送忙,置tbusy為1。處置完發送數據后,在發送終了中斷里清tbusy,同時用mark_bh()調用通知系統繼續發送。 但在詳細實現驅動程序時發現,這樣的處置系統好象并不能及時地知道硬件曾經空閑了,即在mark_bh()以后,系統要等一段時間才會接著發送。呵斥發送效率很低。l實現時不把tbusy置1,讓系一致直以為硬件空閑,但是報揭露送不勝利。系統會不斷嘗試重發。這樣處置就運轉正常了。流量控制l網絡數據的發送和接納都需求流量控制。這些控制是在系統里實現的,不需求驅動程序做任務。l每個設備數據構造里都有一個參數dev-tx_queue_len,這個參數 標明發送時最多緩存的數據包。在Linux系統
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 母嬰用品專業代購服務合作協議
- 遺產糾紛調節協議書
- 裝修公司結算協議書
- 銀行承兌抽屜協議書
- 酒店經營合伙協議書
- 首飾工廠訂購協議書
- 鄉村黨建宣傳欄協議書
- 餐廳設備租售協議書
- 跳舞團隊免責協議書
- 解除勞務協議協議書
- 轉讓店鋪輪胎協議書
- 2025年遼寧省盤錦市中考數學二模試卷
- 完整版新修訂《厲行節約反對浪費條例》(課件)
- (區縣版)-中小學教輔材料征訂專項整治工作方案
- 文員崗位筆試試題及答案
- 2025年制冷工職業技能競賽參考試題庫(共500題含答案)
- 2024年河北承德辰飛供電服務有限公司招聘真題
- 小米集團2024年環境、社會及管治報告(ESG)
- 手機媒體概論(自考14237)復習題庫(含真題、典型題)
- 晶圓缺陷檢測算法-全面剖析
- 江蘇省蘇、錫、常、鎮2025年高考物理三模試卷含解析
評論
0/150
提交評論