Claude Code 被用于重写老旧内核驱动程序,实战展示了 AI 在系统级代码迁移中的强劲能力和产业价值。
作为背景信息,我的爱好之一是帮助人们从旧磁带盒中恢复数据,比如 QIC-80 磁带。这是 1990 年代一种相当流行的备份介质,在个人、小企业、BBS 运营者等中间被广泛使用。我对磁带介质有特殊的好感;握着这些磁带在手中有一种触觉上的快感,使整个过程充满喜悦,尽管 QIC 磁带因众多设计缺陷而名声不佳。经过仔细的检查和翻新,这些磁带上的数据完全可以恢复,即使经历了这么多年。
每当我收到一盘 QIC-80 磁带用于数据恢复时,我会启动其中一台较老的 PC 工作站,它配有相应的磁带驱动器,然后启动一个非常旧的 Linux 版本(即 CentOS 3.5),因为这是使用 ftape 驱动的唯一方式。ftape 是一个内核驱动,它能够与磁带驱动通信,允许用户导出磁带的二进制内容。
你看,读取这些磁带的驱动器连接到主板上的软盘控制器。这是一个聪明的成本节约之举:你无需购买单独的 SCSI 适配器(高端磁带介质的标准接口),只需将此磁带驱动器连接到主板上已有的软盘控制器即可。它甚至可以与现有的软盘驱动器共存,使用同一根带状电缆!代价当然是数据速率受到软盘控制器速度的限制,大约是 500 Kbps(这是千比特,不是字节)。
另一个缺点是通过软盘控制器与这些磁带驱动通信的协议非常混乱、非标准化且支持度很低。它在每个意义上都是一种"hack":你主板的 BIOS 根本不知道磁带驱动器已连接,完全取决于最终用户的软件来确切地了解如何操纵硬件 I/O 端口、时序、中断等,从而"欺骗"软盘控制器向磁带驱动器发送适当的命令。
只有少数针对 MS-DOS 和 Windows 3.x/9x 的专有工具可用,而对于 Linux,也只有一个开源实现,即 ftape。当然,可以使用那些原始的 DOS/Windows 工具来读取磁带,但只有 ftape 才能让我们读取磁带的"原始"二进制内容,无论最初是哪个专有软件写入的,这就是为什么我更喜欢用它来转储内容,然后再担心解码专有逻辑格式并从中提取文件。
问题是,ftape 驱动从大约 2000 年开始就不再被支持了,并很快从 Linux 内核中被移除。这就是为什么每当我需要使用其中一个驱动时,都必须运行一个痛苦的旧 Linux 版本。如果 ftape 能在现代发行版上工作就太好了,这样我就能获得现代发行版提供的所有好处。
所以大约两周前,我想到向 Claude Code 做一个简单的请求:
> This repository is a Linux kernel driver that communicates with legacy tape drives connected to the floppy
controller (FDC) on the motherboard. Unfortunately, this driver hasn't been maintained for a long time, and
can only compile under kernel version 2.4. I'd like to modernize this driver, allowing it to be built with
the latest versions of the kernel.
● I'll help you modernize this Linux kernel driver for legacy tape drives. This is a significant task that
will require updating the code to work with modern kernel APIs and conventions.
经过数次"调整"和 Claude 声称要做的任何事情之后,我突然拥有了一个可以无错编译的内核驱动。这是因为 Claude 能够接收编译器输出并将其反馈给自己,直到编译成功。在内核版本 2.4 和版本 6.8 之间流逝的漫长岁月里,有一大堆可以理解的已废弃或被替换的内核函数和结构。令人惊奇的是,Claude 找到了所有过时的部分,并用正确的现代等价物替换它们,只需对代码进行少量手动修改(稍后会详细说明)。
然而,此时内核驱动仍然预期作为完整内核树的一部分被编译,而我只是想让它成为一个独立的可加载内核模块。好吧,没问题:
> Is there a way to compile just this module in-place, instead of copying it into a kernel source tree?
● Yes! You can compile kernel modules out-of-tree without copying them into the kernel source. Let me create
a proper standalone build system for the ftape driver.
……它做到了。无需任何进一步的提示。在这个阶段的结束,我有了一个可加载的内核模块(.ko),我可以开始尝试用实际的实时硬件来使用它。不出所料,该模块尚未"工作"——它能够加载,但有些东西阻止它与磁带驱动正确通信。但我继续进行。
从这一点开始,由于加载/卸载内核模块需要 sudo,我再也不能让 Claude 自动"迭代"这样的敏感操作。幸运的是,ftape 驱动已经慷慨地遍布日志消息(printk() 调用被打印到 dmesg),所以我自己加载了该模块,迭代性地将 dmesg 的输出粘贴到 Claude 中,让 Claude 将其与我之前从成功的磁带读取中保存的"已知良好"dmesg 日志进行比较。经过几次迭代后,Claude 确定了阻止该模块与硬件通信的剩余问题。
● Perfect! The module has parameters that can be set. The issue is that without configuration, all the base
addresses default to -1, which gets converted to 0xffff in the config function, causing the detection to fail.
● The "No such device or address" (ENXIO) error occurs because the ftape-internal module is not configured
with the correct I/O port base address for your floppy controller.
The issue is in fdc-internal.c:735-737: if fdc->sra == 0xffff, it returns -ENXIO. Since no configuration was
provided, all values default to -1, which becomes 0xffff....
最后,我有了一个内核模块,它能够 a) 加载,b) 检测磁带驱动,c) 转储测试磁带的内容!
在现代内核上使用 ftape 驱动,这是一个我曾认为完全无法达到的壮举,突然在两个晚上的时间里完成了。
作为一个巨大的警告,我应该指出我有一点之前使用内核模块的经验,以及大量的 C 语言经验,所以我不想在这个场景中过分吹捧 Claude 的成功。也就是说,这不是字面上的三个提示就能让 Claude 生成一个工作中的内核模块,而是相当多的来回对话和若干的代码手动修复。没有对内核模块内部结构的基础知识,绝对不可能执行这种现代化。
这让我想到要总结一些关于在当今时刻与这类代码 agent 合作的想法:
与 Claude Code 的交互感觉像是与一位工程师同事的实际协作。人们喜欢将其比作与一位"初级"工程师合作,我认为这大致是准确的:它会执行你告诉它的任何事情,它渴望取悦,它过度自信,当你指出它犯的错误时它急于道歉并称赞你"绝对正确",诸如此类。正因为如此,你(人类)仍然是那个必须提供护栏、做出产品决策、强制执行架构准则并尽可能早地发现潜在问题的人。
我并不声称突然成为 prompt 工程方面的专家,但我发现最成功的 prompt 是那些清晰地为一个功能铺垫了口头支架,然后描述了 LLM 应该填补的支架空隙的那些。(出于某种原因,脑海中浮现的画面是那些生物干细胞支架之一,人造的人类耳朵会在其上生长。)
这些 agent 并不是魔法,不能字面上做你要求它们做的一切。如果你要求它做某件它不太适合的事情,你会感到沮丧,并在让这些工具发光之前过早地拒绝它们。在这一点上,学习 LLM 实际如何工作是有用的,这样你就能对它们的优点和缺点有所了解。
我肯定,如果我真的想做的话,我可以自己完成这个现代化工作。但这需要我学习 25 年前所做的内核开发。这可能会花我数周的时间来反复查阅今天完全无用的文档。我没有做那些,而是花了几天时间与一个 agent 交谈,让它向我解释它所做的所有事情。
当然,我验证和测试了它所做的更改,在这个过程中,我最终学到了大量真正对我未来有用的东西,比如现代内核约定、x86 架构的一些有趣细节,以及几个我会保留在我的工具库中的命令行技巧。
我绝不是内核开发者,但这个特定的经历点燃了一个火花,可能会导致更多的内核级别工作,事实证明内核开发并不像听起来那样困难。在另一个不相关的"vibe-coding"会话中,我构建了一个 Flutter 应用,之前没有使用过 Flutter。如果你像我一样,你的学习风格是通过做来学习,这些工具可以从根本上加快你学习新框架的步伐,让你可以进行更多的高级架构思考。
无论如何,绕过整个圆圈回到起点,我现在很高兴地说 ftape 还活着!在其最后一次正式发布二十五年后,它再次可以在现代 Linux 上构建和使用。我仍在进行一些进一步的调整和新功能添加的过程中,但我已经验证了它与我收藏中的基于软盘的磁带驱动以及它也支持的基于并行端口的驱动一起工作。
物理设置看起来非常相似,但现在操作系统是 Xubuntu 24.04,而不是 CentOS 3.5!🎉 直到下次!