使用树莓派刷写 Flash ROM

作者:Kyle Rankin

我之前写过一系列文章,讲述了我使用 Libreboot 刷写 ThinkPad X60 笔记本电脑的经历。在那之后,Libreboot 项目扩展了其硬件支持,包括 ThinkPad X200 系列,所以我决定升级。切换到 X200 的主要挑战在于,与 X60 不同,您无法使用软件执行初始 Libreboot 刷写。相反,您实际上需要拆卸笔记本电脑以露出 BIOS 芯片,将一个称为 Pomona 夹的特殊夹子夹在上面,该夹子连接到一些可以刷写芯片的设备,然后祈祷并刷写。

我通常不是硬件黑客,所以我没有任何通常用于正确完成此操作的专用硬件刷写工具。但是,我确实有一个树莓派(好吧,如果我说实话,有很多树莓派),事实证明,它和 Beaglebone Black 都是已成功与 flashrom 一起使用的平台。因此,在本文中,我将描述我执行的步骤,将常规的运行 Raspbian 的树莓派变成 BIOS 刷写机。

硬件

要硬件刷写 BIOS 芯片,您需要两个主要的硬件组件:一个树莓派和一个适用于您芯片的 Pomona 夹。Pomona 夹实际上是夹在芯片顶部的,并具有小齿,可与芯片的每个引脚建立连接。然后,您可以将夹子的另一端连接到您的硬件刷写设备,这样您就可以重新编程芯片而无需将其移除。就我而言,我的 BIOS 芯片有 16 个引脚(尽管有些 X200 使用 8 针 BIOS 芯片),所以我在线订购了一个 16 针 Pomona 夹,价格几乎与树莓派相同!

实际上,网上有一个非常好的指南,介绍了如何使用树莓派和 NOOBS 发行版刷写许多不同的 ThinkPad;如果您想了解更多详细信息,请参阅资源。不幸的是,当我第一次想这样做时,该指南尚不存在,因此我不得不拼凑出要做什么(特别是哪些 GPIO 引脚连接到夹子的哪些引脚),方法是将一篇关于在树莓派上使用 flashrom 的通用文章与一篇关于使用 Beaglebone Black 刷写 X200 的文章结合起来。因此,尽管我在本文末尾链接的指南更深入,并且看起来是正确的,但我无法直接保证它,因为我没有遵循它的步骤。我在此处列出的步骤对我来说是有效的。

Pomona 夹引脚

我在“资源”部分链接的指南中有一个很棒的图形,详细介绍了您可能需要用于各种芯片的各种引脚。并非夹子上的所有引脚都需要连接到 X200。就我而言,表 1 中显示了我的 16 针 Pomona 夹的简化形式。

表 1. Pomona 夹引脚
SPI 引脚名称 3.3V CS# S0/SIO1 GND S1/SIO0 SCLK
Pomona 夹引脚 # 2 7 8 10 15 16
树莓派 GPIO 引脚 # 1 (17*) 24 21 25 19 23

因此,当我接线时,我将 Pomona 夹的引脚 2 连接到 GPIO 引脚 17,但在其他指南中,他们使用 GPIO 引脚 1 作为 3.3V。我列出两者是因为引脚 17 对我来说有效(并且我认为任何 3.3V 电源都可能有效),但如果您想要备用引脚,它就在那里。

构建 Flashrom

构建 flashrom 有两种主要方法。如果您打算从源代码构建和刷写 Libreboot 镜像,则可以使用 Libreboot 源代码附带的 flashrom 版本。您也可以直接从其 git 存储库构建 flashrom。无论哪种方式,您首先都需要拉取所有构建依赖项


$ sudo apt-get install build-essential pciutils
 ↪usbutils libpci-dev libusb-dev libftdi1
 ↪libftdi-dev zlib1g-dev subversion

如果您想直接从其源代码构建 flashrom,请执行此操作


$ svn co svn://flashrom.org/flashrom/trunk flashrom
$ cd flashrom
$ make

否则,如果您想从 Libreboot 附带的 flashrom 源代码构建,请执行此操作


$ git clone http://libreboot.org/libreboot.git
$ cd libreboot
$ ./download flashrom
$ ./build module flashrom

无论哪种情况,在此过程结束时,您都应该有一个为树莓派编译的 flashrom 二进制文件,随时可以使用。

启用 SPI

下一步是加载两个 SPI 模块,以便您可以使用 GPIO 引脚进行刷写。就我而言,我使用的 Raspbian 镜像默认情况下未在启动时启用该设备,因此我必须以 root 身份编辑 /boot/config.txt 并确保该文件包含 dtparam=spi=on,然后重新启动。

重新启动后,我就可以加载两个 spi 模块


$ sudo modprobe spi_bcm2708
$ sudo modprobe spidev

现在模块已成功加载,我准备关闭树莓派并连接所有设备。

连接所有设备

为了连接所有设备,我打开了我的 X200(当然已拔下电源并取出电池),找到了 BIOS 芯片(它位于前腕托下方),并连接了夹子。如果您在树莓派仍然开启时连接夹子,请注意它会重新启动。最好在所有设备都关闭时进行所有连接。完成后,它看起来就像图 1 中看到的那样。

图 1. 笔记本电脑手术

然后我启动了树莓派,加载了两个 SPI 模块,并能够使用 flashrom 读出我现有 BIOS 的副本


sudo ./flashrom -p linux_spi:dev=/dev/spidev0.0
 ↪-r factory1.rom

现在,使用这些夹子刷写硬件的问题是,有时连接并不完美,我发现,在某些情况下,我必须多次执行刷写才能成功。在上述情况下,我建议一旦成功,您再执行几次,并保存几个不同的现有 BIOS 副本(至少三个),然后使用像 sha256sum 这样的工具来比较它们。您可能会发现您的一个或多个副本与其余副本不匹配。一旦您获得几个一致的副本,您就可以确信您获得了一个良好的副本。

在您拥有现有 BIOS 的良好备份副本后,您可以尝试刷写。事实证明,自从我上次写关于它的文章以来,Libreboot 刷写过程发生了相当大的变化,因此在未来的专栏中,我将使用更新的方法重新讨论刷写 Libreboot 的主题。

资源

使用树莓派进行硬件刷写: https://github.com/bibanon/Coreboot-ThinkPads/wiki/Hardware-Flashing-with-Raspberry-Pi

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的贡献者。Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论