網絡卡驅動程式

2021-06-16 05:14:50 字數 2620 閱讀 9192

1、網路子系統(如下的核心空間的幾層)

使用者空間     應用層

核心空間     系統呼叫   通過socket訪問網路子系統

核心空間     協議無關介面    一組通用函式通過socket訪問不同協議

核心空間     網路協議層 各種傳輸層網路層協議tcp udp ip

核心空間     裝置無關介面

核心空間     裝置驅動

硬體裝置

2、網絡卡驅動

裝置描述:

每個網路介面都由乙個net_device結構來描述,可使用如下核心函式動態分配

struct net_device *alloc_netdev(int sizeof_priv, constr char *mast裝置名, void (*setup)(struct net_device *))

struct net_device *alloc_etherdev(int sizeof_priv)

這兩個函式有什麼關係呢?

struct net_device

{char name[ifnamesiz]    裝置名,如eth%d   "%"表示這個數字由動態的分配編號,以防號衝突

unsigned long state        裝置狀態

unsigned long base_addr i/o基位址

unsigned int irq                 中斷號

int (*init)(struct net_device *dev)   在register_netdev時被呼叫來完成對net_device結構的初始化

int (*open)(struct net_device *dev) 開啟介面,ifconfig啟用時,介面將被開啟

int (*stop)(sturct net_device *dev)

int (*hard_start_xmit)(struct sk_buff *skb, struct net_device *dev)   資料傳送函式

int (*do_ioctl)...

int (*set_mac_address)...  改變硬體位址 需要硬體支援該功能

裝置描述:

int register_netdev(struct net_device *dev)

註冊方式與字元驅動不同之處在於它沒有主次裝置號,它不是通過裝置檔案方問,能過socket來問問;

struct sk_buffer{

struct device *dev;   處理該包的裝置

__u32 saddr;        ip源位址

__u32 saddr;        ip上的位址

__u32 raddr;        ip路由器位址

__unsigned char *head   分配空間的開始

__unsigned char *data    有效資料的開始

__unsigned char *tail      有效資料的結束

__unsigned char *end     分配空間的結束

unsigned long  len;          有效資料的長度

它描述乙個網路資料報。

skb操作函式

struct sk_buff *alloc_skb(unsigned int len , int priority)

分配乙個sk_buff結構,供協議棧**使用

struct sk_buff *dev_alloc_skb(unsigned int len)

分配乙個sk_buff結構,供驅動**使用,形成乙個skb結構,交給上層協議去處理

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

向後移動skb的tail指標,並返回tail移動之前的值;用於先有協議頭的情況下向後填充資料;返回移動之前的位址是用於從那裡開始填資料;

unsigned char *skb_put(struct sk_buff *skb, int len)

向前移動skb的head指標,並返回head移動之後的值;用於先有資料的情況下在前邊加協議頭;

kfree_skb(struct sk_buff *skb)

釋放乙個sk_buff結構,供協議棧**使用

dev_dfree_skb(struct sk_buff *skb)

釋放乙個sk_buff結構,供驅動**使用

網絡卡驅動

裝置開啟

open請求任何它需要的系統資源並且啟動介面:

1、註冊中斷,dma等(一般的字元驅動模組載入的時候就註冊中斷,因為它們會一直使用)

2、設定暫存器,啟動裝置

3、啟動傳送佇列,

資料傳送

當核心需傳送乙個資料報時,它呼叫hard_start_transmit函式,該函式根據io,路由等規則找到處理該包的網絡卡,將最終呼叫到該網絡卡的net_device結構中的hard_start_xmint函式

資料接收

中斷方式,當包到達網絡卡後,它會產生乙個接收中斷,接著在包的處理程式中進行包的接收工作,如下三步:

1、分配skb  skb=dev_alloc_skb(pkt-datalen+2)

2、從硬體中讀取資料到skb

3、呼叫netif_rx(skb)將資料交給協議棧

網絡卡驅動程式

我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊 所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了 怎麼寫1 分配某個結構體 2 設定 3...

網絡卡驅動程式框架

我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊 所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了 怎麼寫1 分配某個結構體 2 設定 3...

網絡卡驅動程式實踐

一 虛擬網絡卡的實現 在linux系統中,新增乙個網路裝置大致需要以下步驟。1 分配乙個網路裝置結構體 alloc a net device struct vnet dev alloc netdev 0,eth d ether setup 2 註冊這個網路裝置 register netdev vne...