linux網路裝置驅動

2021-09-06 11:33:36 字數 2566 閱讀 3847

linux網路裝置驅動

linux網路驅動程式的體系結構可劃分為4個層次。linux核心源**中提供了網路裝置介面及以網路子系統的上層的**,移植特定網路硬體的驅動程式的主要工作就是完成裝置驅動功能層的相應**,根據底層具體的硬體特性,定義網路裝置介面struct net_device型別的結構體變數,並實現其中相應的操作函式及中斷處理程式。

linux中所有的網路裝置都抽象為乙個統一的介面,即網路裝置介面,通過struct net_device型別的結構體變數表示網路裝置在核心中的運**況,這裡既包括回環(loopback)裝置,也包括硬體網路裝置介面。核心通過以dev_base為頭指標的裝置鍊錶來管理所有的網路裝置。

套接字緩衝區sk_buff相關操作:

分配空間:struct sk_buff *dev_alloc_skb(unsigned len)

釋放空間:

dev_kfree_skb(struct sk_buff *skb);  //用於非中斷上下文

dev_kfree_skb_irq(struct sk_buff *skb);  //用於中斷上下文

dev_kfree_skb_any(struct sk_buff *skb);  //上述兩種情況均可

put操作:

unsignedchar *skb_put(struct sk_buff *skb, unsigned int len);

unsigned char *__skb_put(struct sk_buff *skb, unsigned int len);

作用:在緩衝區尾部新增資料,tail指標下移len長度,並增加sk_buff中len的值,返回改變後的tail值。

push操作:

unsigned char *skb_push(struct sk_buff *skb, unsigned int len);

unsigned char *__skb_push(struct sk_buff *skb, unsigned int len);

作用:將data指標上移,同時增加sk_buff中的len。主要用於在資料報傳送時新增頭部。函式帶__和不帶__的區別在於:帶__的會檢測放入緩衝區的資料,後則不會。

pull操作:

unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);

作用:將data指標下移,並減少sk_buff中的len值。這個操作一般用於下層協議向上層協議移交資料報,使data指標指向上一層協議的協議頭。

reserve操作:

void skb_reserve(struct sk_buff *skb, unsigned int len);

作用:將data和tail指標同時下移,這個操作主要用於在儲存空間的頭部預留len長度的空隙。

網路裝置介面層:

structnet_device_ops

實現這些函式中的一部分後,就實現了驅動的功能了,為千變萬化的網路裝置定義統一的、抽象的資料結構net_device結構體,以不變應萬變,實現多種硬體在軟體層次上的統一。net_device結構體在核心中指代乙個網路裝置,網路裝置驅動只需填充其結構體就可以實現核心與具體硬體操作函式的掛接。實際驅動的編寫過程中,我們並不需要實現全部的函式,實際上,我們只要根據具體的需要實現上邊的部分就可以了。

linux網路裝置驅動程式實現:

**編寫步驟:

#include

#include

#include

#include

#include

static int gecnet_init(struct net_device *dev)

static void gecnet_uninit(struct net_device *dev)

static int gecnet_open(struct net_device *dev)

static int gecnet_stop(struct net_device *dev)

static netdev_tx_t gecnet_start_xmit(struct sk_buff *skb,struct net_device *dev)

static int gec_net_rx(struct net_device *dev)

struct net_device_ops gec_netops =;

static int __init gec_net_init(void)

static void __exit gec_net_exit(void)

module_init(gec_net_init);

module_exit(gec_net_exit);

module_license("gpl");

linux 網路裝置驅動

linux 網路驅動 謹以此文紀念過往的歲月 一.前言 在linux中網路驅動也是乙個大頭,如何去理解網路驅動是作為乙個linux驅動工程師必備的技能。不過同樣的裝置,在不同人的手中會有不同的效果,其原因就在於驅動的好與否。二.裝置註冊 學習網路的驅動與學習普通cdev驅動一樣,都是學習其模板,然後...

Linux網路裝置驅動 一

一 網路裝置驅動基礎 1.乙太網基礎理論 乙太網是區域網的一種,它使用載波監聽多路訪問及衝突檢測技術 csma cd 並以10m s的速率執行在多種型別的電纜上,常用的網絡卡晶元有dm9000 dm9161 cs8900晶元。乙太網的拓撲結構有匯流排型和星型,乙太網的工作模式有半雙工和全雙工。目前雙...

Linux下的網路裝置驅動 一

一 網路裝置驅動基礎 1.乙太網基礎理論 乙太網是區域網的一種,它使用載波監聽多路訪問及衝突檢測技術 csma cd 並以10m s的速率執行在多種型別的電纜上,常用的網絡卡晶元有dm9000 dm9161 cs8900晶元。乙太網的拓撲結構有匯流排型和星型,乙太網的工作模式有半雙工和全雙工。目前雙...