想入门 GPU 驱动开发? 一张从零到内核的完整知识地图
面对 DRM、KFD、ROCm、SVM 这一堆名词很多人不知道从哪儿下手。本篇算是我给 GPU 驱动学习画的一张总目录帮你先看清全局、理清顺序。当然了实践出真知最重要的还是从实际项目中深入理解。先说清楚一件事GPU 驱动开发大体分两条路——图形渲染和AI 计算。这两条路在底层内核态有大量共通的东西越往上走、越贴近业务用户态的差异就越大。本文以及整个系列我会主要聚焦 AI 计算方向也就是 CUDA、ROCm、KFD、SVM 这条算力卡的技术栈不过打地基的那一层图形方向的同学同样适用。1、为什么值得学 GPU 驱动开发最近收到不少读者私信问得最多的几个问题是GPU 驱动开发有没有就业市场薪资怎么样要学哪些技术有没有靠谱的学习路径还有读者说看了我的专栏分的太细了找不到北(方向感)。在这里把我这些年在一线做 GPU 驱动的经历、踩过的坑、还有我自己当年是怎么一步步走过来的和大家分享一下。同时对专栏的阅读顺序做个描述。先说结论这是个典型的高端岗位——人才少但岗位也不算多属于供需两头都不大、但供给更小的方向。也正因为如此一旦你入了门就会发现自己站在一个很舒服的位置上。这两年 AI 算力爆发身边真正抢手的从来不是调模型的人(搞模型结构的高人不算在内)而是能把算力卡跑起来、调优、排障的底层工程师。为什么稀缺全国真正能读懂 GPU 内核驱动的工程师估计也就大几百人供给远小于需求。护城河深这条栈横跨硬件、内核、运行时学习曲线陡但陡也意味着——你爬上去了别人短时间追不上。国产替代红利信创 国产 GPU 这波浪潮里能吃透 AMDGPU/Intel Xe 开源实现、并迁移到国产硬件上的人是真的紧俏。一句话这是一个入门难、但入门后极值钱的方向。但难点也恰恰在这——我当年入门时最痛苦的不是内容难而是资料太散根本不知道该按什么顺序学走了不少弯路。所以我把整条路径重新梳理成了下面这张知识地图希望你能少走点冤枉路。2、知识地图总览我自己复盘下来整条技术栈其实可以分成三层从下往上、从熟悉到陌生一层层爬给你一条我用血泪换来的原则别跳级。我见过太多人包括早年的我自己一上来就冲 KFD 源码结果被劝退根子上都是第一层没打牢。还有一点想提醒你现在 AI 很强查资料、读源码、写代码都方便了不少但别把AI 讲明白了错当成我自己懂了。真正的检验标准很简单——关掉 AI你还能不能把这些机制讲清楚、把技术问题答上来。地基这种东西终究得长在自己脑子里。3、第一层前置基础打地基这一层是我认为最容易被低估、却最决定你能走多远的一层。别急着往上冲先把地基夯实。3.1 C 语言与 Linux 内核基础指针、内存布局、并发与锁自旋锁、互斥锁、RCU驱动运行在内核态、多核并发环境里一个锁用错就是死锁或数据竞争。这是你读懂任何内核代码的识字能力。内核模块编写、字符设备驱动GPU 驱动本质就是个很复杂的内核模块最终以设备节点的形式暴露给用户态这决定了它的加载、初始化和生命周期。ioctl 机制用户态程序比如 ROCm 运行时几乎所有让 GPU 干活的请求都是通过 ioctl 下发到内核驱动的。它是用户态与内核态之间的主通道。学习这块最好的资料自然是 linux 内核分析但推荐从《Linux Device Drivers》入手。3.2 内存管理重中之重说句实话我觉得 GPU 驱动的一半难度都压在内存管理上。这一块你没吃透后面基本寸步难行。至少要搞明白虚拟内存、页表、多级页表CPU 靠页表把虚拟地址翻译成物理地址GPU 也有自己的一套页表GPUVM。理解 CPU 侧才能看懂后面 GPU 侧的地址映射和 SVM。缺页异常page fault的完整流程“访问了还没映射的地址会发生什么”——这套机制是后面 GPU 缺页、页迁移、SVM 的直接原型。MMU / IOMMU 的作用MMU 管 CPU 的地址翻译IOMMU 管设备含 GPUDMA 时的地址翻译与隔离。它们是 CPU 和 GPU 能安全共享内存的硬件基础。DMA 与一致性coherencyGPU 通过 DMA 直接搬运大块数据不经过 CPU而缓存一致性决定了 CPU 写的数据 GPU 能不能立刻看到。性能和正确性都卡在这里。深入阅读这部分是理解后面所有内容的钥匙我在《Linux mm 子系统分析从 mm 到 hmm 的进化》专栏里做了系统梳理建议第一层就配合阅读。4、第二层图形/计算栈搭框架地基打牢了我们就能进到 GPU 驱动的通用框架层——到这一步你会第一次真正有我在写 GPU 驱动的感觉。4.1 DRM/KMS —— 一切的起点DRMDirect Rendering Manager是 Linux 图形/计算驱动的统一框架所有厂商驱动amdgpu、i915/xe、nouveau都挂在它下面。核心对象GEMGraphics Execution Manager管理显存缓冲对象BO的分配、引用计数与生命周期。你在 GPU 上用的每一块内存背后基本都是一个 GEM/BO 对象。TTMTranslation Table Manager负责显存与系统内存之间的搬迁与放置策略放显存还是内存、什么时候换出。它是显存不够用时的调度中枢。dma-buf一套跨设备共享缓冲区的标准机制让 GPU、摄像头、编解码器等设备零拷贝地共用同一块内存。是异构数据流转的基础。dma-fence跨设备的同步原语表达这块数据什么时候算完、谁能接着用。GPU 异步执行下靠它来保证时序正确。GPUVMGPU 侧的虚拟地址管理相当于 GPU 自己的MMU 页表把 BO 映射进 GPU 的虚拟地址空间供 shader/kernel 访问。深入阅读这是整条栈里最需要吃透的通用层我在《Linux DRM 子系统核心机制分析》专栏80 篇里逐个对象拆解了原理与源码。4.2 显存分配Buddy Allocator伙伴系统DRM 用来管理显存的核心分配算法按 2 的幂次切分/合并页块兼顾分配速度和大块连续内存的诉求。GPU 每次要显存最终都会走到它。碎片化与优化长时间运行后显存会碎片化导致总量够但分不出大块。如何合并回收、如何减少碎片直接影响驱动的稳定性和长时任务表现。深入阅读《DRM Buddy Allocator 技术分析》专栏。4.3 ROCm 运行时用户态视角理解内核驱动如何被上层调用libhsakmt用户态与 KFD 内核驱动之间的薄封装库把 ioctl 调用包装成规整的 C 接口。它是内核态和运行时之间的直接桥梁。ROCr Runtime 的整体架构ROCm 的核心运行时向上承接 HIP/编译器向下调用 libhsakmt/KFD负责队列、信号、内存等资源的编排。看懂它你就打通了上层 API 调用 → 内核驱动动作的完整链路。深入阅读《ROCm rocr-libhsakmt 库实现剖析》《AMDGPU ROCm 驱动栈全析》专栏想成体系地纵览整个 ROCm 生态可以看《深探 ROCm》专栏42篇持续更新中。5、第三层硬核深水区进阶壁垒能走到这一层恭喜你——你已经甩开一大批人了。这里就是 AI 算力卡真正的核心竞争力所在也是我平时花最多时间死磕的地方。5.1 KFD —— AMD 计算驱动核心KFD 与 KGD 的分工KGDamdgpu 图形驱动管硬件底层与显存KFD计算驱动专管计算任务的队列、进程与调度。搞清这条分工线才不会在源码里迷路。BOBuffer Object的实现计算场景下显存对象的具体承载涉及分配、映射、共享。它是 KFD 里所有内存操作的基本单位。ioctl 流程从用户态一个 ioctl 请求到内核里完成队列创建、内存映射的完整调用链。这是把上层意图落到硬件动作的关键路径。深入阅读《AMD KFD BO 实现分析》专栏。5.2 SVM —— 统一地址空间这是异构计算的胜负手让 CPU 和 GPU 共享同一套虚拟地址。CPU-GPU 统一地址空间设计让一个指针在 CPU 和 GPU 上都指向同一个东西编程模型从此不用手动拷来拷去。这是现代 AI 框架能高效跑起来的底层前提。页迁移机制数据在系统内存和显存之间按需搬迁哪边算就把页迁到哪边。它决定了统一地址空间下的实际性能。XNACK 与缺页处理GPU 访问未映射页时能重放而非崩溃由缺页机制按需补上映射。这是 SVM 能真正做到按需的硬件软件协作核心。深入阅读《AMD KFD SVM 原理与实现剖析》《Intel Xe 驱动 SVM 实现技术分析》专栏。5.3 HMM 与 MMU NotifierHMM异构内存管理内核提供的一套通用机制让设备内存显存也能纳入 CPU 的内存管理体系是 SVM/页迁移背后的通用基础设施。MMU Notifier / Interval Notifier当 CPU 侧页表发生变化比如页被换出/迁移时通知 GPU 驱动同步更新自己的映射避免两边看到不一致的内存。它是统一地址空间下数据不出错的守门人。深入阅读《MMU notifier 机制与应用》《从 mm 到 hmm 的进化》专栏。6、一张表按阶段该学什么、配哪个专栏阶段你要掌握对应专栏入门C / 内核模块 / ioctl双语阅读:Linux Device Drivers地基内存管理 / 页表 / DMAlinux mm 子系统分析从 mm 到 hmm 的进化框架DRM / GEM / TTM / fenceLinux DRM 子系统核心机制分析分配Buddy AllocatorDRM Buddy Allocator 技术分析运行时libhsakmt / ROCrROCm rocr-libhsakmt 库实现剖析、深探 ROCm进阶KFD / BOAMD KFD BO 实现分析深水SVM / HMM / NotifierAMD KFD SVM 原理与实现剖析7、写在最后本篇也算是对与这一年多专栏技术编写的一个总结吧。说句掏心窝的话GPU 驱动开发真不是一条能速成的路我自己也是踩了好几年坑才慢慢摸清门道。但它的每一层都对应着真实、稀缺、值钱的能力。只要你按这张地图一层层往下挖你会走得比 90% 半途而废的人更远。 如果这篇帮到了你顺手收藏 转发给同样在入门路上的朋友让更多人少踩坑。 你现在卡在哪一层或者当年被哪个概念劝退过欢迎在评论区聊聊我们一起探讨解决办法。

相关新闻

最新新闻

日新闻

周新闻

月新闻