手把手教你学 GPU KMD(内核模式驱动)
文章平均质量分 88
手把手教你学 GPU KMD(内核模式驱动)
本专栏聚焦于 GPU 内核模式驱动(Kernel Mode Driver, KMD) 的核心原理与实现细节,面向希望深入理解 Linux/Windows 图形/计算驱动栈底层机制的开发者与系统工程师。
内容涵盖:
GPU 驱动整体架构(UMD + KM
amy_mhd
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
21天学pcie--为什么 PCIe 不会丢数据?
PCIe 不是“从不丢包”,而是“丢包一定能被发现,并且一定能被恢复”。它的可靠性,是由三层机制 + 两个维度 共同保证的:层级机制解决什么问题物理层8b/10b / 128b/130b + 扰码信号不乱、不畸变数据链路层链路级不丢、不错事务层事务级有始有终📌PCIe 的可靠性是“设计出来的”,不是“指望链路干净”**PCIe 之所以不会丢数据,是因为:物理层尽量不错,数据链路层错了必救,Flow Control 防止乱冲,事务层保证有始有终。**原创 2026-08-27 09:30:00 · 300 阅读 · 0 评论 -
21天学pcie--PCIe 设备树(Device Tree)简析
*PCIe 控制器节点,是 SoC 侧对 PCIe Host Bridge 的完整描述;它定义了地址窗口、中断路由和硬件资源,但不描述具体的 PCIe 设备。**原创 2026-08-28 05:30:00 · 112 阅读 · 0 评论 -
Memory Read / Write TLP 示例(不看协议也能懂)
本文通过Memory Read/Write TLP示例,对比PCIe设备读写操作的差异。Memory Write只需单向发送TLP,速度快;而Memory Read需要先发请求,等待设备返回Completion TLP,导致延迟高、性能差。MMIO读取是PCIe的性能瓶颈,优化建议包括减少MMIO读取、使用DMA替代、合并写操作等。工程师需理解PCIe的天性:写操作像寄快递,读操作像寄单子等回执,前者高效后者耗时。文章还解释了lspci命令输出与TLP地址的对应关系,帮助读者形成闭环理解。原创 2026-08-27 05:45:00 · 16 阅读 · 0 评论 -
ranges / bus-range 含义(PCIe 地址空间的“施工图纸”)
*bus-range 划定 PCIe 总线的“行政辖区”,ranges 定义 CPU 与 PCIe 之间的“地址翻译规则”;前者决定“能管多远”,后者决定“能装多少设备”。**原创 2026-08-26 08:00:00 · 13 阅读 · 0 评论 -
零基础学pcie--PCIe 是怎么“可靠传输”的?
摘要: PCIe通过数据链路层的Ack/Nak机制确保可靠传输,核心思想类似“快递签收”:TLP(数据包)附带SeqNum序列号,接收端校验LCRC后返回累计确认(Ack)或错误重传请求(Nak)。发送端通过RetryBuffer暂存未确认的TLP,触发Nak时从错误点批量重传。该机制仅在相邻设备间逐跳生效,由硬件自动完成,驱动无感知。调试时,吞吐下降或延迟抖动可能源于物理层信号问题引发的频繁Nak。关键点:PCIe不保证链路绝对可靠,但通过“错误检测+重传”实现“丢了必救”。原创 2026-08-21 12:00:00 · 15 阅读 · 0 评论 -
零基础学pcie--ARM SoC 上的 PCIe(你必须建立的三个认知)
ARM SoC上的PCIe核心认知 在ARM架构中,PCIe本质是SoC的外设控制器,而非x86的系统总线。设备树仅需描述SoC内部的PCIe控制器(含PHY/时钟/复位配置),不处理板级PCIe设备,后者由内核通过标准PCIe枚举机制自动识别。关键点包括: 三层模型:设备树仅管理SoC层(控制器),Root Port以下由内核负责; 与x86差异:ARM无统一BIOS/ACPI,依赖设备树初始化控制器; 调试铁律:设备树确保控制器可用(80%问题在PHY/时钟),内核处理设备枚举; 常见误区:禁止在设备树原创 2026-08-21 10:15:00 · 89 阅读 · 0 评论 -
零基础学pcie--TLP 的三大部分:Header / Data / Digest
摘要: TLP(事务层数据包)由三部分组成:Header(必选,包含地址、类型等元数据)、Data(可选,实际传输内容)和Digest(可选,端到端校验)。Header类似快递单,决定TLP的流向和操作;Data仅在写请求等场景存在,长度以DW(4字节)为单位;Digest(ECRC)用于端到端校验,区别于链路级LCRC。关键点:Header决定TLP行为,Data非必需且大小受限,ECRC非强制但提升可靠性。常见误区包括混淆ECRC/LCRC、误认所有TLP含Data。工程师调试时应优先检查Header正原创 2026-08-20 23:14:02 · 18 阅读 · 0 评论 -
pcie的Status / Command 寄存器实战(设备的总开关和体检表)
PCIe设备调试实战:Command与Status寄存器关键解析 Command寄存器(0x04)是PCIe设备的"总开关",控制核心功能使能,如Memory Space(Bit1)和Bus Master(Bit2)必须开启(0x0006)才能保证设备基本工作。Status寄存器(0x06)则提供"体检报告",通过错误标志位(如Master Abort、Parity Error等)快速定位问题。调试时需遵循黄金法则:先检查Command配置合法性,再分析Status报原创 2026-08-17 00:04:46 · 13 阅读 · 0 评论 -
Vendor ID / Device ID / Class Code(设备的“三件套”)
本文介绍了PCIe设备的三个关键标识字段:VendorID(厂商ID)、DeviceID(设备ID)和ClassCode(分类代码)。VendorID由PCI-SIG统一分配,DeviceID由厂商自定义,两者组合形成设备唯一身份标识,用于操作系统驱动匹配。ClassCode采用三层结构(BaseClass/Sub-Class/ProgIF)定义设备功能类别,使系统在无专用驱动时也能进行基本识别。文章列举了常见厂商ID和典型ClassCode组合,强调VID/DID用于精确驱动匹配,ClassCode用于系原创 2026-08-18 06:15:00 · 18 阅读 · 0 评论 -
/sys/bus/pci/devices/ 目录结构(PCIe 的“家谱”)
摘要 本文深入解析Linux系统中/sys/bus/pci/devices/目录结构,揭示其作为PCIe设备在内核中的核心管理接口。该目录以BDF格式(如0000:01:00.0)命名,包含设备身份标识(vendor/device)、类型(class)、资源配置(resource)、中断号(irq)等关键信息。重点介绍了config文件(原始配置空间入口)、热插拔操作文件(remove/rescan/reset)和MSI中断目录(msi_irqs/)的实用价值。文中提出"lspci看现象,/sys原创 2026-08-17 11:30:00 · 97 阅读 · 0 评论 -
21天学pcie--访问 BAR 空间示例(让驱动真正“摸到”硬件)
*访问 BAR 空间,就是“用读写一段 MMIO 地址”;它看起来像内存,但本质是 I/O;写得越“克制”,系统越稳定。**原创 2026-08-08 18:57:35 · 16 阅读 · 0 评论 -
第 14 篇:PCIe 常见问题排查清单(经验篇
*PCIe 设备不识别,本质是“链路没起来”;供电、复位、时钟、PHY 是四大命门,软件只能补救,不能创造奇迹。**原创 2026-08-07 18:50:24 · 20 阅读 · 0 评论 -
14 篇:PCIe 常见问题排查清单(经验篇)
*PCIe 设备不识别,99% 是“链路没起来”;供电、复位、时钟、PHY 是四大命门;软件只能补救,不能创造奇迹。**原创 2026-08-07 18:42:14 · 22 阅读 · 0 评论 -
21天学pcie--、Lane、Link、x1/x4/x8/x16 到底是什么?
本文系统解析了PCIe接口中的核心概念:Lane(单对差分线路构成的基本通道)、Link(设备间物理连接)和Width(总通道数)。通过高速公路类比,阐明x1/x4/x8/x16代表不同车道数,其带宽呈线性增长(如PCIe Gen4 x16可达32GB/s)。重点指出显卡需要x16并非因其"高级",而是GPU对高带宽的需求特性,并提醒注意插槽物理规格与实际运行宽度的区别(可通过Linux命令验证)。最后强调PCIe规格中的数字代表独立通道数而非设备数量,多通道设计通过并行传输提升吞吐量而原创 2026-08-06 08:30:00 · 25 阅读 · 0 评论 -
手把手教你学 Simulink—— 爪极发电机在汽车怠速工况下的稳压控制仿真
本文摘要: 本文针对爪极发电机在汽车怠速工况下的稳压难题,提出了一种基于Simulink的PWM整流协同控制方案。通过分析爪极发电机结构特性(低电感、强谐波)与怠速工况(转速波动±100rpm、负载突变10-80A)的矛盾,构建了分层稳压系统:PWM整流实现快速动态响应,励磁电流优化保证建压能力,超级电容缓冲脉冲负载。仿真结果表明,升级方案将电压纹波从1.2V降至0.15V,负载突变恢复时间缩短至30ms,效率提升16%。文章详细给出了建模步骤、参数调优方法及工程扩展方向,为汽车电气系统稳压控制提供实用解决原创 2026-08-03 10:00:00 · 16 阅读 · 0 评论 -
21天学pcie--配置空间(Configuration Space)初探
*枚举让系统“看到设备”,BDF 给设备“编地址”,配置空间让系统“读懂设备”。**原创 2026-08-02 16:12:40 · 207 阅读 · 0 评论 -
21天学pcie--PCIe 和 PCI / PCI-X 到底有什么区别?
PCI 是“并行共享总线”,PCIe 是“串行交换网络”。它们名字相似,思想完全不同,只是“软件接口”还认亲戚。原创 2026-08-01 12:14:42 · 79 阅读 · 0 评论 -
21天学pcie--为什么 PCIe 不需要“共享总线”?(架构级答案)
*PCIe 之所以快,不是因为它“跑得快”,而是因为它:不用对齐时钟、不怕干扰、不抢总线。**原创 2026-07-29 18:03:01 · 180 阅读 · 0 评论 -
21天学pcie--读懂 PCIe 配置空间(Type 0 / Type 1 Header)
*Type 0 是“我要资源”,Type 1 是“我管资源”;前者是 Endpoint,后者是 Bridge。**原创 2026-07-26 10:05:39 · 217 阅读 · 0 评论 -
21天学pcie--为什么实际带宽总是“打折扣”?(非常重要)
*PCIe 的“理论带宽”是物理极限,不是工程目标;实际带宽 = 理论值 − 编码 − 协议 − 硬件 − 软件。**原创 2026-07-23 22:02:43 · 16 阅读 · 0 评论 -
21天学pcie--断方式演变 —— INTx → MSI → MSI-X
*INTx 的问题是:共享、轮询、实时性差、不支持多核;它存在的意义,只是为了“让老设备还能用”。**原创 2026-07-21 11:08:13 · 20 阅读 · 0 评论 -
21天学pcie--写一个最简单的 PCIe 驱动(字符设备)
📌这是 PCIe 驱动的“身份证”**pci_register_driver() 让内核知道“谁能管这个 PCIe 设备”;probe() 是设备被接管时的“初始化现场”;remove() 是设备离开前的“善后现场”。**原创 2026-07-19 23:10:06 · 19 阅读 · 0 评论 -
21天学pcie--PCIe 设备是如何被“发现”的?(枚举机制)
文章摘要: PCIe枚举是系统自动发现和配置PCIe设备的核心机制。Root Complex(RC)从Bus 0出发,通过深度优先搜索(DFS)遍历PCIe树状拓扑,依次扫描Device和Function,读取配置空间(如VendorID判断设备存在性)。关键步骤包括:识别设备类型(Endpoint或Bridge)、递归分配Bus号(Bridge扩展层级)、统一分配BAR地址空间。枚举由硬件/BIOS/UEFI或操作系统(如Linux的pci_scan_bus())执行,结果可通过lspci -tv查看。B原创 2026-07-12 09:51:20 · 25 阅读 · 0 评论 -
21天学pcie--PCIe 的“速度”到底怎么算?(Gen1 ~ Gen5 全解析)
GT/s 是发车频率,编码决定装货效率,Lane 数决定车道数量,三者共同决定 PCIe 带宽。原创 2026-07-10 09:41:41 · 26 阅读 · 0 评论 -
21天学pcie--PCIe 的三种地址空间(核心篇)
*配置空间是 PCIe 设备的“管理地址域”,它不属于内存,也不属于 BAR,只负责“让系统认识并安排设备”。**原创 2026-07-08 11:53:57 · 24 阅读 · 0 评论 -
21天学pcie--Linux 下必备 PCIe 工具(软件篇)
本文详解Linux下PCIe调试工具lspci的核心用法,重点介绍7个必会参数:-s(精确定位)、-v/-vv(信息深度)、-nn(查看VID/DID)、-t(拓扑结构)、-xxx(配置空间原始值)、-k(驱动绑定关系)和-x(快速查看Header)。通过典型排查流程演示如何诊断"设备不工作"问题,并强调lspci是PCIe调试的"第一现场"工具,能显示设备位置、资源和驱动状态。文章还指出lspci的局限性(如无法查看动态行为),并给出工程师实用建议:优先使用lspc原创 2026-07-09 06:15:00 · 128 阅读 · 0 评论 -
《零基础学GPU KMD》专栏简介
什么是GPU KMD?——角色、定位与核心价值驱动的分层模型:用户态驱动(UMD)vs 内核态驱动(KMD)GPU KMD的典型职责:硬件抽象、资源管理、任务调度、安全隔离GPU硬件架构速览——理解KMD需要知道的硬件基础核心组件:计算单元(SM/CU)、内存子系统(显存/缓存)、命令处理器(CP)硬件接口:寄存器映射、MMIO空间、中断机制、DMA通道主流OS的GPU驱动模型概览Windows:WDM → WDDM → DXGK(显示类/计算类驱动模型差异)原创 2026-05-10 14:43:18 · 96 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发-4.1 BootROM 到 Secondary Bootloader 的跳转逻辑
本文详细解析了NPU从BootROM到Secondary Bootloader(SBL)的启动跳转逻辑。主要内容包括:1)NPU三阶段启动流程(BootROM→SBL→主固件);2)BootROM的核心功能(启动模式检测、硬件初始化、SBL加载);3)关键的跳转过程(上下文准备、指令执行);4)安全启动机制(信任根、签名验证);5)调试常见问题(栈指针错误、时钟同步等)。文章通过伪代码示例展示了BootROM的验证和跳转逻辑,并探讨了XIP执行、冗余备份等扩展问题,为理解NPU底层启动机制提供了系统性的技术原创 2026-04-07 07:30:00 · 39 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--12.2 大模型端侧部署挑战:量化/剪枝/蒸馏
摘要: 2026年大模型端侧部署面临算力与模型规模的核心矛盾,需通过量化、剪枝、蒸馏三大技术协同优化。量化(如AWQ)实现权重INT4/激活INT8压缩,模型体积缩减75%;剪枝通过结构化移除冗余参数,提升推理速度40%;蒸馏将70B模型能力迁移至3B小模型。三者结合(如1.5GB模型在RK3588上达25 tokens/s)成为主流方案,但仍需解决长上下文误差累积、多模态对齐等挑战。未来动态重校准、MoE架构优化及端云协同将是关键方向。原创 2026-04-06 12:57:18 · 182 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--10.3 厂商文档缺失时的逆向工程技巧
《逆向工程破解硬件黑盒的实战指南》 当面对国产NPU、定制ASIC等缺乏文档的硬件时,逆向工程成为关键突破口。本文系统化介绍:1)信息收集技巧,通过分析驱动二进制、内核日志提取线索;2)动态追踪技术,利用strace、LD_PRELOAD等工具捕获运行时行为;3)比特翻转实验,通过控制变量法推导寄存器位域和指令编码;4)流量重放方法,复现官方驱动操作序列。文章特别强调法律边界,建议在合规前提下进行逆向,仅分享推导成果而非原始二进制。最终通过实战案例展示如何仅用200行代码替代闭源驱动,并展望AI辅助逆向等前原创 2026-04-05 09:00:00 · 53 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--9.4 实验:在电池供电设备上实现 72 小时持续推理
摘要:实验通过在电池供电设备上实施三级优化策略,实现72小时持续推理能力。首先通过模型量化、稀疏化和分辨率自适应将单次推理功耗降低30%;其次采用动态调频和温控策略减少20%能耗;最终通过事件驱动架构将系统占空比降至1.5%,使平均功耗从2.9W降至0.24W。关键创新包括NPU深度休眠管理、MCU触发唤醒机制和电源尖峰控制,在保证95%召回率的同时,使5000mAh电池设备达到72+小时续航。实验揭示了低功耗设计中算法优化与硬件特性的协同重要性。原创 2026-04-05 00:07:29 · 36 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--10.4 实验:将华为固件模块迁移至算能平台
摘要:本文详细介绍了将华为Ascend310平台的固件模块迁移至算能BM1684X平台的实验过程。通过架构对比分析,采用TPU-MLIR工具链重写算子,利用HAL层实现无缝集成。实验成功实现了功能迁移,精度误差小于1%,性能提升5%。重点解决了算子不支持、SRAM溢出等问题,验证了MLIR在跨平台迁移中的优势,为异构计算环境下的韧性系统建设提供了实践参考。原创 2026-04-06 07:15:00 · 175 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--第 11 章:综合项目:智能视频分析终端11.1 需求分析:多路视频流实时目标检测
我们将深入代码细节,展示如何利用 C++ 多线程、条件变量和无锁队列,构建一个能够跑满 NPU 算力的视频分析引擎,并解决“木桶效应”带来的性能瓶颈。随着“智慧城市”和“工业 4.0”的推进,传统的单路摄像头 + 云端分析模式已无法满足低延迟、高带宽隐私保护和低成本部署的需求。,能够直接接入多路高清摄像头,在本地实时完成目标检测、跟踪和报警,仅将结构化结果上传云端。:为了教学和实践的通用性,本项目主体代码将基于。根据第 10 章的跨平台理念,本项目将设计为。为了满足上述需求,我们将采用经典的。原创 2026-04-04 23:44:50 · 34 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--11.2 系统架构:固件 + 驱动 + 应用层协同设计
在 11.1 节中,我们定义了“多路视频流实时目标检测”的严苛指标(8 路 1080P@30fps,延迟<200ms)。传统的“应用层调用库 -> 驱动层执行 -> 硬件响应”的线性模型会导致严重的上下文切换开销和内存拷贝瓶颈。固件运行在 NPU 内部的 RISC-V 或专用微控制器上,负责解析主机下发的指令并调度计算单元。为了支撑高吞吐低延迟,我们将系统划分为三个紧密耦合的层次,数据流在其中单向高速流动。在多设备(CPU, GPU, NPU, VPU)共享内存时,缓存一致性是最大陷阱。原创 2026-04-04 16:53:23 · 55 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--12.3 如何参与 Linux 内核 NPU 子系统开发
从修复一个简单的文档拼写错误开始,或者为现有的开源 NPU 驱动(如 Sophgo, StarFive, Etinix 等厂商已上游化的驱动)添加一个缺失的 IOCTL 支持或优化一个算子,都是伟大的第一步。在 2026 年的 Linux Kernel (v6.12+) 中,NPU 驱动不再是孤立的字符设备,而是深度集成在 DRM 和 DMA-BUF 生态中,实现了与 GPU 类似的资源管理和调度能力。内核驱动必须提供清晰的 UAPI (User API),通常定义在。Step 4: 合并 (Merge)原创 2026-04-04 13:28:04 · 66 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--4.2 安全启动链:数字签名验证与可信执行环境(TEE)
本文深入探讨了NPU安全启动链的数字签名验证与可信执行环境(TEE)技术。首先阐述了从硅片到应用层的信任链架构,重点解析了数字签名验证流程,包括离线签名和运行时验证两个阶段。随后详细介绍了TEE在NPU中的应用,包括其架构设计及硬件支持机制。文章还提供了安全启动验证器的实现示例,并分析了重放攻击等高级威胁的防御策略。最后提出了OTA升级安全等思考问题,为构建安全的NPU系统提供了完整的技术框架。原创 2026-04-04 10:45:00 · 49 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发-4.4 实验:为瑞芯微 NPU 添加自定义签名验证模块
本实验为瑞芯微NPU设计了一个自定义签名验证模块,采用"旁路验证"策略在不修改厂商Bootloader源码的情况下实现安全加固。实验包含四个关键步骤:1)生成RSA密钥对与根信任锚;2)构建带签名的固件包;3)编写基于MbedTLS的C语言验证器;4)测试正常启动和篡改场景。文章还探讨了两种实际集成方案:修改U-Boot SPL或通过TrustZone加载器实现更高安全性。实验成果包括非对称加密应用、完整性校验和故障安全处理机制,并提出了性能优化、密钥轮换和国密支持等进阶挑战。该方案适用原创 2026-03-26 10:04:09 · 44 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发--6.2 任务调度器:优先级队列与超时重试机制
本文介绍了NPU固件中的任务调度器设计,重点解决高并发混合负载下的任务优先级调度和超时重试问题。调度器采用多级反馈队列(MLFQ)结构,通过静态内存池管理任务控制块(TCB),实现严格优先级调度和任务状态流转。核心算法包括任务提交入队、调度分发、超时检测与重试机制,其中看门狗管理器负责监控任务执行超时并触发重试流程。文章还探讨了硬件抽象层(HAL)交互、高级优化策略(如防饥饿机制、零拷贝切换和动态超时调整),并通过Python模拟验证调度逻辑。思考题讨论了上下文切换开销、多核调度负载均衡和QoS公平性等问题原创 2026-03-26 09:30:00 · 35 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发-6.1 模型加载器:ONNX/TensorFlow 模型解析与内存映射
摘要:本文深入探讨NPU固件中的模型加载器设计,重点解析ONNX/TensorFlow等模型的加载流程。通过固件侧的零拷贝解析、内存规划与DMA加载等关键技术,实现高效模型加载。文章详细介绍了模型文件格式解析策略、内存层级规划方法以及DMA引擎优化技术,并针对大模型加载、内存碎片化等挑战提出解决方案。最后通过Python实例演示了ONNX权重提取过程,为NPU软硬件协同设计提供实践参考。原创 2026-03-25 12:14:40 · 35 阅读 · 0 评论 -
21天学会基于 Linux 的 NPU 固件开发-3.1 典型 NPU 指令集分析(矩阵运算/激活函数/数据搬运)
摘要:本文深入剖析了NPU指令集的设计原理与实现机制。首先阐述了DSA(领域专用架构)的设计哲学,重点分析了三大核心指令类别:矩阵运算指令(如MATMUL、CONV2D)、激活函数指令(如RELU、SIGMOID)和数据搬运指令(如DMA_LOAD)。通过伪代码示例展示了指令级优化策略,包括双缓冲机制和算子融合技术。文章对比了主流NPU架构的特性差异,并探讨了固件开发者面临的实际挑战与解决方案。最后提出关于动态Shape支持、稀疏化加速和能效比权衡的思考题,为后续研究NPU任务调度机制奠定基础。原创 2026-03-24 11:56:15 · 72 阅读 · 0 评论
分享