天天看點

Linux網絡技術學習(六)—— 網絡裝置初始化(II)

文章目錄

    • 初始化選項
    • 子產品選項
    • 裝置處理層初始化:net_dev_init
    • 使用者空間輔助程式
    • kmod解析
    • 熱插拔
    • 虛拟裝置
    • 虛拟裝置範例
    • 通過/proc檔案系統調整

初始化選項

核心内建的元件以及子產品加載的元件都能輸入參數,使使用者調整元件所實作的功能、重寫預設值等

子產品選項(module_param系列的宏)

使用module_param宏可以在檔案系統中/sys檔案夾下生成變量選項,通過這些檔案在運作期間配置這些選項向核心提供這些配置選項。

引導期間核心選項(__setup系列的宏)

在引導加載程式引導期間可以提供這些定義選項。

子產品選項

核心子產品采用 宏的方式定義其參數。

// include/linux/moduleparam.h
#define module_param(name, type, perm)              \
    module_param_named(name, name, type, perm)
    
module_param(rtw_tx_bw_mode, uint, 0644);
           

第一個輸入參數是給使用者使用的參數名稱;第二參數類型(整形);第三個表示參數作為檔案輸出到/sys/時,分派給該檔案的權限

[email protected]-alip:/sys/module/wlan/parameters# ls -l rtw_tx_bw_mode
-rw-r--r-- 1 root root 4096 Feb 14 18:58 rtw_tx_bw_mode
           

每個子產品都在/sys/modules中分派一個目錄。子目錄/sys/module/對應子產品/parameters中的每個檔案就是該子產品所輸出的每個參數。元件程式員想讓使用者可以讀取參數的值,至少必須給予讀取權限。也可以提供寫權限,允許使用者可以修改參數的值。

/sys/中的檔案和檔案系統下的檔案權限使用方法相同,使用擁有者權限對其修改也是可以的。

裝置處理層初始化:net_dev_init

網絡代碼初始化的重要部分,包括流量控制和各個CPU入口隊列,這個函數定義在<net/core/dev.c>

static int __init net_dev_init(void)
{
}

subsys_initcall(net_dev_init);
           

subsys_initcall宏確定任何NIC裝置驅動程式自行注冊前net_dev_init會先執行

net_dev_init的主要部分:

1、由兩個網絡軟體中斷(softirq)所使用的對應各個CPU的資料結構被初始化。

open_softirq(NET_TX_SOFTIRQ, net_tx_action);
    open_softirq(NET_RX_SOFTIRQ, net_rx_action);
           

2、當核心被編譯為支援/proc檔案系統時,檔案會通過dev_proc_init添加到/proc

if (dev_proc_init())
        goto out;
           

3、協定處理例程向量ptype_base初始化,用于分離入口流量的多路合并傳輸。

使用者空間輔助程式

有些情況下,核心調用使用者空間應用程式以處理事件也是可以的。這又兩個重要的輔助程式:

/sbin/modprobe

  當核心需要加載子產品時就會被調用

/sbin/hotplug

  當核心偵測到一個新裝置已經插入或拔出系統時會被調用。主要工作是根據裝置辨別符加載正确的裝置驅動程式。

核心提供一個名為call_usrmodehelper的函數,以執行這類使用者空間輔助程式。

此函數允許調用者通過arg[ ] 傳遞給一些自變量,并通過env[ ] 傳遞一些環境變量給應用程式。

第一個自變量arg[0]通知call_usrmodehelper要啟用哪個使用者空間輔助程式,而arg[1]可以用于通知輔助程式該使用什麼配置腳本。

兩個核心函數request_moudle和kobject_hotplug如何調用call_usrmodehelper?以調用/sbin/modprobe和/sbin/hotplug。

kmod解析

kmod是核心子產品加載程式,允許核心元件請求加載一個子產品。核心提供的請求加載子產品的函數不止一個,這裡介紹request_moudle。

此函數用要加載的子產品名字初始化arg[1]。/sbin/modprobe使用配置檔案/etc/modprobe.conf去做各式各樣的事情,其中之一就是去了解從核心所接收的子產品名字實際上是否為其他子產品的别名。

Linux網絡技術學習(六)—— 網絡裝置初始化(II)

當管理者使用ifconfig配置一張裝置驅動程式尚未加載的網卡

如:裝置eth0,核心向/sbin/modprobe送出一個請求,以加載名稱為字元串“eth0”的子產品。如果/eth0/prorobe.conf(沒有這個檔案就是在/etc/modprobe.d檔案夾下面)包含“alias eth0 3c59x”字元,則/sbin/modprobe會嘗試加載子產品3c59x.ko

當管理者以IPROUTE2包的tc指令配置一個裝置的流量控制時,可能會涉及不在核心内的隊列規則或分類器。在這種情況下,核心将回向/sbin/modprobe發送一個請求,以加載相關子產品。

熱插拔

Linux核心引入熱插拔是為了實作消費者即插即用功能。這個功能讓核心去檢測可熱插拔裝置的插入或删除,然後通知應用層程式,給足夠細節,使其在必要時加載相關聯的驅動程式,或者當驅動存在時應用相關聯的配置。

熱插拔實際上也可在引導期間用于非可熱插拔裝置。無論一個裝置是熱插在運作中的系統上,或者在引導期間已插在系統上,使用者空間輔助程式都會收到這兩種情況的通知資訊。使用者空間應用程式再決定需要執行什麼動作。

Linux系統在引導期間執行一組腳本對接口裝置做初始化,包括網口裝置在内。這些裝置的配置會在/etc/rc.d/下的每個執行等級下都有一個目錄。

當你編譯核心子產品時,目标檔案預設放在/lib/modules/kernel_version/目錄下,而kernel_version為核心版本号(如:2.6.12)。在同一目錄下,有兩個檔案:

modules.pcimap和modules.usbmap : 核心所支援裝置的PCI ID和USB ID。還包含了相關聯的核心子產品引用(每個裝置ID都有)

當使用者空間輔助程式接收到一個可熱插拔裝置正在插入的通知資訊時,就會使用這些檔案找出正确的裝置驅動程式。

module.xxxmap檔案的填寫資料來自裝置驅動程式所提供的ID向量,Vortex驅動程式會對其pci_device_id執行個體做初始化。因為驅動程式是針對PCI裝置編寫的,是以該表的内容會加入到modules.pcimap

/sbin/hotplug

Hotplug預設的使用者空間輔助程式/sbin/hotplug,該腳本是Hotplug套件的一部分。

套件可以通過預設目錄/etc/hotplug/和/etc/hotplug.d/中的檔案進行配置。

核心會調用kobject_hotplug會把arg[0]的初值設為/sbin/hotplug,把arg[1]設為要使用的代理程式:/sbin/hotplug是一個簡單的腳本,把事件的處理委托給arg[1]指定的另一個腳本。

當一塊NIC添加到系統或從系統删除時,kobject_hotplug會把arg[1]的初值設為net,使得/sbin/hotplug去執行net.agent代理程式。(net.agent并不代表一種媒體或總線類型)雖然net代理程式可用于配置裝置,但其他代理程式可根據裝置辨別符而加載正确的子產品。裝置辨別符是由核心通過INTERFACE環境變量傳入的。

虛拟裝置

虛拟裝置是建立在一個或多個真是裝置之上的抽象。虛拟裝置和真實裝置之間的關聯可以是多對多。

Linux網絡技術學習(六)—— 網絡裝置初始化(II)

虛拟裝置範例

Linux允許你定義多種不同的虛拟裝置

綁定(bonding)

  利用這個功能,虛拟裝置可以綁定一組實體裝置

802.1Q

  這是一種IEEE标準,VLAN的報頭擴充802.3/Ethernet幀頭。

橋接

  橋接接口就是網橋的虛拟代表

别名接口

  原本這項功能的主要目的是允許單一真實的Ethernet接口橫跨幾個虛拟接口(eth0:0,eth0:1等等),每個接口都有自己的IP配置。

現在,由于網絡代碼的改進,在同一個NIC上配置多個IP位址已經不需要定義一個新的虛拟接口。然而有些情況下(特别是路由),讓同一個NIC具有不同的虛拟NIC會輕松點。

普通均衡器

  這是隊列規則,用于流量控制。、

接收

  因為虛拟裝置都是軟體對象,不需要與系統上真實資源的互動,如注冊IRQ處理例程或者配置設定I/O端口以及I/O記憶體。其流量是間接擷取的,來自執行這些任務的實體裝置。不同類型的虛拟裝置在封包接收時各有不同的行為。

外部通知資訊

  核心中發生其他核心元件 對特定事件發出通知資訊,對虛拟裝置而言,就如同真實裝置一樣,有其利益所在。因為虛拟裝置的邏輯是實作在真實裝置之上的。真實裝置對此邏輯毫無所知,是以無法把這些通知資訊傳出去。

通過/proc檔案系統調整

/proc中的一些檔案會輸出内部資料結構和配置參數的值,有助于記錄裝置驅動程式配置設定了哪些資源。

在/proc/net中,可以找到由net_dev_init通過dev_proc_init和dev_mcast_init所建立的檔案。

Linux網絡技術學習(六)—— 網絡裝置初始化(II)

dev

  對每個已注冊至核心的網絡裝置而言,會顯示一些有關接收和傳輸的統計資料。(已接收或已傳輸的位元組數、封包數目等)

dev_mcast

  對每個已注冊至核心的網絡裝置而言,會顯示一些由IP多點傳播所使用的參數值。

wireless

  對每個無線裝置而言,會列印出來自dev->get_wireless_stats虛拟函數所傳回的無線區塊中的一些參數值。(隻包含無線裝置)

softnet_stat

  輸出有關由網絡代碼所用的軟體中斷的統計資料。

繼續閱讀