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

2021-07-05 11:01:08 字數 1740 閱讀 3436

通過中斷,nic能夠告知其驅動程式幾種不同的事情,包括:

1.接收一幀。

2.傳輸失敗。

3.dma傳輸已成功完成。給定乙個幀傳輸,當幀上載至nic的記憶體準備在此媒介上傳輸時,驅動程式就會將持有該幀的緩衝區釋放掉。使用同步傳輸時(無dma),當該幀已上傳至nic,驅動程式就會立刻知道。但使用dma時,也就是使用非同步傳輸,裝置驅動程式必須等待nic發出明確的中斷事件。

4.裝置有足夠記憶體處理新傳輸。該情況包括了一種巧妙的傳送節流方式,做的恰當的話,可以改善效率。在此系統中,裝置驅動程式會在佇列空間缺乏時關閉輸出,同時要求nic當可用記憶體大於給定量時(一般而言就是該裝置的mtu),就發出乙個中斷,然後當中斷到來時重啟傳輸。

驅動程式可以用netif_stop_queue停止裝置佇列,因此能禁止核心提交後續的傳輸請求。然後,驅動程式會檢查裝置的記憶體是否有足夠的空間容納乙個1536個位元組的包。如果有,驅動程式就會啟動佇列,允許核心再次提交傳輸請求;否則,就會指示裝置(通過乙個outw呼叫寫乙個配置暫存器),當條件滿足時,產生乙個中斷。中斷處理例程將使用netif_start_queue重啟裝置佇列,使核心能夠重新繼續傳輸。

中斷處理例程組織:

隨機數:

隨機數的產生是通過乙個輔助函式,核心藉此函式令其自身某些活動隨機化。例如,那些網路子系統通常會對定時器的延時加入乙個隨機元件,使得定時器不太可能同時執行,而且通過後台處理使得cpu的負載下降。隨機化也可防禦某些試圖猜出特定資料結構組織的而人所進行的dos(服務拒絕)攻擊。

與使用者空間互動:

1.當管理員使用ifconfig配置一張裝置驅動程式尚未載入的網絡卡,如裝置eth0時,則核心向/sbin/modprobe傳送乙個請求,以載入名稱為eth0的模組。如果/etc/prorobe.conf包含「alias eth0 3c59x」條目,則/sbin/modprobe會嘗試載入模組3c59x.ko。

2.當管理員以iproute2包的tc命令配置乙個裝置的流量控制時,可能會涉及不在核心內的佇列規則或分類器。這種情況下,核心向/sbin/modprobe傳送乙個請求,以載入相關的模組。

熱拔插:

當你編譯核心模組時,目標檔案預設在/lib/modules/kernel_version/目錄下,而kernel_version是指核心版本,如2.6.12.在同一目錄下,你可以發現兩個有趣的檔案:modules.pcimap和modules.usbmap。這些檔案分別包含核心所支援的裝置的pci id和usb id。此外,這些檔案還包含了相關聯的核心模組的引用。當使用者空間輔助程式接收到乙個可熱拔插裝置正插入的通知資訊時,就會使用這些檔案找出正確的裝置驅動程式。

核心會呼叫kobject_hotplug函式以響應乙個裝置的插入和刪除以及其它事件。kobject_hotplug會把arg[0]的初值設為/sbin/hotplug,把arg[1]設為要使用的**程式。/sbin/hotplug是乙個簡單指令碼,把事件的處理委託給arg[1]指定的另乙個指令碼(**程式)。

虛擬裝置

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

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

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

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

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

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