虛擬設備
虛擬設備是建立在一個或多個真實裝置之上的抽象,虛擬設備與真實裝置之間的對應關係可以是一對一、一對多、多對一的,有可能在其他虛擬設備之上建立虛擬設備。但並非所有組合都有意義,也並非所有組合都有核心支援。
虛擬設備的使用情形有如下幾種:
- 綁定(Bonding):一組真實裝置虛擬為一個虛擬設備,使其如同單一裝置來提高效能;
- 802.1Q:這是一種VLAN標準,用VLAN前序擴充802.3/Ethernet幀頭,建立VLAN;
- 橋接(Bridding):橋接介面就是橋接器的虛擬設備
- 別名介面(aliasing interface):允許一個真實Ethernet介面可以具有多個虛擬介面(eth0:0 eth0:1等),每個介面都有自己的IP配置。現在,網路代碼的改進,在同一個NIC裝置上配置多個IP地址已經不需要定義一個新的虛擬介面。
- 普通均衡器(true equalizer, TEQL):這是隊列規則,用於流量控制
- 隧道介面(tunnel interface):IP over IP隧道已經GRE(通用路由封裝)協議的實現基礎就是虛擬設備的建立
虛擬設備與核心網路通訊協定棧之間的互動
虛擬設備和真實裝置與核心的互動方式略有不同:
- 初始化:大多數虛擬設備如同真實裝置一樣,都會被指派一個net_device資料結構,但並非所有的虛擬設備都會被指派一個net_device執行個體,別名裝置只是作為相關聯的真實裝置上的簡單標籤來實現的
- 配置:大多數虛擬設備需要提供特殊的使用者空間工具來配置,尤其是只應用於虛擬設備的高層欄位,無法使用ifconfig等標準工具進行配置
- 外部介面:每個虛擬設備通常都會輸出一個檔案或包含一些檔案的目錄到/proc檔案系統內,與虛擬設備相關的檔案屬於額外檔案,不會替代與物理裝置相關的檔案,也就是說虛擬設備會產生自己的/proc檔案,但本身自己沒有net_device執行個體的別名裝置是個例外
- 傳輸:當虛擬設備與真實裝置不是一對一的關係時,用於傳輸的函數可能需要選擇所用的真實裝置以及其他任務,因為QoS是按照每個裝置的需要而應用的,虛擬設備和真實裝置之間有多重關係時,就意味著要配置流量控制
- 接收:虛擬設備都是軟體對象,不需要參與系統上真實資源的互動,如註冊IRQ處理以及分配I/O連接埠和I/O記憶體等。因此不同種類的虛擬設備在接收資料包時具有不同的行為
- 外部通知資訊:虛擬設備的邏輯是實現在真實裝置之上的,真實裝置對此邏輯毫無所知,因此無法將這些通知資訊傳過去。通知資訊就必須直接面對虛擬設備,如在綁定情形中,如果綁定裝置群組中的一個裝置宕機,則用於分配流量的演算法必須能夠發現這一情況,才能將後續流量避免分配給宕機裝置。與軟體實現觸發資訊不同的是硬體觸發的資訊如PCI電源管理,就無法直接到達虛擬設備,因為沒有和虛擬設備相關的硬體。
Proc檔案系統中相關與網路初始化的設定檔
/proc中的一些檔案會輸出內部資料結構和配置參數的值,用於記錄裝置驅動程式分配的資源和狀態。如lsmod命令就是將proc/modules檔案作為資訊來源輸出當前系統中載入的模組和依賴關係。
在/proc/net目錄下有裝置處理層初始化函數net_dev_init通過dev_proc_init和dev_mcast_init建立的檔案:
dev檔案:包含了註冊到核心中每個網路裝置有關接收和傳輸的一些統計資料:
dev_mcast檔案:顯示註冊到核心中每個網路裝置一些IP多播使用的參數值
wireless:類似於dev檔案,輸出每個無線裝置dev->get_wireless_stats的一些參數值。這些值只適用於無線裝置,因為無線裝置會分配一個資料結構來儲存這些統計資料
softnet_stat:輸出有關網路子系統使用的軟體中斷的統計資料
與系統初始化相關的函數
request_irq 分配IRQ線並註冊中斷處理常式回呼函數,可以註冊獨享或共用中斷線
free_irq 登出中斷處理常式回呼函數,若沒有裝置再使用此中斷線,則釋放這個中斷線資源
request_region 分配I/O連接埠及I/O記憶體
release_region 釋放I/O連接埠及I/O記憶體
call_usermodehelper 調用使用者空間輔助應用程式
module_param 模組配置參數
net_dev_init 在系統引導期間對一段網路代碼做初始化
全域變數
dev_boot_phase 布爾標識。以強制NIC裝置在驅動程式註冊前執行net_dev_init
資料結構
struct irq_action 每個IRQ線執行個體定義結構,包括一個回呼函數
net_device 描述一個網路裝置