6410 linux DM9000收包機制

2021-07-16 13:20:38 字數 1478 閱讀 3388

dm9000網絡卡註冊的中斷函式為dm9000_interrupt(),該中斷函式呼叫dm9000_rx()從網絡卡的buffer中讀取接收到的資料,將資料接收到skb中之後,呼叫netif_rx()處理該資料報,最後的結果是將資料報傳遞給上層處理。

我們看看netif_rx()函式**主要部分:

int netif_rx(struct sk_buff *skb)

#endif

return ret;

}

在enqueue_to_backlog()中,通過__skb_queue_tail(&sd->input_pkt_queue, skb)將skb接入per cpu 變數softnet_data的鏈中。接著在enqueue_to_backlog()中呼叫____napi_schedule()。

if (!__test_and_set_bit(napi_state_sched, &sd

->

backlog.state))

}

我們進入____napi_schedule()函式看看做了什麼

static

inline

void ____napi_schedule(struct softnet_data *sd,

struct napi_struct *napi)

該函式將napi->poll_list加入sd->poll_list中,並置位了系統註冊的軟中斷的第net_rx_softirq位。最後函式從dm9000的中斷函式中返回退出。linux中負責將skb傳遞給上層的函式是__netif_receive_skb(),那麼該函式是怎麼被呼叫的呢?

static void net_rx_action(struct softirq_action *h)

......if (unlikely(work == weight)) else

list_move_tail(&n->poll_list, &sd->poll_list);

}...

...}

簡化之後,該函式首先從poll_list中取出乙個napi_struct ,即____napi_schedule()函式中加入到poll_list中的napi_struct,然後呼叫該napi_struct的poll函式。查詢**,找出poll函式指標指向的函式原型process_backlog(),在process_backlog()函式中執行__netif_receive_skb(skb)將skb傳遞給上層。

這個問題,我在網上搜了好一會兒工夫,最後發現,每次cpu執行完中斷函式後,例如dm9000_interrupt()函式,在cpu退出中斷asm_do_irq()前呼叫irq_exit(),在irq_exit()中執行軟中斷。在軟中斷中喚醒軟中斷處理任務,然後,cpu中斷徹底退出,等到系統排程任務的時候,軟終端所喚醒的任務得以被排程執行。具體來說,就是net_rx_action()函式。

6410 模組程式設計

手把手教你學linux驅動開發 ok6410系列之01 模組程式設計 一 實驗環境 開發機環境 作業系統 ubuntu 9.10 交叉編譯環境 arm linux gcc 4.2.2 安裝位置 usr local arm 4.3.2 6410板子核心原始碼路徑 work linux 2.6.36.2...

Linux D01 目錄和檔案的常用命令

command options parameter 說明 1.1常用linux命令的基本使用序號 命令對應英文 作用01 lslist 檢視當前目錄下的內容 02pwd print working derectory 檢視當前所在的資料夾 03cd 目錄名 change directory 切換資料...

6410之點燈驅動

寫乙個點led的驅動分為下面幾個步驟 1.框架 2.完善硬體的操作 a.看原理圖 b.看6410手冊 c.寫 檢視6410原理圖led sch如下 所以要操作的工作有 1.設定gpm0 gpm3為輸出引腳 2.點燈或者滅燈,對gpmdat 進行操作即可。3.使用ioremap和iounmap對實體地...