第89期 | 内核一半是驱动,另一半在替谁说话?
第九章收束了文件系统,第十章换一个方向。内核里最大的一块,既不是调度,也不是内存,而是替硬件说话的那部分。先把这一块看清楚,后面再谈它怎么变、怎么分、怎么出问题。
一、一半内核,都是翻译官
内核不直接跟硬件握手。硬件只认自己的方言:某个寄存器地址、某一位是开关、中断来了先清哪一位、时序错一步就死机。驱动干的活,就是把内核的通用请求翻译成这套方言,再把硬件的回答翻回来。Corbet、Rubini、Kroah-Hartman 在《Linux Device Drivers》里把驱动分成三类¹:字符设备按字节流走,像键盘、串口;块设备按块走,能随机读写,像磁盘;网络设备走数据包,连一个 /dev 节点都没有——单这一条就够反常识:不是所有设备在 /dev 里都有名字。
规模先给一个硬数字。David Wheeler 数过 2001 年前后的内核:240 万行源码里,drivers 目录占了 140 万行,57%²。二十年后,口径换了,方向没换:2021 年有人数过不含注释与空行的 2200 万行,驱动占了 65% 以上³。两个数字口径不同,不能直接连成一条线,但结论一致:驱动一直是内核最大的一头。还有一层要剥开:行数大不等于逻辑多³,大块驱动代码是自动生成的寄存器定义表,是硬件的“词典”,不是人一行行写的推理。
2.6 内核之后,驱动多了一套认人的规矩:设备、驱动、总线三方分开。总线负责发现设备,驱动负责认领,匹配上了才调用 probe,匹配不上就不碰。/sys 把这层关系摊成了文件:/sys/bus/pci/devices/ 里是被发现的设备,/sys/bus/pci/drivers/ 里是已经注册的驱动,设备目录下的 driver 软链接,就是认领成功的证据。翻译官上岗之前,先要验明正身。
同一句通用请求,到了驱动手里,要换成这块硬件才听得懂的方言。程序绘制概念示意图。
二、AI 的驱动,不该再按设备分
2026 年 10 月 5 日,布拉格 Linux Plumbers Conference 上,英伟达的 John Hubbard 与 Red Hat 的 Danilo Krummrich 讲了 Rust 写的 Nova 驱动⁴。说法很直白:长期看,Nova 要取代英伟达自家的 Open RM 内核模块,也就是那套开源但在主线之外的模块。现状也要说清:Nova 现在能在 Turing 到 Blackwell 的卡上把 GPU 系统处理器(GSP)用固件启动起来,基础功能正在上线,但还不能给最终用户用,虚拟机里的客户机、Vulkan Compute、CUDA 应用都还在后面⁴。转述自 Phoronix 对演讲的报道,以演讲与上游记录为准。
同一批合并窗口里还有另一条线:Rust for Linux 负责人 Miguel Ojeda 提交的 Linux 7.4 Rust 补丁,约 17000 行⁵。数字听着大,大头却是基础库 Zerocopy 一次升了八个版本带来的 vendored 代码,加上 NovaCoreApi、一个向用户态上报 GPU 架构与显存信息的 ioctl⁵。又是同一课:行数先别急着当成功能数。
落到原生 AI 操作系统,这两条线合起来指向一个改法。传统驱动按设备分:一块卡一个驱动,一个驱动一堆寄存器表。AI 时代的算力主体是向量阵列,驱动该暴露的,不再是“这块卡的寄存器在哪”,而是能力:多少算力阵列、显存带宽多少、支不支持稀疏与低精度、能不能切分给不同的智能体。Nova 已经拆成了 nova-core、nova-drm、虚拟化支持、fwctl 几块⁴,Rust 的类型系统在编译期就把这几块的边界划出来——这正是能力清单的雏形:先把“能干什么”说清楚,再谈“怎么干”。
言外之物也在这里。驱动之争从来不只是技术:谁写驱动,谁就定义了硬件能被怎么用。Open RM 在主线之外,维护、审查、兼容的账都在厂商一家手里;Nova 走进主线,是把这笔账搬到公共树上摊开算。固件那一层还在,GSP 里的东西并没有因此全部公开——边界挪了一步,不等于边界没了。看驱动,不能只看它支不支持某块卡,要看它把权力留在了哪一边。
旧抽象与新硬件的张力,在这里换了个样子:线性系统调用进来,要在驱动里翻成向量阵列的活;翻译的活越重,驱动就越像一道关口。关口在谁手里,算力就听谁的。
三、插上卡,先问它是谁
手边任何一台 Linux 机器,先问四句,不用动任何硬件:
lspci -nn
ls /sys/bus/pci/devices/
ls -l /sys/bus/pci/drivers/
lsmod
第一条列出总线上的设备与厂商、设备号;第二条是内核发现的设备目录;第三条看每个驱动目录下绑了哪些设备;第四条看哪些驱动模块已经载入、被谁用着。再往深里走一层,挑一张卡,把它的总线地址记下来,到 /sys/bus/pci/devices/ 里找到同名目录,看 driver 软链接指向哪个驱动,再用 dmesg | grep -i pci 翻它启动时留下的那几行:认领、分配资源、报中断,一部小小的认人记录都在里面。
今晚能动手的小实验,是把“认领”看成一个可观察的现象:先 lsmod 记下显卡或网卡驱动的名字,再 ls /sys/bus/pci/drivers/ 下同名目录,看里面绑了几个设备。设备数对不上直觉时,别急着下结论——一张物理卡可能挂着声卡、USB 控制器好几个功能,驱动按功能认领,不是按卡认领。亲手数一次,比背“设备、驱动、总线”三个词记得牢。
落到日常的四种活,同一层翻译能翻出四种读法。一台跑本地模型的机器上,显卡驱动是本地推理的第一道关口,驱动版本与固件对不上,模型还没跑起来就先卡在认领上;边缘盒上,摄像头、NPU、串口各有各的方言,驱动齐不齐,决定了盒子在野外是能干活还是只能亮灯;视频 AI 平台里,视频流进来要先过采集卡与编解码的驱动,翻译慢一拍,延迟就多一拍;企业私有智能中心里,企业那一侧不直接碰驱动,但每一次“模型跑不动了”的报修,查到根上常常是驱动这一层没认对人。翻译官认错了人,上面的活全白干。
觉 然 小 注
一块卡插上去没反应,看起来是坏事,落到设计里却是好事:它逼系统先问一句你是谁,再决定让不让你进来。认人这一步省不得,省了的系统,迟早要在别处连本带利还回来。凡发生,都有它逼出来的那一层明白——前提是,问的那一句还在。
引 用 与 出 处
- [1] Corbet, J., Rubini, A., Kroah-Hartman, G. Linux Device Drivers. 3rd edition. O'Reilly, 2005.
- [2] Wheeler, D. A. More than a Gigabuck: Estimating GNU/Linux's Size. 2001. https://dwheeler.com/sloc/redhat71-v1/redhat71sloc.html
- [3] Farrell, D. Is Linux Growing Out of All Proportion? 2021. https://blog.dnmfarrell.com/post/is-linux-growing-out-of-all-proportion/
- [4] NVIDIA's Nova Driver Gains Ground in Linux 7.4 as Path to Official Open Kernel Support Emerges. WebProNews, 2026. https://www.webpronews.com/nvidias-nova-driver-gains-ground-in-linux-7-4-as-path-to-official-open-kernel-support-emerges/ (转述 Phoronix 对 LPC 2026 演讲的报道,以演讲与上游记录为准)
- [5] Linux 7.4 Brings About 17,000 Lines of New Rust Kernel Code, With Zerocopy Jumping Eight Versions. pbxscience, 2026. https://pbxscience.com/linux-7-4-brings-about-17000-lines-of-new-rust-kernel-code-with-zerocopy-jumping-eight-versions/
· · ·