前言
面向嵌入式 Linux 的 WiFi 开发,最容易"卡住"的不是写代码,而是对系统分层与数据/控制路径缺少一张清晰地图。本篇从 Firmware/Driver 视角出发,给出一张可落地到实际调试的 Linux WiFi 架构图,并解释每个模块的职责与相互关系。
Linux Wi-Fi 软件架构图

可以这张图理解为一个"Wi‑Fi快递系统",把 Wi‑Fi 想成快递:你(应用)要寄包裹到互联网,不能直接扔出窗外,得走"下单→仓库分拣→司机出车→上高速→到站"的流程。这张图就是嵌入,Linux 里,Wi‑Fi 这套快递链路的分工表。
在控制面流程中(把 Wi‑Fi"连起来") :
wpa_supplicant/hostapd/iw → nl80211 → cfg80211 → mac80211 → Wi‑Fi 驱动 → 硬件/空口 →
AP完成扫描、认证/关联、WPA2/WPA3 握手、装密钥,最终变成"已连接"。
数据面流程中(让数据"跑起来") :
应用(Socket)→ Linux 网络协议栈(TCP/UDP/IP)→ net_device(wlan0)→ mac80211/驱动
→ 硬件/空口 → AP/网络连接后走 DHCP 拿 IP/网关/DNS,随后业务数据按这条路径收发。
接下来,我会使用一个表格介绍一下在Linux Wi-Fi里各个软件组件的功能和作用。
Linux Wi-Fi 软件组件
| Software Component | Description |
|---|---|
| wpa_supplicant | 作用 :Wi‑Fi 客户端(STA)侧的连接与安全"状态机"。 功能 :扫描与选网、认证/关联、WPA2/WPA3(含 4-way handshake/SAE)协商、密钥安装、漫游、断线重连策略。 交互对象 :主要通过 nl80211 与内核 cfg80211/mac80211/驱动交互;成功后再配合 DHCP 客户端获取 IP。 |
| hostapd | 作用 :设备作为热点(AP/SoftAP)时的"接入点控制程序"。 功能 :建 AP、发 Beacon、处理 STA 的认证/关联、WPA2/WPA3 安全协商与密钥下发、接入控制(ACL)、802.11 管理能力配置。 常见搭配 :通常还要配 DHCP/DNS(如 dnsmasq/udhcpd)和转发/NAT(iptables/nftables),否则"能连上热点但不一定能上网"。 |
| iw | 作用 :面向 nl80211/cfg80211 的现代 Wi‑Fi 配置与调试工具(推荐使用)。 功能 :查看 phy/接口能力、扫描、查看连接状态与链路质量、设置频段/信道/功率/模式、创建接口(如 monitor)、查看 station 信息等。 定位价值 :能快速判断"扫不扫得到、连没连上、信号/速率/重传怎么样"。 |
| iwpriv | 作用 :老式 Wireless Extensions (wext) 机制的"私有 ioctl"工具(偏历史/兼容)。 功能 :调用驱动自定义的私有命令(每家驱动都不一样),常用于旧驱动或厂商遗留接口的调试/配置。 注意 :可移植性差、命令不统一;新栈通常优先用 iw (nl80211)及驱动提供的标准接口。 |
| dhcp客户端 | 作用 :在 L2 连接成功后,为 wlan0 自动获取网络参数。 功能 :向 DHCP 服务器请求/续租 IP 地址、网关、DNS、租约时间 ,并写入系统网络配置(路由/DNS 等)。 典型现象 :Wi‑Fi 显示已连接但 ip addr 没地址或没默认路由,往往就是 DHCP 阶段失败或配置未生效。 |
| wext | 作用 :Linux 早期的 Wi‑Fi 用户态接口框架(基于 ioctl)。 功能 :提供一套旧接口让工具(如 iwconfig/iwpriv)对无线网卡进行配置与查询。 现状 :已基本被 nl80211/cfg80211 体系取代;多用于老驱动/遗留兼容。 |
| nl80211 | 作用 :用户空间到内核 Wi‑Fi 子系统的主要"控制通道"(netlink 家族)。 功能 :把用户态请求(扫描、关联、断开、设置密钥、设置功率/频段等)发送给内核;把内核事件(扫描结果、连接/断开原因等)回传给用户态。 典型使用者 :wpa_supplicant、hostapd、iw、NetworkManager 等。 |
| cfg80211 | 作用 :内核中的 802.11 配置与策略层(承上启下)。 功能 :接收 nl80211 的请求,做合法性/策略处理(尤其是监管域 regdom、信道/功率限制),并把操作分发给 mac80211 或具体驱动;同时汇聚并上报扫描/连接等事件。 定位价值 :国家码/监管域问题、信道不可用、扫描异常等经常与 cfg80211 相关。 |
| mac80211 | 作用 :Linux 的"软 MAC"框架(内核实现大量 MAC 层逻辑)。 功能 :在 SoftMAC 方案中负责 MAC 层核心机制(管理帧处理、速率控制、加密/重试/队列等的一部分逻辑)并与驱动协作;向上对接 cfg80211,向下对接驱动的 mac80211 ops。 备注 :并非所有芯片都走 mac80211(FullMAC 芯片很多 MAC 逻辑在固件里,路径会不同)。 |
| Linux网络协议栈 | 作用 :标准的 Linux 数据面网络栈(从 IP 到传输层到 socket)。 功能 :处理 IP/TCP/UDP、路由、邻居表(ARP/ND)、qdisc、netfilter(iptables/nftables)等;应用通过 socket 收发数据最终都会经过这里。 定位价值 :"Wi‑Fi 已连接但不能上网"常常是 DHCP/路由/DNS/防火墙等协议栈层面问题。 |
| Wi-Fi驱动 | 作用 :把 Wi‑Fi 硬件/固件接入 Linux 网络系统的内核模块。 功能 :负责总线通信(SDIO/USB/PCIe)、固件加载与控制、收发队列与中断处理、把数据包交给 mac80211 或直接交给网络栈、上报连接/断开/统计信息。 排障信号 :dmesg 里的固件下载失败、超时、reset、bus error、频繁 disconnect reason 等多与驱动/固件链路相关。 |
| net_device(wlan0) | 作用:把 Wi‑Fi 连接抽象成 Linux 的标准网络接口(wlan0),让上层 IP 网络栈和应用能像用普通网卡一样使用 Wi‑Fi。 功能:承接数据收发入口/出口(协议栈 ↔ 驱动),承载接口状态与配置(up/down、MTU、MAC、IP 地址/路由),并提供统计信息(RX/TX、丢包、错误等)。 |
Wi-Fi 硬件介绍
嵌入式里的 Wi‑Fi 硬件,就像"快递站点+运输车+喇叭天线"的组合:车把数据运到站点,站点按规则发车,天线把包裹"喊"到空气里。
|--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| HW Component | Description |
| Interface(SDIO/USB/PCIe) | 数据的运货通道: 作用:让 SoC 和 Wi‑Fi 模块交换数据与控制指令。 特点: SDIO 常见于小型 IoT,成本/功耗友好,但对走线/时序更敏感 USB 适配方便,插上就用,但延迟/功耗和稳定性看实现 PCIe 速度猛、吞吐高,常见于路由器/高性能设备,但设计复杂度更高 |
| SoC(ARM/MIPS/RISC‑V) | 数据的"总调度室" 作用:跑 Linux、跑应用、跑驱动;它决定你能玩多复杂的网络功能(比如多路并发、加密、NAT、日志抓取)。 嵌入式痛点:SoC 资源紧时,Wi‑Fi 可能"看着信号很好但跑不满速",因为 CPU 忙不过来或内存带宽不够。 |
| ANT(天线) | "扩音器+耳朵" 作用:把电信号变成空口电磁波,同时把空口信号收回来。 现实影响:同一颗芯片,天线/布局/地线/外壳一变,信号与吞吐可能从"起飞"变"摆烂"。 |
小结
Linux WiFi 之所以能跑起来,本质是几个人在接力干活:用户态的状(wpa_supplicant/hostapd)像"连网导演",决定扫谁、连谁、用什么加密;它不直接碰硬件,而是通过 nl80211 这条"热线电话"把指令送进内核。
内核这边,cfg80211 像"规则与调度中心",负责把用户态的请求按法规/信道/功率等规则审核并分发;mac80211 像"通用流水线",把很多 Wi‑Fi 通用逻辑标准化处理,然后交给具体厂商驱动去落地执行。
最后驱动/固件就是"司机+车队":负责总线通信(SDIO/USB/PCIe)、控制芯片、收发队列,把空口收来的数据送回 Linux 网络栈(wlan0),也把网络栈的包送去空口。任何一棒掉链子,你看到的现象就是:扫描不到、握手失败、频繁掉线,或者"已连接但不通"。