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

通過中斷,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]指定的另一個腳本(代理程序)。
虛擬設備
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章