这篇文章合并了原来的“固件 硬件 系统”和“固件 驱动程序”两个主题。先记住一条主线:
硬件
↕
设备固件
↕
Linux 内核驱动程序
↕
内核子系统和系统调用
↕
用户空间程序这里的箭头不是说每一层都直接互相调用,而是表示它们在完整的设备控制链中承担不同职责。
1. 硬件是什么#
硬件是实际执行计算、存储和输入输出的物理设备,例如:
- CPU、内存和主板芯片组;
- NVMe SSD、SATA 磁盘和 USB 设备;
- GPU、显示器、声卡;
- 有线网卡、Wi-Fi 网卡和蓝牙设备。
硬件通常不会直接理解“打开文件”“发送网络请求”这样的高级操作。它暴露的是寄存器、队列、中断、DMA、总线协议等低级接口,需要固件和驱动程序配合使用。
2. 固件是什么#
固件(firmware)是运行在硬件或平台特定环境中的低级软件。它不一定只有一种形式,至少可以分成两类。
2.1 平台固件#
平台固件负责在操作系统启动前初始化机器并提供启动环境,例如:
- Legacy BIOS;
- UEFI;
- ACPI 表和平台配置数据;
- CPU microcode 的更新机制。
它们通常存储在主板、CPU 或相关芯片的非易失性存储器中。UEFI 还可以读取 ESP 中的 EFI 程序并执行启动选择逻辑。
2.2 设备固件#
设备固件通常运行在设备自己的微控制器或处理器上,例如:
- 网卡固件负责低级数据包处理;
- GPU 固件负责设备初始化和部分微控制器功能;
- SSD 固件负责闪存管理、磨损均衡、垃圾回收和错误处理;
- 摄像头、声卡和 USB 设备也可能包含自己的固件。
有些固件一直保存在设备内部;另一些固件会在设备初始化时由 Linux 驱动程序从文件系统加载到设备中。
3. 驱动程序是什么#
驱动程序(driver)是操作系统用来控制特定硬件的软件。Linux 驱动程序通常运行在内核空间,或者以内核模块形式动态加载。
驱动程序主要负责:
- 识别设备并绑定到对应的总线或设备驱动;
- 读写设备寄存器和管理 DMA;
- 处理中断、设备队列和错误状态;
- 向内核子系统提供统一接口,例如网络、块设备、USB、音频和 DRM;
- 在设备需要时请求并加载设备固件。
用户空间程序通常不直接操作硬件寄存器,而是通过系统调用、设备文件、网络接口或图形接口请求内核完成工作。
4. 固件和驱动程序的区别#
| 对比项 | 固件 | 驱动程序 |
|---|---|---|
| 主要运行位置 | 平台固件、设备内部处理器,或被加载到设备中 | Linux 内核空间,部分辅助程序在用户空间 |
| 主要职责 | 初始化或执行设备内部的低级逻辑 | 让内核能够识别、配置和使用设备 |
| 是否依赖 Linux | 平台固件通常不依赖 Linux;设备固件由设备执行 | 通常依赖操作系统和内核接口 |
| 常见存放位置 | 主板/设备闪存,或 /lib/firmware、/usr/lib/firmware | /lib/modules/$(uname -r)/ 或 /usr/lib/modules/ |
| 典型例子 | UEFI、VBIOS、Wi-Fi firmware、SSD firmware | nvme、i915、amdgpu、网卡和声卡驱动 |
/lib/firmware 在一些发行版中可能是指向 /usr/lib/firmware 的兼容路径。实际路径应以当前系统为准。
5. 一个 Wi-Fi 设备的例子#
当 Linux 使用 Wi-Fi 网卡时,通常会经历类似过程:
- PCIe 或 USB 总线发现网卡;
- Linux 根据设备 ID 匹配网络驱动程序;
- 驱动程序请求对应的设备固件文件;
- 固件被加载到网卡内部的处理器或内存;
- 驱动程序配置队列、中断、信道和电源管理;
- NetworkManager、
wpa_supplicant等用户空间程序通过内核网络接口使用网卡。
这里不能简单说“固件直接控制硬件,驱动程序只是翻译命令”。真实设备可能把很多逻辑分布在硬件、设备固件、内核驱动和用户空间服务之间。
6. 它们在开机时如何协作#
平台固件初始化
BIOS / UEFI
操作系统之前
固件初始化 CPU、内存、总线和必要的启动设备,然后选择下一级启动程序。启动程序加载内核
GRUB
bootloader 阶段
GRUB 等启动程序加载 Linux 内核、initramfs 和内核命令行。它不负责替代 Linux 内核管理所有硬件。内核发现和初始化设备
driver
内核阶段
Linux 加载内置驱动或内核模块,枚举总线,创建设备节点,并在需要时把设备固件发送到硬件。用户空间接管
PID 1
systemd 或其他 init
PID 1 启动 udev、网络服务、登录界面和其他用户空间程序;这些程序通过内核提供的接口使用硬件。
7. /sys/firmware 能说明什么#
/sys 是 sysfs 虚拟文件系统,主要由内核导出设备、总线和子系统状态。它不是固件文件存放目录。
常见目录包括:
/sys/firmware/efi # 当前内核以 UEFI 模式启动时通常存在
/sys/firmware/acpi # ACPI 表和相关接口
/sys/firmware/dmi # DMI/SMBIOS 相关信息,具体路径依发行版和内核而定可以这样检查:
test -d /sys/firmware/efi && echo UEFI || echo "Legacy BIOS"
find /sys/firmware -maxdepth 2 -type d 2>/dev/null
ls /usr/lib/firmware /lib/firmware 2>/dev/null
lsmod/sys/firmware/efi 的存在可以作为判断当前启动模式的实用线索,但它不是判断一台机器是否支持 UEFI 的唯一方法。
8. 常见误解#
- 固件和驱动程序不是同一个东西。
/sys/firmware是内核导出的接口,不是固件文件仓库。- 并非所有固件都在
/lib/firmware;很多平台和设备固件保存在硬件内部。 - 驱动程序不只是“把高级命令翻译成低级命令”,还负责资源管理、中断、DMA、权限边界和内核子系统接口。
- UEFI、设备固件和 Linux 驱动程序可能在不同阶段、不同处理器或不同内存空间中运行。
如果要继续理解它们与启动链的关系,可以阅读Linux 启动流程:从固件、分区与 GRUB 到内核。


