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

2021-04-25 15:00:32 字數 2368 閱讀 5485

核心預設軟中斷機制分析(

process_backlog

)首先需要介紹的就是

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

函式並且進一步向上層協議遞交和處理。至此,核心的軟中斷的主要過程已經結束了。

接下來我們分析一下

ip層以上的網路協議棧是如何進一步處理資料的,詳細的說明文件見《

網路資料接收的協議處理過程分析》。

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

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

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

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

Linux中軟中斷機制分析

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