《深入理解Linux網路技術內幕》閱讀筆記(九)

2021-07-05 13:27:41 字數 1733 閱讀 6703

當特定事件發生時,裝置驅動程式會代表核心指示裝置產生硬體中斷。處理函式會把該幀排入佇列某處,然後通知核心。該技術是低流量負載下的最佳選擇。遺憾的是,在高流量負載下就無法良好運作:每接收乙個幀就強制產生中斷,很快就會讓cpu為處理中斷事件浪費所有的時間。

負責接收幀的**分成兩部分,首先,驅動程式把該幀拷貝到核心可訪問的輸入佇列,然後,核心再予以處理。在高流量負載下,中斷**會持續搶占正在處理的**。到某一時間點,輸入佇列會滿,而新的幀無法入隊(由於沒有空間),而舊的幀又無法被處理(由於一直被搶占)。結果系統就奔潰了。

驅動程式可以只關閉某個裝置的中斷事件,該裝置的輸入佇列中有一些幀,然後把輪詢驅動程式的佇列的任務交給乙個核心處理函式,不再是把所有中斷事件都關閉,之後令驅動程式為核心把幀排入佇列以便於處理。(napi)

定時器驅動的中斷事件:

驅動程式指示裝置裝置定期產生乙個中斷事件,不再是讓裝置以非同步方式通知驅動程式有關幀的接收。然後,處理函式會檢查自從上次中斷事件以來是否有任何幀到達,然後一次處理所有幀。最好是驅動程式有話要說時才定期產生中斷事件。

preempt_count被分成三個元件,每個位元組都是乙個計數器,各自針對一種需要非搶占功能的情況:硬體中斷,軟體中斷,以及一般非搶占情況。如下圖:

當呼叫schedule函式並通知該函式它已經被呼叫而搶占了當前任務之前,上圖中的preempt_count最高位元組的第二最低位會被設定。

cpu_is_offline:支援可熱拔插cpu的時候 判斷cpu是否已經被拔出了。(核心儲存乙個 cpu_online_mask,用於指出當前哪些cpu是活動的。)

98 #define

cpu_online(cpu)

cpumask_test_cpu((cpu), cpu_online_mask)

763 #define

cpu_is_offline(cpu)

unlikely(!cpu_online(cpu))

每個cpu都有乙個ksoftirqd執行緒。cpu_chain鏈讓各子系統知道乙個cpu何時起來執行或者何時死掉。

cpu_up_prepare:當cpu執行起來但還沒有就緒時,就會產生。

cpu_online:當cpu就緒時,就會產生。

cpu_up_cancelled:

cpu_dead:只有當核心編譯為支援可熱拔插cpu時,這兩條資訊才會產生。當先前的cpu_up_prepare通知資訊所觸發的任務之一失敗時,就會使用cpu_up_cancelled通知訊息。因此,cpu就無法上線了。當cpu死掉時,就會用到cpu_dead。

cpu_up_prepare會建立執行緒,並將此與關聯的cpu繫結,但是沒有喚醒該執行緒。cpu_online喚醒該執行緒。當cpu死掉時,其相關聯的ksoftirqd例項也會被殺掉。

《深入理解Linux網路技術內幕》閱讀筆記(五)

通過中斷,nic能夠告知其驅動程式幾種不同的事情,包括 1.接收一幀。2.傳輸失敗。3.dma傳輸已成功完成。給定乙個幀傳輸,當幀上載至nic的記憶體準備在此媒介上傳輸時,驅動程式就會將持有該幀的緩衝區釋放掉。使用同步傳輸時 無dma 當該幀已上傳至nic,驅動程式就會立刻知道。但使用dma時,也就...

《深入理解Linux網路技術內幕》閱讀筆記(六)

pci的優點之一是,其支援尋找irq和每個裝置所需的其他資源的探測方式相當優雅。模組可以在載入期間接收一些輸入引數,以告知該如何配置其所負責的所有裝置。但是,有些時候,特別是pci這類匯流排,讓驅動程式自行檢查系統上的裝置,然後為其負責的那些裝置做配置會比較簡單一點。必要時,可以退回到手動配置。探測...

《深入理解Linux網路技術內幕》閱讀筆記(十二)

這些分層通常稱為網路協議棧,因為通訊會往下傳播通過各個分層,直到實際上經過線路或無線頻道傳輸,然後再返回來。報頭也會以lifo的方式新增和刪除掉。每一層都有很多種協議可以用。在最底層的接 換資料,而所用的協議是預先決定的 協議的驅動程式被關聯至該介面 接收幀的時候,會傳送幀副本給網路嗅探器 如tcp...