乐于分享
好东西不私藏

AI数次劝退高呼“这题无解”!Linus地狱调试18次重启,1行代码手撕Intel显卡黑屏大Bug

AI数次劝退高呼“这题无解”!Linus地狱调试18次重启,1行代码手撕Intel显卡黑屏大Bug

在开源世界的权力版图里,Linus Torvalds 已经很多年不亲自写驱动补丁了。

作为掌控整个 Linux 内核生杀大权的“最高法官”,他日常的工作是审阅代码、合并分支,以及在邮件列表里用标志性的辛辣言辞把不及格的提交骂得狗血淋头。能让他亲自挽起袖子下场修 Bug 的情况,少之又少。

但就在 2026 年 8 月下旬,这位 Linux 之父被一块英特尔 Battlemage 独立显卡彻底惹毛了。

只要冷启动开机,屏幕便陷入死一般的漆黑,图形界面疯狂崩溃重启。为了逮住这个幽灵 Bug,Linus 开启了一场自称“来自地狱的调试(debug session from hell)”

在这场战役中,他拉来了一个强力搭档,AI 大模型

▲ 开发者 Mark Kretschmann 发帖还原了这场“Linus 逼着 AI 抓虫”的硬核攻坚

然而调试刚过半,极其戏剧性的一幕发生了:面对犹如迷宫般的内核日志和硬件寄存器,AI 居然当场心态崩溃,连续数次向 Linus 劝降:“这个 Bug 根本解不开,逻辑完全不可能成立,咱们放弃吧,写份缺陷报告算了。”

换作普通程序员,可能真就关电脑收工了。但 Linus 根本不吃这一套,他摁着 AI 的脑袋继续暴力插桩、疯狂倒逼。

24 个调试补丁、18 次内核启动之后,Linus 终于揪出了真凶,引发全盘崩溃的,竟然只是一行代码里的取整方向写反了

幽灵黑屏:显存里的“阴阳账本”被撕碎了

要想看懂这场神仙仗,我们得先把这个把无数人逼疯的显卡 Bug,用人话拆解清楚。

出问题的机器搭载的是英特尔次世代架构的 Battlemage G21 显卡(16GB 显存)每当电脑冷启动,GNOME 桌面管理器(gdm)就会陷入无休止的自杀式重启。屏幕一片漆黑,但诡异的是,系统的其他后台服务居然全活着。

怪就怪在这里:强行重启几次桌面后,它有时又莫名其妙地“好了”。

为什么会这样?

想象一下,你的独立显卡是一座拥有 16GB 货架的超级大仓库(VRAM,显存)。仓库里不仅要放画面像素,还要留出一张至关重要的“货架索引总账本”(GPU 页表)。如果总账本被涂抹篡改,GPU 找不到货物,显示系统就会瞬间暴毙,直接黑屏。

而在现代英特尔显卡中,为了让画面渲染得更快,硬件引入了一种叫 Flat CCS(压缩控制表面) 的机制。你可以把它理解为“打包压缩专用的防伪封条区”

这块封条区必须被硬件死死霸占,绝对不能当成普通货架租给用户程序。

【普通可用显存(放网页、游戏、页表)】 | 【Flat CCS 压缩封条区(硬件私有)】                                      ▲                              这里的边界到底划在哪?

问题恰恰就出在这道“隔离墙”的划分上。

在内核驱动 xe_vram.c 的计算逻辑中,硬件给出的压缩区物理基准地址是 0x3fafff800驱动原本需要把这个地址换算后,作为“可用显存的终点线”交还给内存分配器。

结果,代码在这个边界上执行了一次向上取整(round_up 到 128K),直接把边界算成了 0x3fb000000

这多算出来的 2KB 内存,本质上是属于硬件压缩区的地盘,却被驱动当成“空闲货架”大摇大摆地挂牌出租了!

结果冷启动时,桌面渲染引擎刚好把最核心的三级页表塞进了这危险的 2KB 里。当显卡硬件开启硬件压缩时,硬件不管三七二十一,直接霸道地往里写入压缩元数据(Linus 在显存里当场抓到了 0xcccc... 和 0xcc77... 的硬件特征指纹)。

你的“货架总账本”,被硬件防伪封条给生生覆盖了。 显卡瞬间迷路,桌面当场暴毙

“这不可能!”AI 崩溃劝退,Linus 开启地狱压榨

定位这种底层显存踩踏,是所有系统程序员的噩梦。

它不会留下报错调用栈,也不会触发内核 Panic,用户只能看到冷冰冰的黑屏。为了追查这丢失的 2KB,Linus 把 AI 当成了“超级苦力”。

在整个排查链路里,Linus 负责架构层面的推演,AI 则负责极速生成内核探针、插入调试代码并分析海量的日志流。一人一机,硬生生砸下去了 24 个调试补丁,把整个 Linux 内核反复编译、启动了整整 18 次

随着调试进入死胡同,大模型在复杂的上下文和相互矛盾的硬件行为面前,开始露出人类常见的“疲态”。

AI 多次向 Linus 弹出放弃提示:“从逻辑上看这是不可能的”、“当前表现存在不可解的硬件冲突”、“建议停止调试,直接向上游提交 bug 报告”。

▲ 网友截出 Linus 在内核补丁中的犀利吐槽

面对 AI 的“求饶”,Linus 表现出了顶尖工程师近乎偏执的冷酷。他在提交说明中留下一句毒舌评价:

“我严重怀疑,训练这些 AI 的那帮人类,根本没有我这么死心眼(stubborn)。”

在 Linus 毫不妥协的指令轰炸下,AI 只能收回认输的念头,继续机械地分析探针打出的每一组十六进制内存转储。

最终,Linus 顺藤摸瓜看到内存里交替出现的 0xcccc 数据。拼图终于对上了:这些数据是硬件压缩机制留下的“案发现场”!

终极反转:找到黑屏根因的,只有一行代码

搞清真相后,修复方案简单得令人窒息。

核心修复非常简单:把取整函数从向上取整(round_up)改成向下取整(round_down

▲ 补丁正式归档记录,Linus 在正文末尾用括号附上了与 AI 搏斗的全过程

为什么改个方向就能救命?

因为当这个数值代表的是“可用内存的上限截止点”时:

  • 向上取整(round_up
    :相当于把安全线往前多推了一步,把原本属于雷区的土地,虚报成了安全区;
  • 向下取整(round_down
    :宁可少用几 KB 显存,把安全线往后撤一步,严禁用户数据侵入硬件专属领地。

讽刺的是,驱动里原本写了一套用来拦截这种错误的“断言防御机制”(Assertion)。但写断言的前人同样掉进了数学陷阱,断言拿去比对的基准值本身就是 128K 对齐的,导致“多占 2KB 越界”的错误在断言眼里居然被判定为“完全合法”!

新补丁不仅将取整方向逆转为向下截断到 4K 页面,还一并重写了这套形同虚设的校验断言。

在这场战役的终点,Linus 展现了极具极客浪漫的一面:他把补丁的核心技术说明交由 AI 撰写,自己则在最后留下了一段括号附记,把这段“逼着 AI 加班抓虫”的历程永久刻进了 Linux 内核的史册。

降维打击:从“代码蹦迪”到“执鞭驱役”

事件传开后,整个海外技术社区瞬间沸腾。

有人开玩笑发问:“Linus 当时有没有对 AI 说‘请相信你自己’?”

▲ 开发者调侃 Linus 给大模型做“心理建设”

但更多严肃的硬核开发者,从中看出了当今 AI 浪潮最残酷的真相。

一位名叫 Rupert Davies 的开发者一针见血地指出:“这恰恰证明了当前的大模型缺乏深度推理能力。AI 干了所有搬砖的体力活,中途宣称问题无解,最后由人类找到了这一行代码的解法。他将这种关系称为‘人类辅助 AI’”

▲ 社区热议:大模型做苦力与人类直觉的本质差异

另一位工程师 Ali Kutlusoy 则将这种差异上升到了方法论层面:

“所谓的‘氛围写代码(Vibecoding)’,和‘顶级开发者把 AI 当工具使唤’,完全是两码事。Linus 属于后者,他心里清楚知道底层机器在发生什么,能一眼看穿输出结果的真伪。这就是平庸与顶尖的分水岭”

▲ 社区深度思考:专家掌控工具 vs 纯粹依靠 AI

回顾 2026 年初,Linus 曾在自己的业余开源音频项目(AudioNoise)里公开自嘲,说那个 Python 工具主要是靠“Vibe-coding”让 AI 糊出来的,甚至点名用了 Google Antigravity。

很多人以为,连祖师爷都要全面向 AI 躺平了。

但这次的 Intel Xe 显卡事件,给所有人结结实实地上了一课:

  • 在低风险、容错率极高的玩具项目里
    ,你可以端着咖啡让 AI 自由发挥;
  • 但在内核底层、寄存器与字节对齐的严酷生死场上
    ,AI 的“讨好型人格”和“放弃倾向”会暴露无遗。

当前大模型经过大量人类反馈强化学习(RLHF)训练后,往往学会了在长程复杂困境中礼貌地寻找退路,当上下文过长、算力受限、逻辑无法闭环时,它倾向于给出一个合乎逻辑的借口“建议放弃”。

能击穿底层死锁的,是人类工程师凭借数十年肉身经验积累出的空间几何直觉,以及“绝不在黑屏面前低头”的野蛮固执

目前,这个名为 drm/xe: Don't hand out the flat CCS storage as usable VRAM 的补丁已经被正式合入 Linux 7.3 开发树,并火速回传(Backport)至各大稳定分支。

AI 确实帮人类省去了大量调试插桩的机械劳动,但最终拯救这块显卡的,依然是那个坐在屏幕前、眼神冷酷、不信邪的芬兰人。