跳过正文
  1. 笔记/
  2. 系统底层/

固件、硬件、驱动程序与 Linux 内核

·1967 字·4 分钟· loading · loading · · ·
ICE345
作者
ICE345
CS Student | System | Linux | OCaml

这篇文章合并了原来的“固件 硬件 系统”和“固件 驱动程序”两个主题。先记住一条主线:

硬件
设备固件
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 firmwarenvmei915amdgpu、网卡和声卡驱动

/lib/firmware 在一些发行版中可能是指向 /usr/lib/firmware 的兼容路径。实际路径应以当前系统为准。

5. 一个 Wi-Fi 设备的例子
#

当 Linux 使用 Wi-Fi 网卡时,通常会经历类似过程:

  1. PCIe 或 USB 总线发现网卡;
  2. Linux 根据设备 ID 匹配网络驱动程序;
  3. 驱动程序请求对应的设备固件文件;
  4. 固件被加载到网卡内部的处理器或内存;
  5. 驱动程序配置队列、中断、信道和电源管理;
  6. NetworkManager、wpa_supplicant 等用户空间程序通过内核网络接口使用网卡。

这里不能简单说“固件直接控制硬件,驱动程序只是翻译命令”。真实设备可能把很多逻辑分布在硬件、设备固件、内核驱动和用户空间服务之间。

6. 它们在开机时如何协作
#

  1. 平台固件初始化

    BIOS / UEFI

    操作系统之前

    固件初始化 CPU、内存、总线和必要的启动设备,然后选择下一级启动程序。
  2. 启动程序加载内核

    GRUB

    bootloader 阶段

    GRUB 等启动程序加载 Linux 内核、initramfs 和内核命令行。它不负责替代 Linux 内核管理所有硬件。
  3. 内核发现和初始化设备

    driver

    内核阶段

    Linux 加载内置驱动或内核模块,枚举总线,创建设备节点,并在需要时把设备固件发送到硬件。
  4. 用户空间接管

    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 到内核

相关文章


评论