开发者生态
morning
将 ThinkPad X61 移植到 Coreboot
2026-06-09
1 阅读
walterbell
将 ThinkPad x61 移植到 coreboot 2026-06-04 11 分钟阅读(2292 字) coreboot thinkpad 固件逆向工程 llm 目录 介绍我对 IBM/Lenovo ThinkPad 的痴迷 10 多年前,我得到了我的第一台 ThinkPad x60。通过阅读 GNU Emacs 编辑器中的 about GNU 页面,我对自由软件产生了兴趣。无论是当时还是现在,自由软件都非常有用,通常没有太多闭源软件。缺乏免费软件的一个领域是固件,这让我想在 ThinkPad x60 上尝试 libreboot。几年后,我成为了 coreboot 贡献者,并最终在 9elements 找到了一份工作。在那次旅程中,我收集了相当多的 ThinkPad 收藏品。我想要速度更快的 64 位设备,所以我买了一台 ThinkPad x200,并运行了几年。几年后,我买了一台 ThinkPad x220,因为 Sandy Bridge 芯片比 x200 中的 Core 2 Duo 快得多。为了移植或改进现有的 coreboot 端口,我收到了 ThinkPad x201 和 R500。几年前,有人想出了一种方法来绕过 Intel Skylake/Kabylake 上的 Boot Guard ( deguard ),所以我给自己买了一台 ThinkPad t480,我对它非常满意。有谁知道有什么好的康复中心可以治疗这种成瘾吗?在 ThinkPad 囤积之旅中,缺少了一代产品:ThinkPad x61。它有一个 GM965 北桥和一个 ICH8 南桥。北桥有点类似于 GM45(ThinkPad x200 支持),除了仅支持 DDR2,ICH8 南桥有点类似于已经支持的 ICH9。该平台上没有泄露的文档,因此逆向工程将是唯一的方法。过去有人尝试过使用 SerialICE 等工具来执行此操作,该工具在 QEMU 中运行固件并将 IO 和 MMIO 转发到实际硬件,但他们没有设法生成可用的 coreboot 端口。所以我的梦想是最终移植它。人工智能辅助逆向工程 三月份,我在工作流程中尝试更多地使用 LLM 技术。对于快速原型化想法来说,它的效果相当好,但我想知道它在逆向工程中的表现如何。请注意,我使用的是 Anthropic 的 Claude Opus 4.6,这是当时最先进的。事实证明,它们是加速这一过程的一个很好的工具。通常逆向工程需要相当多的奉献精神。移植整个平台(x61 的 gm965/ich8)需要 3-6 个月的时间,这并不是不可能的。我肯定没有时间用于此目的。 TL;DR 我在下载的供应商 BIOS 上进行了尝试,结果看起来很棒。之后我购买了该设备并开始使用。下面解释一下整个过程。从供应商 BIOS 中传统转储信息 在尝试了解供应商固件的功能之前,我首先想从工作系统中转储尽可能多的信息。当某些东西没有按预期工作时,已知的良好值非常有价值:当 DRAM 无法训练或 USB 突然停止工作时,有一个参考进行比较非常有用。它还为平台的某些部分提供了很好的提示,例如 EC 设置、ACPI 表、PCI 配置、GPIO 引脚分配和 HDA 动词表。为此,我使用了常用的 coreboot 工具。 inteltool 很好地概述了 PCI 配置空间以及几乎所有北桥和南桥寄存器。 lspci 作为 Linux 如何看待机器的快速健全性检查仍然很有用。对于 ACPI,我使用 acpidump 转储表,使用 acpixtract 拆分它们,并使用 iasl -d 反编译它们。这提供了供应商固件如何向操作系统描述设备、电源管理和 EC 方法的可读视图。 ectool 对于查看 EC RAM 和行为很有用,因为 ThinkPad 往往会在那里隐藏许多主板特定的详细信息。我还保存了CPU信息和HDA编解码器信息,因为这些信息在盯着固件代码时很容易丢失。设置 AI 代理工具和一些固件发现 x61 使用 Phoenix BIOS,因此第一步是使用 bios_extract 将映像拆分为单独的模块。之后我给了人工智能代理一些它可以直接使用的工具。最有用的是 ghidra-cli 及其 SKILL.md ,因此它可以询问 Ghidra 问题,而无需我一直驱动 GUI。我还使用了radare2技能,因为radare2对于固件的旧16位实模式部分来说非常令人愉快。这种区别很重要,因为大多数固件都是 16 位实模式代码,但 raminit 本身是一个 PE32 模块,看起来来自英特尔 MRC(内存参考代码)。对于这一部分,ghidra-cli 工作得更好,因为原始代码可能是 C,并且反编译器输出实际上很有用。对于周围的粘合代码radare2来说,AI代理通常可以取得更好的成功。让我惊讶的一件事是在图像中发现了至少 3 个版本的 raminit。我的猜测是,这是某种具有只读恢复功能的 A/B 布局