coreboot 固件内部刷写实战:用 flashrom 的 internal 编程器在运行系统中更新固件

发布时间:2026/10/15 3:47:17
coreboot 固件内部刷写实战:用 flashrom 的 internal 编程器在运行系统中更新固件
固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载固件更新有内部刷写与外部刷写两条路线前者在系统运行时直接对板上 SPI 闪存芯片写入无需拆机后者则需让系统断电、接上外部编程器。本文以 coreboot 官方刷写教程中的内部刷写指南为主体系统讲解flashrom的internal编程器的使用前提、核心命令、写保护机制的原理结合 coreboot 源码中的BOOTMEDIA_LOCK_*与 Intel FLOCKDN/PRR 实现以及如何用 layout 文件与 IFD 只更新 BIOS 区域。读完本文你将掌握在 Linux 系统内安全地备份、校验并写入coreboot.rom的完整实战方案以及刷写失败后的兜底策略。WARNING原文档警示如果你刷入的固件是损坏的且没有任何恢复手段例如没有外部编程器、没有可用的恢复跳线那么你必须使用外部刷写方法重新写入一份可工作的固件。内部刷写是高风险操作务必先阅读并理解全部前提条件。内部刷写 vs 外部刷写何时用哪种方法根据 刷写固件教程索引 的定义内部方法internal更新操作发生在正在运行的系统上由系统自身的芯片组通过 SPI 控制器直接访问板上闪存芯片。外部方法external系统处于断电状态使用外部编程器其接口需与闪存芯片一致通常为 SPI直接写入闪存 IC。两者的关系通常不是二选一而是一个先后顺序由于出厂固件如厂商 UEFI往往带有写保护你通常需要先使用外部方法为机器安装一次改造过的 coreboot之后对 coreboot 的后续更新才能使用内部方法。原文档也明确指出内部刷写在许多平台上都可用只要它们没有被锁定详见 index.md。除 flashrom 的内部编程器外教程索引还列举了其他几种内部更新途径可一并了解厂商提供的专有固件更新软件在目标机器上运行UEFI 固件更新胶囊capsule。但用 flashrom 的internal编程器直接写入固件闪存芯片是 coreboot 生态中最通用、最透明的方式也是本文的核心。前提条件Linux、未被锁定、必要时加iomemrelaxed原文档 int_flashrom.md 给出了三条硬性前提仅限 Linux该内部刷写方法只在 Linux 下工作且前提是系统没有被锁定locked down。内核参数如果内核配置了CONFIG_IO_STRICT_DEVMEM你可能需要在启动命令行中加上iomemrelaxed。无保护机制存在多种保护方案会使得在运行系统中无法修改或替换固件内部刷写要求这些机制已被关闭或本身不存在。关于CONFIG_IO_STRICT_DEVMEM这是 Linux 内核的配置项它收紧了对/dev/mem映射 PCI 设备 MMIOBAR区域的访问。而 flashrom 的internal编程器需要访问芯片组的 SPI 控制器寄存器通常通过 PCI BAR 映射的 MMIO例如 Intel 平台的 SPIBAR因此当内核开启该严格检查后直接访问会被拒绝表现为 flashrom 报出访问错误。此时就需要在 GRUB 等引导器给内核追加iomemrelaxed参数来放宽限制。这一实战细节在仓库多块主板的文档中都有印证例如Gigabyte GA-G41M-ES2LIf access error appeared, then addiomemrelaxedto Linux kernel parameters and restart your Linux system.若出现访问错误就向 Linux 内核参数添加iomemrelaxed并重启系统并在刷写完成后建议移除该参数ASUS P8C WS内部刷写命令执行前内核应带iomemrelaxed启动ASUS A88XM-E、Supermicro X9SAE 等文档也有同样的建议。注意iomemrelaxed会放宽内核的内存访问限制存在一定安全影响建议仅在刷写期间临时使用完成后从内核命令行移除并重启。核心命令用 internal 编程器写入固件确认前提满足后原文档给出的核心命令只有一行flashrom -p internal -w coreboot.rom参数含义拆解-p internal选择internal编程器即由本机芯片组通过 SPI 控制器直接访问板上闪存芯片-w coreboot.rom将本地文件coreboot.rom写入闪存write 模式。coreboot.rom即你的 coreboot 构建产物build/coreboot.rom编译完成后可参考 构建系统文档 获得。刷写前先备份并校验内部刷写属于高风险操作仓库多份主板文档都强调先备份、后刷写、再校验。参考 Gigabyte GA-G41M-ES2L 的流程一份完整的内部刷写工作流至少包含# 1. 读出原固件并备份原文档建议备份文件存放在其他地方 # 以便 build 出的固件有问题时无需再从目标设备上提取备份 sudo flashrom -p internal -r backup.rom # 2. 校验备份与芯片内容一致 sudo flashrom -p internal -v backup.rom # 3. 写入新固件 sudo flashrom -p internal -w build/coreboot.rom # 4. 写后校验 sudo flashrom -p internal -v build/coreboot.rom-r读取read闪存内容到文件-v将文件与芯片内容逐字节比对verify-E整片擦除erase如上文 GA-G41M-ES2L 文档用于清空第二颗 BIOS 芯片仅在确有需要时使用。刷写完成后重启系统验证如sudo shutdown -r now。若一切正常再按前述建议移除iomemrelaxed。深入理解未被锁定coreboot 的启动介质保护机制原文档反复强调内部刷写只在系统未被锁定时可行。coreboot 本身提供了一整套**启动介质保护boot media protection**机制可以在启动早期将闪存区域锁定。理解这些选项你才能判断自己的 coreboot 构建是否允许内部刷写。配置集中在 src/security/lockdown/Kconfig核心选择如下配置项含义BOOTMEDIA_LOCK_NONE不锁定启动介质任何区域默认值即允许自由刷写BOOTMEDIA_LOCK_CONTROLLER由芯片组控制器锁定指定区域Intel 平台利用 SPIBAR 的 PRR——Protected Range RegistersBOOTMEDIA_LOCK_CHIP由闪存芯片自身锁定区域可在启动日志中搜索BM-LOCKDOWN确认生效选定了如何锁之后还要选择锁哪些区域BOOTMEDIA_LOCK_WHOLE_RO整个启动介质写保护。Kconfig 注释特别提醒若无条件触发 chipset lockdown你将再也无法通过内部控制器写入整颗闪存芯片BOOTMEDIA_LOCK_WHOLE_NO_ACCESS整个启动介质禁止读写仅内存映射部分仍可读BOOTMEDIA_LOCK_WPRO_VBOOT_RO仅写保护 vboot FMAP 中的WP_RO区域FW_MAIN_A/FW_MAIN_B等区域仍可由内部控制器写入——这是 Chromebook 类设备常见的更新方式BOOTMEDIA_LOCK_TOPSWAP写保护BOOTBLOCK与COREBOOTSlot A保留 Slot B 可写配合 Top Swap 实现可回滚的固件更新BOOTMEDIA_SMM_BWP仅允许在 SMM 中写闪存用于配合 SMMSTORE此时通过内部控制器的一切非授权写入都会被拒绝——这也会让 flashconsole 失效因为闪存变成只读BOOTMEDIA_SMM_BWP_RUNTIME_OPTION通过 option API 提供运行时开关bios_lock可在运行时决定是否启用 SMM BIOS 写保护。这些锁定的实际执行入口是 src/security/lockdown/lockdown.c 中的boot_device_security_lockdown()它会在 verstage/ramstage 的启动流程中被调用参见 src/security/vboot/vboot_logic.c。以 Intel 平台为例控制器锁定的底层实现可参考 src/soc/intel/common/block/fast_spi/fast_spi.c通过设置SPIBAR_HSFSTS_FLOCKDNFlash Lock-Down与SPIBAR_HSFSTS_PRR34_LOCKDNPRR3/PRR4 锁定位将闪存描述符区域与 PRR 定义的保护区一并写保护。这也是为什么许多 Intel 主板上默认只有 BIOS 区域可写其余区域IFD、ME、GBE被保护起来——这一点在 ASRock H110M-DVS 的文档中有明确描述。只刷 BIOS 区域layout 文件与 ifdtool在闪存芯片被其他组件Intel IFD、ME、GBE 等共享的平台上安装 coreboot并不需要更新这些区域。为降低风险教程索引 index.md 推荐使用layout 文件让 flashrom 只写bios区域保持 Intel ME 与 IFD 不变。先用 ifdtool位于 util/ifdtool从原固件备份中提取布局ifdtool -f rom.layout backup.rom生成的rom.layout内容类似00000000:00000fff fd 00500000:00bfffff bios 00003000:004fffff me 00001000:00002fff gbe每行格式为起始地址:结束地址 区域名分别对应 Intel 闪存描述符fd、BIOS 区域、管理引擎me与千兆网卡固件gbe。随后用-l指定布局、-i指定区域名flashrom 就只写入该区域flashrom -l rom.layout -i bios -w coreboot.rom -p programmer这里的programmer可以是internal内部刷写也可以是外部编程器如ch341a_spi命令形态一致。直接读取 IFD 自动确定布局flashrom 1.0 及之后版本支持直接从 IFDROM 的前 4 KiB中解析布局无需手工指定 layout 文件但需满足两个条件仅适用于 Intel ICH7 及之后的芯片组外部刷写时系统中只能有一颗闪存芯片。满足条件后命令简化为flashrom --ifd -i bios -w coreboot.rom -p programmer--ifd让 flashrom 自动读取 Intel 闪存描述符中的区域划分-i bios限定只写 BIOS 区域。这种方式在仓库大量主板文档中被使用例如 ASRock H370M-ITX/ac 的flashrom -p internal -N -w coreboot.rom --ifd -i bios以及 Acer TravelMate P633 系列 的--ifd -i bios --noverify-all用法。说明教程索引中还遗留了一个 TODO——详细解释 FMAP 区域、normal/fallback 机制与闪存锁机制。FMAP 是 coreboot 自己的分区布局由 fmap 工具生成与 Intel IFD 布局是两套体系BOOTMEDIA_LOCK_WPRO_VBOOT_RO等选项即依赖 vboot FMAP 中的WP_RO区域。刷写失败后的兜底外部刷写方法原文档开篇的警告值得再次强调如果你刷入了损坏的固件且没有恢复机制必须使用外部方法重新刷入可用固件。内部刷写依赖运行中的系统本身一旦固件损坏、系统无法启动内部方法自然失效。外部刷写需要拆开硬件、购买与闪存芯片接口一致通常为 SPI的编程器教程索引 index.md 列出了三种外部刷写方式分别有独立文档独立供电刷写编程器自身为闪存芯片供电外部直接供电刷写由外部电源直接给芯片供电不直接供电的外部刷写利用主板的电源电路供电。外部刷写硬件警告原文档方法选错或引脚接反可能永久损坏硬件切勿依赖闪存 IC 上画的圆点来判断引脚方向——那些圆点可能只是测试标记数据手册中指示 1 号引脚的是物理标记如钻孔或一侧更平整。此外教程索引给出的通用建议同样适用于内部刷写后的验证环节建议只刷写 BIOS 区域减少破坏 ME/IFD 等区域的风险始终验证固件镜像-v校验若外部刷写出现传输错误检查导线是否过短、降低时钟频率、检查供电、确保总线上没有其他主控EC、ME、SoC 等。小结内部刷写是 coreboot 更新固件最便捷的途径但它的可用性建立在三个前提之上Linux 系统、固件未被写保护机制锁定、必要时以iomemrelaxed放宽内核访问限制。核心操作可归纳为# 备份 校验 flashrom -p internal -r backup.rom flashrom -p internal -v backup.rom # 仅写 BIOS 区域layout 方式 / IFD 方式 flashrom -l rom.layout -i bios -w coreboot.rom -p internal flashrom --ifd -i bios -w coreboot.rom -p internal # 整片写入 校验 flashrom -p internal -w coreboot.rom flashrom -p internal -v coreboot.rom理解 coreboot 的BOOTMEDIA_LOCK_*保护机制源码见 src/security/lockdown/Kconfig 与 src/security/lockdown/lockdown.c以及 Intel 平台的 FLOCKDN/PRR 锁定src/soc/intel/common/block/fast_spi/fast_spi.c能帮你判断构建出的镜像是否支持内部刷写、哪些区域可写。若固件损坏且系统无法启动请立即转向外部刷写方法ext_standalone.md 等文档恢复。刷写有风险务必先备份、只刷必要区域、并在每次写入后完成校验。赞分享固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载相关推荐coreboot 固件刷写完全指南内部刷写与外部编程器刷写实战coreboot 固件刷写完全指南内部刷写与外部编程器刷写实战 本教程围绕 coreboot 固件的刷写flashing展开系统讲解 内部刷写 在运行固件嵌入式操作系统驱动开发coreboot 移植实战在 PC Engines APU2 上构建、配置与刷写固件coreboot 移植实战在 PC Engines APU2 上构建、配置与刷写固件 本文以 coreboot 源码仓库中 apu2 主板文档 https:/固件嵌入式操作系统驱动开发coreboot 在 Protectli Vault VP2420 上的移植支持与固件刷写实战指南coreboot 在 Protectli Vault VP2420 上的移植支持与固件刷写实战指南 本指南以 coreboot 官方文档 vp2420.md固件嵌入式操作系统驱动开发上一篇CANN ops-math 中 Trunc 算子 aclnnTrunc/aclnnInplaceTrunc 接口使用指南两段式 API 调用与源码实现解析下一篇CANN ops-nn 算子开发指南aclnnGatherV3 两段式接口使用与实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考