網路處理的軟中斷機制分析

2021-05-02 03:39:22 字數 1808 閱讀 3905

首先需要介紹的就是netif_rx(在net/core/dev.c中定義)函式,這個函式在網絡卡驅動程式與linux核心之間建立了一道橋梁,將網絡卡接收上來的資料報(sk_buff形式)插入核心維護的接收緩衝區佇列當中:

int netif_rx(struct sk_buff *skb)

if (queue->throttle)  

netif_rx_schedule(&queue->blog_dev);

goto enqueue;

}if (queue->throttle == 0)

drop:

netdev_rx_stat[this_cpu].dropped++;

local_irq_restore(flags);

kfree_skb(skb);

return net_rx_drop;

}從上面的分析可以知道,netif_rx函式主要負責將資料報插入核心佇列中,並觸發軟中斷,這一點與較早的版本是不同的,那麼軟中斷是在什麼地方觸發的呢?

以前的章節介紹過,硬體中斷是在irq.c的do_irq函式中呼叫handle_irq_event函式,進而呼叫相應硬體驅動程式的中斷處理函式實現的。在do_irq函式執行完硬體處理函式以後,接著就會呼叫do_softirq函式執行軟中斷,並且根據軟中斷號在softirq_vec陣列中查詢相應中斷的action方法,對於net_rx_softirq型別的軟中斷來說,系統將其action註冊為net_rx_action,這樣我們就進入了net_rx_action函式當中:

static void net_rx_action(struct softirq_action *h)

else

}local_irq_enable();

br_read_unlock(br_netproto_lock);

return;

softnet_break:

netdev_rx_stat[this_cpu].time_squeeze++;

/*觸發軟中斷處理,等待下一次呼叫本函式。

*/__cpu_raise_softirq(this_cpu, net_rx_softirq);

local_irq_enable();

br_read_unlock(br_netproto_lock);

}軟中斷處理函式net_rx_action實際上就是呼叫各個網路裝置的poll方法處理資料報的,一般的講,poll預設為process_backlog(在net/core/dev..c中定義):

static int process_backlog(struct net_device *backlog_dev, int *budget)

}接下來看一下sk_buff是如何被遞交到上層協議進行處理的,只是通過呼叫netif_receive_skb(在net/core/dev.c中定義)函式實現的:

int netif_receive_skb(struct sk_buff *skb)

else

}pt_prev = ptype;}}

/*這裡針對各種協議進行處理,ip包的型別為eth_p_ip,因此在這裡處理。

*/for (ptype=ptype_base[ntohs(type)&15];ptype;ptype=ptype->next) else

}pt_prev = ptype;}}

if (pt_prev) else

} else

return ret;

}在軟中斷處理函式當中,我們根據資料報的型別,呼叫相應的底層資料處理函式,對於ip包來說,就是呼叫ip_rcv函式並且進一步向上層協議遞交和處理。至此,核心的軟中斷的主要過程已經結束了。

網路處理的軟中斷機制分析

核心預設軟中斷機制分析 process backlog 首先需要介紹的就是 netif rx 在net core dev.c 中定義 函式,這個函式在網絡卡驅動程式與 linux 核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff 形式 插入核心維護的接收緩衝區佇列當中 int net...

網路處理的軟中斷機制分析

核心預設軟中斷機制分析 process backlog 首先需要介紹的就是netif rx 在net core dev.c中定義 函式,這個函式在網絡卡驅動程式與linux核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff形式 插入核心維護的接收緩衝區佇列當中 int netif rx...

Linux中軟中斷機制分析

什麼是軟中斷機制?linux中的軟中斷機制用於系統中對時間要求最嚴格以及最重要的中斷下半部進行使用。在系統設計過程中,大家都清楚中斷上下文不能處理太多的事情,需要快速的返回,否則很容易導致中斷事件的丟失,所以這就產生了乙個問題 中斷發生之後的事務處理由誰來完成?在前後台程式中,由於只有中斷上下文和乙...