夜雨聆风学习资料网

ARTICLE · 959985

AI疯狂劝退“这题无解建议放弃”!Linus硬刚18次重启,改一行代码修复Linux黑屏

AI疯狂劝退“这题无解建议放弃”!Linus硬刚18次重启,改一行代码修复Linux黑屏

一台搭载最新英特尔独立显卡的电脑,刚刚开机,屏幕瞬间陷入一片死寂的漆黑。

普通用户大概率会咒骂一声驱动太烂,然后默默按下电源键重启;程序员可能会在社区提个 Issue,等待厂商推送更新。

但这台电脑的主人,是 Linus Torvalds,Linux 内核的缔造者、掌管着全球数十亿台设备底层灵魂的技术教皇。

▲ Mark Kretschmann 在社交平台爆料 Linus 借助 AI 调试地狱级 Bug 的全过程

他没有选择等待Linus 直接拉来大模型 AI 当作助手,一头扎进 Linux 内核图形驱动的深渊。

随之而来的,是一场被 Linus 本人定性为“来自地狱的调试(debug session from hell)”的技术拉锯战:整整 24 个调试补丁、18 次内核重启。

在这场漫长的肉搏中,AI 中途数次声称这个 Bug “不可能、无解”,建议写份报告放弃。

Linus 没有接受这个结论,继续推着 AI 排查。

最终,这位 56 岁的老牌黑客带着被他训得服服帖帖的 AI,在一堆密密麻麻的底层代码中,找到了那个致命的幽灵,将一行代码中的 round_up(向上取整),改成了 round_down(向下取整)。

仅仅替换了一处函数后缀,黑屏瞬间烟消云散,显卡满血复活!

一台价值数千元的显卡,为什么开机就变成“黑砖”?

这场史诗级 Debug 的案发现场,发生在 Linux 刚刚合并的 Intel Xe 显卡驱动中。测试硬件是一块拥有 16GB 显存的英特尔新一代 Battlemage G21 架构显卡。

在 Linux 世界里,图形界面的启动像是一场精密的交响乐:内核驱动初始化显存、Mesa 图形库构建页表、GNOME 显示管理器(gdm)拉起桌面。然而在这台机器上,只要遭遇冷启动(从彻底关机到开机),系统就会陷入死循环:显示管理器不断崩溃、重启、再崩溃,屏幕一片漆黑。

诡异的是,如果你在黑屏时盲打命令强行重启一次 gdm,桌面有时又能奇迹般地亮起来。

这种“薛定谔的黑屏”,往往是底层硬件驱动里最令人抓狂的恶性 Bug。可以把这个 Bug 想象成下面的情形:

▲ 官方补丁提交说明:记录了硬件地址计算与黑屏的致命因果链

想象一下,GPU 的显存是一座巨大的立体智能立体仓库。为了让图像数据读写得更快,英特尔在显卡硬件里设计了一套名为 Flat CCS(压缩控制表面) 的机制。

你可以把 Flat CCS 理解为仓库管理员随身携带的“压缩密码账本”。它专门记录哪一块数据被压缩了、该怎么解压。

因为这个账本极其机密且重要,硬件在出厂时就规定:这块区域由 GPU 硬件内部电路独占,软件驱动绝对不能把它当成普通货架租给客户放货物!

那么,账本应该放在哪?硬件给出了一个起始基准地址:0x3fafff800。

问题就出在“算账”的算法上

显存分配器是个讲究规矩的强迫症,每次划定边界都要对齐到特定大小(比如 128KB)。早在一年多前,英特尔工程师为了满足硬件规范,在驱动里写了一行 round_up()(向上取整)。

这一取整,直接把基址从 0x3fafff800 硬生生抬高到了 0x3fb000000!

灾难就此降临

在这两个数字之间,留下了整整 2KB 的缝隙。这 2KB 本质上依然是硬件的“机密账本”,但因为软件把边界往上移了,显存分配器误以为这 2KB 是“完全合法的空闲普通显存”!

随后,冷启动的 Linux 桌面开始加载。系统刚好把桌面最核心的“三级页表(显存的虚拟导航地图)”塞进了这 2KB 的空间里。

显卡硬件根本不知道软件犯了蠢,它照常在这片空间里疯狂写入压缩元数据(类似 0xcccc... 这样的固定硬件特征码)。

导航地图被硬件偷偷抹成了乱码,桌面合成器一发指令直接迷路撞墙,显示管理器当场暴毙,屏幕瞬间黑死。

“这题无解,放弃吧!”AI 助手数次劝退

找到上述这套严密的因果链,事后看恍然大悟;但在当时的代码迷雾中,无异于大海捞针。

原因在于:当时驱动里原本用来防御 Bug 的断言检查,自己也是错的! 断言代码同样用了错误的对齐逻辑,导致它在错误发生时不仅不报警,反而向系统汇报“一切正常”。

面对这种幽灵现象,Linus 开启了他的硬核排查模式。他让 AI 辅助生成各种在内核底层打印内存特征的调试探针(Debugging Patches),自己则一遍又一遍地编译内核、重启系统、抓取内存数据。

▲ It's FOSS 报道页:18 次启动后,问题收敛到一行修复

整个过程极其折磨:加补丁、编译、重启、抓 Log、黑屏、推倒重来……整整循环了 18 次!

在这个过程中,被寄予厚望的 AI 助手开始顶不住了。

大语言模型在面对逻辑死胡同和看似矛盾的硬件 Log 时,其内置的概率对齐机制让它做出了人类职场最常见的举动,打退堂鼓。

AI 多次在回复中向 Linus 泼冷水:

“从目前的逻辑来看,这个问题是不可解的,硬件表现与规范存在根本冲突。我建议您停止调试,写一份 Bug Report 提交给硬件团队处理。”

如果换成一般开发者,可能真的就顺坡下驴,把锅甩给英特尔硬件部门了。但坐在屏幕前的是 Linus Torvalds。

正如他在最终的 Git Commit 附言中那句充满讽刺与自豪的调侃:

“AI 极大地帮了忙……尽管它中途好几次宣称这事儿‘不可能且无解’并建议我放弃。我猜,训练这帮 AI 的工程师们,大概没有我这么固执。”

▲ 网友搬出《星际穿越》经典台词精准还原现场:AI 说这不可能,Linus 说这是必须的

Linus 坚信物理定律不会凭空失效:既然能读出 0xcccc 的硬件特征码,就说明硬件一定在某个确定的时刻踩了内存。他拒绝了 AI 的退缩建议,让它继续添加调试代码、分析结果,不断缩小内存监视的包围网。

终于,在第 18 次重启后,内存边界被彻底锁死,真相大白,一切的罪魁祸首,仅仅是取整方向反了。

既然这个数值代表的是“普通可用显存的终点”,为了绝对不侵占后面的账本区,就必须宁可少算,绝不多算!

把 round_up 换成 round_down,按 4KB 向下截断,那多出来的 2KB 幽灵空间被彻底关进禁区。

Bug,瞬间被秒杀

惩罚还是奖赏?让 AI 来写技术说明书

在彻底修复这行致命代码后,Linus 做出了一个充满极客浪漫色彩的举动:

他让那个中途无数次想逃跑的 AI,亲笔写下了这篇补丁的技术说明文档(Commit Message)。

▲ 网友热评:AI 往往低估自己的能力,当它退缩时,人类必须对它施压

在 Linux 内核的代码库里,这篇提交记录堪称奇观。

前半部分是 AI 用极度专业、严密的内核工程语言,详细推导了从 Flat CCS 基址、128K 边界、2KB 内存溢出到 Mesa 页表损坏的全部技术数学细节;

而在正文的最末尾,Linus 用方括号加上了自己那段毒舌而温情的个人独白:记录下自己是如何抓着一个想要放弃的 AI,在 18 次重启的地狱中杀出一条血路。

补丁被打上 Fixes: 37173392741c 的标记,同时抄送 stable@kernel.org 稳定版分支。修复进入 Linux 7.3 开发树,并计划回传稳定分支。

高手始终握着方向盘

这起戏剧性的 Debug 事件在 Hacker News、X(推特)等技术社区引发了滔天巨浪。很多开发者在看热闹的同时,敏锐地捕捉到了它背后深刻的行业隐喻。

在过去的一年里,整个技术圈都在狂热鼓吹所谓的 “Vibe Coding”,即开发者什么都不用懂,喝着咖啡把需求丢给 AI,全自动生成代码。

但 Linus 用这场 18 次重启的硬仗,给全世界上了一堂清醒的工程实践课:

1. AI 善于“做苦力”,但没有“胜负欲”

在这次排查中,AI 的价值毋庸置疑:它按 Linus 的要求持续添加调试代码、分析结果,承担了大量重复工作。前后 24 个调试补丁和 18 次内核启动,最终把范围缩到了那一行代码。

但大模型本质上是一个基于概率的补全机器,缺乏对物理世界确切因果的直觉与执念。当复杂的边缘条件超出其预训练认知时,它的第一反应是“礼貌性放弃”。

2. 人类必须握住方向盘

一位资深开发者在社交媒体上评价:这场胜利体现了人类意志对 AI 潜能的极限压榨。

在整个过程中,人类负责判断方向,并拒绝接受“不可能”的结论。 换成一个完全依赖 AI 答案的新手,这个 Bug 大概率在第三次重启、AI 说出“建议放弃”的时候,就已经胎死腹中。

从 1991 年在赫尔辛基大学的宿舍里写下第一行 Linux 代码,到 2026 年按着顶级大模型的头在显存微秒级深渊里肉搏,Linus Torvalds 用 35 年的硬核履历证明了一件事:

时代和工具都在变化,代码从手工敲击变成了模型生成。软件工程世界里最坚不可摧的护城河,依然落在人类顶尖工程师那种近乎偏执的固执与直觉上。

下次当你的 AI 助手向你两手一摊说“这事儿无解”时,不妨学学 Linus 的做法:

敲敲桌子,告诉它,把代码重新拉出来,再跑一遍!

相关学习资料