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...