基礎流程
-
wifi驅動加載(insmod或者modprobe)
-
設備驅動匹配探測(我們常見的probe函數)
整體流程
驅動加載 → 注冊支持設備 → 設備插入 → 匹配驅動 → 初始化硬件 → 創建網絡接口
明確兩點
兩個流程
- 驅動加載:指將編譯好的驅動程序模塊加載到內核中,使其能夠被系統識別和使用。
- 設備探測匹配:指當設備插入時,內核如何識別該設備并綁定正確的驅動程序
兩個流程的關系
- 驅動加載是前提,只有驅動被加載到內核,才能進行后續的設備識別和綁定。
- 設備探測匹配是驅動加載后的自動過程,當設備連接到系統時,內核通過設備信息(如USB的廠商ID和產品ID)查找已注冊的驅動,進行匹配。
所以
驅動加載不正確,設備根本無法被識別,設備探測匹配失敗,即使驅動存在,設備也無法正常工作
硬件
- 基于tplink wn722n v1網卡
詳細框架流程
- 無線驅動注冊:內核調用 ath9k_htc_init,使用usb_register 注冊將wifi驅動到 USB 子系統
- 設備探測:匹配設備 ID 后,調用 probe 分配資源、加載固件。
- mac80211 注冊:通過 ieee80211_alloc_hw 和 ieee80211_register_hw 注冊無線設備。
- 網絡接口創建:由 mac80211 生成 wlan 接口,用戶可配置連接。
流程解析
- 模塊初始化
當執行 sudo modprobe ath9k_htc 或系統自動加載驅動時,內核調用 ath9k_htc_init
- 驅動注冊:它定義了 ath9k_hif_usb 驅動的核心結構體 usb_driver,并通過 usb_register 將驅動注冊到內核
驅動加載內核日志:
支持ID的列表說明:
USB驅動探測函數ath9k_hif_usb_probe的實現。當USB設備插入并匹配到驅動時,內核會調用這個函數來初始化設備 - 驅動探測函數(當 USB 設備插入時,內核調用此函數進行設備探測,負責設備的初始化和固件加載)
- 固件加載
- 固件加載完成后的回調函數負責繼續設備的初始化流程
初始化 USB 設備函數 - 初始化硬件(調用到關鍵函數)
- ath9k_htc_probe_device 負責完成設備的探測和初始化
mac80211為所指向的驅動程序分配一個私有數據區域
初始化無線設備,包括硬件配置、固件版本檢查、注冊表初始化、收發隊列初始化,并最終注冊到 mac80211 子系統,創建網絡接口
續上圖
一個圖總結整個流程
ath9k_htc_init(void) //驅動初始化→ ath9k_hif_usb_init(void) //驅動注冊→ ath9k_hif_usb_probe() //設備探測→ ath9k_hif_request_firmware() //請求加載固件→ ath9k_hif_usb_firmware_cb() //固件加載完成后的回調→ ath9k_htc_hw_alloc //為設備分配硬件資源(如內存、DMA 緩沖區)。→ ath9k_hif_usb_dev_init() //初始化 USB 設備(將固件數據通過 USB 傳輸到設備,為 USB 數據傳輸分配URB)→ ath9k_htc_hw_init() //初始化硬件(總函數)→ ath9k_htc_probe_device() //負責探測并初始化硬件設備,完成了從分配硬件資源到注冊網絡接口的完整流程(上一個函數調用)→ ieee80211_alloc_hw(&ath9k_htc_ops) //內核函數,分配無線硬件描述符,ath9k_htc_ops:無線硬件的操作函數集,用于管理無線硬件的操作和狀態→ ath9k_init_device() //初始化無線設備硬件(如配置寄存器、啟動固件),并注冊到 mac80211 子系統→ ath9k_set_hw_capab() //設置硬件的功能集(如支持的頻段、接口類型等),設置mac地址→ ath9k_tx_init(priv); //初始化隊列(Queue)用于管理數據包的發送→ ieee80211_register_hw(hw) //將設備注冊到 mac80211 子系統,創建網絡接口(如 wlan0)→ release_firmware(); //釋放固件并標記設備就緒
疑問:
- wifi mac是wifi探測設備的必經流程,那mac地址是在哪獲取和設置的呢?
將設備從EEPROM中讀取的真實MAC地址(common->macaddr)設置為網絡接口的永久硬件地址
通過ath9k_hw_common訪問到macaddr字段
設置mac地址
- 當無線網卡設備成功被驅動探測并初始化后,內核會通過哪種方式在文件系統中顯示設備信息?
我們這里句幾個除了工具不常用到的例子,都能說明設備正常被加載
設備通用信息:/sys/bus/usb/devices/1-1
或者:/sys/class/net
這里的常用信息
設備的加載驅動和子系統信息:
還有就是無線物理層PHY參數
或者/proc/net/dev
基礎概念加深
- 驅動匹配機制
匹配過程:
1)內核遍歷所有已注冊的 USB 驅動(通過 usb_register_driver)。
2)對比設備的 (VID, PID) 與驅動 id_table 中的條目。
3)若匹配成功,調用驅動的 probe() 函數(即 ath9k_htc_probe)。 - 無線子系統(mac80211)
1)mac80211 是 Linux 內核中用于實現無線wifi協議棧的核心框架,它為無線網卡驅動提供了統一的軟件接口,簡化了無線設備驅動的開發。
2)它是現代 Linux 無線驅動的基石,支持多種無線模式(如 AP、STA、Monitor 等)和復雜的 Wi-Fi 功能(如加密、掃描、速率控制等)。
mac80211 的定位與作用
- 功能定位
1)硬件抽象層:將底層無線硬件的操作抽象為統一的 API,驅動開發者只需實現這些接口,無需關心復雜的 802.11 協議邏輯。
2)協議實現:處理 802.11 協議的核心功能,如幀的封裝/解析、認證、關聯、掃描、加密(WEP/WPA/WPA2/WPA3)等。
3)多模式支持:支持多種無線模式(Access Point, Station, Monitor, Mesh, Ad-Hoc ) - 與其他子系統的關系
1)cfg80211:mac80211 的配置層,提供用戶空間工具(如 iw、hostapd)通過 nl80211(基于 Netlink)配置無線接口的接口。
2)硬件驅動:驅動通過實現 mac80211 的回調函數(如發送/接收數據、設置頻道等)與物理設備交互。
3)用戶空間工具:如 iw、wpa_supplicant,通過 cfg80211 控制無線網絡行為。