# 什么是固件?它和软件、硬件的关系

3 阅读7分钟

什么是固件?它和软件、硬件的关系

🔥 UEFI/BSP 开发系列第 005 篇 | 难度:⭐ 入门

作者:BSP 开发工程师

系列目标:300 篇由浅入深,构建完整的 UEFI 固件知识体系


写在前面

在前四篇里,我们反复提到"固件""BIOS""UEFI"这些词。但如果有人突然问你:

"固件到底是啥?它算软件还是硬件?"

你可能一时还真说不清楚。

今天我们就把这个概念彻底掰扯明白。


一、硬件、软件、固件的三国关系

先看一个最简单的分类:

+-----------------------------------------------------------+
|                     一台电脑的组成                          |
+-----------------------------------------------------------+
|                                                           |
|  硬件 (Hardware)          固件 (Firmware)         软件 (Software)
|  你摸得到的东西            烧在硬件里的代码         装在硬盘里的程序
|                                                           |
|  CPU、内存、硬盘           UEFI/BIOS              Windows、Chrome
|  显卡、网卡、主板           硬盘固件                Office、游戏
|  电源、散热器               网卡固件                驱动程序
|                            显卡 VBIOS                     |
|                            EC 固件                        |
|                            SSD 控制器固件                   |
+-----------------------------------------------------------+

一句话区分

  • 硬件:物理实体,不通电就是一块砖
  • 软件:装在存储设备上,操作系统跑起来之后才能运行
  • 固件烧在硬件芯片里的代码,硬件通电就开始跑,比操作系统更早执行

二、固件为什么叫"固"件?

英文 Firmware 这个词是 1967 年由 Ascher Opler 在一篇论文中首次使用的。

为什么叫 Firm(坚固的)?

因为它的"硬度"介于硬件和软件之间:

硬度排名:

硬件 Hardware    ████████████████  最硬 (物理改动才能变)
固件 Firmware    ████████████      中间 (可以刷新, 但通常不轻易改)
软件 Software    ████              最软 (随时安装卸载更新)
  • 硬件:你想改 CPU 的引脚数?做梦。
  • 固件:可以改,但需要专门的刷写工具,刷坏了可能变砖。
  • 软件:双击安装,不想要了就卸载。

固件就像纹身——写上去之后不是不能改,但改起来比换件衣服(软件)麻烦多了。


三、你身边到处都是固件

固件不只存在于电脑主板上。几乎每个带芯片的设备都有固件

设备固件干什么
主板UEFI/BIOS——初始化 CPU、内存、总线,启动操作系统
SSD / 硬盘控制器固件——管理闪存颗粒读写、磨损均衡、垃圾回收
显卡VBIOS / GOP ROM——初始化 GPU,点亮显示器
网卡NIC 固件——管理 MAC 地址、网络协议处理
键盘键盘固件——扫描按键矩阵,发送键值
鼠标鼠标固件——读取传感器,报告坐标
路由器OpenWrt / 厂商固件——实现路由、NAT、防火墙
智能手表RTOS 固件——管理传感器、显示、蓝牙
汽车ECU 固件——控制发动机、变速箱、ABS
电饭煲MCU 固件——控制加热曲线

你的电脑里至少有 5-10 个 独立的固件在同时运行:主板固件、EC 固件、SSD 固件、显卡固件、网卡固件、雷电控制器固件、音频 DSP 固件……

操作系统以为自己是老大,其实它是最后一个上班的。固件们早就把活干完了,才通知操作系统来"主持大局"。


四、固件存在哪里?

软件存在硬盘上,固件存在哪里?

固件存在非易失性存储芯片里——断电不丢数据的那种。常见的存储介质:

存储介质特点典型用途
SPI Flash (NOR)容量小(8-64MB),可直接执行主板 UEFI 固件
eMMC / UFS容量大,需要控制器手机固件、嵌入式设备
EEPROM容量极小(几KB),擦写次数有限EC 配置、MAC 地址存储
OTP ROM一次性写入,不可修改安全密钥、硬件 ID

主板上的 UEFI 固件一般存在一颗 SPI NOR Flash 芯片里。长这样:

主板上的 SPI Flash:

  +--------+
  | 8-pin  |   <-- 通常在主板的某个角落
  | SOIC-8 |       标注 Winbond / MXIC / GigaDevice 等
  | 芯片   |       容量: 16MB / 32MB / 64MB
  +--------+
      |
  连接到 PCH (Platform Controller Hub)
      |
  CPU 通过 PCH 访问 SPI Flash 中的固件代码

SPI NOR Flash 的特点:支持 XIP(Execute In Place,就地执行)——CPU 可以直接从 Flash 上读取并执行代码,不需要先把代码加载到内存里。这就是为什么在内存初始化之前,CPU 就能执行 UEFI 固件代码的原因。

还记得 003 篇讲的 Reset Vector (0xFFFFFFF0) 吗?那个地址对应的就是 SPI Flash 通过地址映射"投射"到 CPU 地址空间顶端的区域。


五、固件和驱动有什么区别?

这是一个非常经典的困惑:固件和驱动(Driver)有什么不同?

时间线:

通电 -----> UEFI固件运行 -----> OS启动 -----> OS驱动加载
              ^                                  ^
              |                                  |
          固件在这里                           驱动在这里
          (操作系统还没醒)                     (操作系统已经跑起来了)
对比固件 (Firmware)驱动 (Driver)
运行时机通电就跑操作系统启动后加载
运行环境裸机 / UEFI 环境操作系统内核
存储位置Flash 芯片硬盘(操作系统分区)
更新方式刷写固件(有变砖风险)Windows Update / 手动安装
目标硬件初始化硬件本身让操作系统使用硬件

举个例子——显卡的一生

  1. 显卡固件(VBIOS/GOP):电脑开机时,UEFI 固件加载显卡的 GOP 驱动,初始化 GPU,让屏幕亮起来——此时操作系统还没启动
  2. 显卡驱动(NVIDIA Driver):Windows 启动后,加载 NVIDIA 驱动,提供 3D 加速、多显示器管理、游戏优化等功能

固件是"叫你起床的闹钟",驱动是"帮你安排一天行程的秘书"。闹钟只需要响一下,秘书要跟你一整天。


六、BSP 工程师和固件的关系

作为 BSP(Board Support Package)开发工程师,你的核心工作就是让固件跑起来

具体来说:

BSP 工程师的日常:

芯片原厂 (Intel/AMD/Qualcomm)
  |
  | 提供: 参考设计 + FSP/固件包 + 文档
  v
BSP 工程师 (你)
  |
  | 工作内容:
  |   1. 拿到新板子 (硬件团队焊好的)
  |   2. 根据板子的硬件配置修改固件参数
  |   3. 编译固件,刷到 SPI Flash 上
  |   4. 开机,看串口日志
  |   5. 不亮?改参数、查信号、对时序
  |   6. 亮了?继续调外设:USB、NVMe、显示、网络
  |   7. 全部OK?交给系统团队装操作系统
  v
OEM 厂商 (联想/戴尔/华为...)
  |
  v
消费者 (用户)

BSP 工程师是第一个让板子活过来的人。硬件团队把板子焊好了,交给你——此时这块板子就是一块砖。你刷入固件、调试参数,让它能点亮屏幕、能进系统——板子才算"活了"。

硬件工程师是"接生婆",BSP 工程师是"儿科医生"——孩子生出来了(板子焊好了),但你得让它能呼吸、能吃奶(能启动、能运行)。


七、小白补课:刷固件是什么意思?

"刷固件"(Flash Firmware)就是把新的固件代码写入到 Flash 芯片中,替换掉旧的。

常见的刷固件方式:

方式操作风险
在线刷新在操作系统中运行刷写工具低(有回滚机制)
UEFI Shell 刷新在 UEFI Shell 环境下用工具刷
编程器刷写用硬件编程器直接连 Flash 芯片最安全(救砖用)
Capsule UpdateUEFI 标准的固件更新机制低(支持安全验证 + 回滚)

编程器刷写是终极救砖手段:

编程器刷写示意:

  编程器 (CH341A)
     |  SPI 信号线
     |  (CLK, MOSI, MISO, CS#)
     v
  +--------+
  | Flash  |  <-- 芯片可以焊在主板上(在线编程)
  | 芯片   |      或者取下来夹在编程器夹具上
  +--------+

  电脑上运行 flashrom 工具:
  $ flashrom -p ch341a_spi -w new_firmware.bin

BSP 工程师的工位上通常都有编程器和测试夹具——因为在调试早期,固件经常刷坏导致板子不开机,只能用编程器强制写入。


八、总结

概念一句话解释
硬件摸得到的物理实体
软件装在硬盘上,操作系统跑起来之后运行
固件烧在 Flash 芯片里,通电就跑,比 OS 更早执行
驱动操作系统里的程序,让 OS 能使用特定硬件
BSP让固件在特定板子上跑起来的工程

固件是让硬件"活过来"的灵魂代码。没有固件,再贵的硬件也只是一块好看的砖。


下一篇预告

006. UEFI规范到底规定了什么?五分钟读懂核心概念

UEFI Specification 这本 2000 多页的"天书",到底写了什么?我们用五分钟提炼它的核心。


📌 本系列共 300 篇,从入门到芯片原厂 BSP 能耗优化

👨‍💻 作者:在职 BSP 开发工程师,持续更新中

🏷️ 标签:固件、Firmware、SPI Flash、BSP、驱动、刷固件

📁 GitHub:UEFI-BSP-300