<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[图形/计算GPU的驱动与虚拟化技术分享园地]]></title><description><![CDATA[围绕 AMDGPU，深入剖析GPU计算与虚拟化技术。涵盖内核驱动（KGD/KFD）逻辑、DRM 子系统对接机制、编译调试、性能调优、虚拟化的工程实践方案，为内核开发者、GPU 驱动工程师提供 AMDGPU 驱动的技术落地支撑。]]></description><link>https://blog.youkuaiyun.com/shenjunpeng</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; shenjunpeng]]></copyright><item><title><![CDATA[用户态申请内存 vs 内核态申请内存：对系统内存管理的影响]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/166686920</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/166686920</guid><author>shenjunpeng</author><pubDate>Fri, 06 Nov 2026 07:01:01 +0800</pubDate><description><![CDATA[用户态分配的内存与内核态分配的内存，在等方面有本质区别。厘清这一区别，是理解memfdudmabufuserptr、SVM/HMM、dma-buf、CMA、大页等一系列机制的。本文集中论述二者对系统内存管理的影响，并给出典型用例。]]></description><category></category></item><item><title><![CDATA[第 13 篇 DMA-BUF：跨驱动、跨设备的缓冲区共享]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/170137817</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/170137817</guid><author>shenjunpeng</author><pubDate>Fri, 06 Nov 2026 05:00:00 +0800</pubDate><description><![CDATA[本文解答了相机、GPU、编码器等设备如何实现零拷贝共享内存的问题。通过 dma-buf 机制，导出方创建跨子系统的缓冲区标识，导入方分“attach”与“map”两阶段接入：attach 声明设备并检查访问约束，map 为设备建立独立的 DMA 映射。该设计支持静态与动态导入方，确保存储位置满足所有设备需求，并通过 dma_resv 和 fence 机制保障多设备间访问顺序与 cache 一致性，最终实现高效、安全的跨设备共享。]]></description><category></category></item><item><title><![CDATA[术语与缩略语]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169950840</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169950840</guid><author>shenjunpeng</author><pubDate>Thu, 05 Nov 2026 08:35:26 +0800</pubDate><description><![CDATA[本文包含缩略语与术语两表，缩略语按字母顺序排列，涵盖PCIe、GPU内存管理、命令提交等关键技术；术语表按英文字母排序，解释如缓冲区对象（BO）、命令提交（CS）、DMA地址、IOMMU、GART、GPU调度器等核心概念，并标注书中译法及主要讨论章节，便于查阅。]]></description><category></category></item><item><title><![CDATA[第一章 DRM 子系统概述：1.4命令提交的硬件模型]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/170039500</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/170039500</guid><author>shenjunpeng</author><pubDate>Thu, 05 Nov 2026 08:27:39 +0800</pubDate><description><![CDATA[1.3 节说明了 GPU 在系统中的位置、内存的访问路径与地址翻译。本节说明命令如何从 CPU 到达 GPU 并完成执行。本节只说明硬件提供的机制，不涉及软件以何种方式使用这些机制；内容也不针对特定厂商，各厂商的寄存器与命令包格式不在讨论范围内。]]></description><category></category></item><item><title><![CDATA[第一章 DRM 子系统概述：1.6 本章小结]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169950801</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169950801</guid><author>shenjunpeng</author><pubDate>Wed, 04 Nov 2026 05:00:00 +0800</pubDate><description><![CDATA[本章系统梳理了DRM框架的定位、演进脉络、硬件约束及全书主线。DRM本质是内核中对GPU资源（尤其是显存）的统一管理，历经图形显示、渲染与异构计算三阶段，逐步演化出GEM、TTM、dma-buf、GPU虚拟地址等机制。其设计深受硬件特性影响，如内存连续性、缓存一致性、地址映射与命令异步执行等。全书以“缓冲对象（BO）生命周期”为主线，分数据管理、执行协调与地址空间三个层次展开，贯穿经典与前沿技术。]]></description><category></category></item><item><title><![CDATA[第一章 DRM 子系统概述：1.1 DRM 的组成与定位]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169950513</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169950513</guid><author>shenjunpeng</author><pubDate>Wed, 04 Nov 2026 05:00:00 +0800</pubDate><description><![CDATA[DRM 是 Linux 内核中管理 GPU 资源的统一框架，核心职责已超越显示管理。其由两条主线构成：KMS（负责显示模式与输出）和资源管理（管理显存、调度与同步），二者呈单向依赖关系。KMS 依赖资源管理提供帧缓冲内存，而后者可独立运行于无显示需求的 AI 加速卡。因此，DRM 实质是内核级 GPU 内存与任务管理机制，本书聚焦资源管理部分，以对象生命周期为主线展开。]]></description><category></category></item><item><title><![CDATA[第八章 GPU 调度器：8.1 命令提交的演进]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169948742</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169948742</guid><author>shenjunpeng</author><pubDate>Tue, 03 Nov 2026 17:44:36 +0800</pubDate><description><![CDATA[本文系统阐述了GPU命令提交的四大演进方向：地址确定、BO就位保障、作业同步机制与队列仲裁权转移。从早期内核主导的ioctl提交，逐步发展为用户态直接写入硬件队列，结合虚拟内存、缺页处理与固件调度，实现提交路径简化与性能提升。各方向相互关联，共同推动内核职责向绑定、驱逐、缺页及固件阶段转移，核心约束——内核对内存访问的最终控制力——始终不变。]]></description><category></category></item><item><title><![CDATA[第五章 TTM 后备管理：5.15 本章小结]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169945386</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169945386</guid><author>shenjunpeng</author><pubDate>Tue, 03 Nov 2026 15:58:13 +0800</pubDate><description><![CDATA[本章介绍 TTM（Translation Table Manager）在独立显卡内存管理中的核心作用：解决显存（VRAM）、系统内存与GART间的数据放置、迁移与驱逐问题。TTM 通过 ttm_buffer_object 管理内存域间的布局，结合 ttm_device、ttm_resource_manager 与 ttm_placement 实现灵活分配；支持异步迁移、驱逐及延迟释放，并依赖内核的页池、shrinker、ww_mutex 与 cgroup 等机制保障性能与可靠性。]]></description><category></category></item><item><title><![CDATA[第四章 轻量后备：4.9 shmem 后备 BO 的驱动集成]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/167921447</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/167921447</guid><author>shenjunpeng</author><pubDate>Tue, 03 Nov 2026 11:00:33 +0800</pubDate><description><![CDATA[本文以 virtio-gpu 与 panfrost 为例，阐述 DRM GEM shmem helper 的集成方法。virtio-gpu 通过内嵌 drm_gem_shmem_object 于自定义结构中，并利用 gem_create_object 钩子分配驱动对象，设置专用回调表实现 host 资源管理；多数通用回调由 helper 提供，驱动仅实现硬件相关逻辑。panfrost 则通过 madvise ioctl 维护可回收链表，并在内存紧张时由 shrinker 触发 purge，实现高效内存回收。]]></description><category></category></item><item><title><![CDATA[第四章 轻量后备：4.10 本章小结]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169826478</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169826478</guid><author>shenjunpeng</author><pubDate>Mon, 02 Nov 2026 10:24:57 +0800</pubDate><description><![CDATA[本章探讨无专用显存设备上缓冲对象（BO）的内存来源，提出两种轻量后备：drm_gem_dma_object（DMA-CMA）与drm_gem_shmem_object（shmem）。前者一次性分配连续内存，常驻不回收；后者按需分配页，支持换出与回收，通过三层计数管理状态。二者均以 helper 实现，驱动只需内嵌对象并注册回调。后续章节将展开 shmem 与页回收、dma-buf 导入导出、同步机制及有 VRAM 情况下的 TTM 设计。]]></description><category></category></item><item><title><![CDATA[第九章 GPU 虚拟地址空间管理：9.9 本章小结]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169825613</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169825613</guid><author>shenjunpeng</author><pubDate>Mon, 02 Nov 2026 10:18:16 +0800</pubDate><description><![CDATA[本章探讨GPU虚拟地址的管理机制，梳理了从提交时定址到VM_BIND的演进路径，强调地址分配权下放至用户态、映射提前至绑定阶段。drm_gpuvm承担区间簿记、对象关联、加锁驻留等职责，驱动负责页表与TLB管理及异步绑定。核心约束为信号路径不可分配内存或等待锁，通过预分配与分阶段执行保障安全。机制与CPU mm趋同但受硬件限制，如缺页不可恢复、依赖fence同步。后续将延伸至固件调度与共享虚拟内存场景。]]></description><category></category></item><item><title><![CDATA[第四章 轻量后备：4.5 取页、引用与对象状态]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/168662060</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/168662060</guid><author>shenjunpeng</author><pubDate>Sun, 01 Nov 2026 05:00:00 +0800</pubDate><description><![CDATA[shmem对象创建后仅生成文件，页需通过get_pages从page cache中按需加载，并在put_pages时归还。操作依赖dma_resv锁，确保并发安全。页的持有分为弱引用（use）与强引用（pin），pin防止页被回收，用于内核直接访问或跨设备共享场景。三重计数（use、pin、vmap）逐层依赖，共同管理页的生命周期与状态，支撑CPU、GPU及用户态访问。]]></description><category></category></item><item><title><![CDATA[第二章 DRM 框架概述： 2.7 本章小结]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/168774753</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/168774753</guid><author>shenjunpeng</author><pubDate>Thu, 29 Oct 2026 16:48:53 +0800</pubDate><description><![CDATA[render 节点是无特权的渲染与计算入口，本书讨论的操作都经它进入内核。设备、客户端与入口都已就位，ioctl 操作的缓冲区还是一个黑盒。字符设备的三层角色，即驱动、设备实例与一次打开，在 DRM 中对应。是每次打开一份的客户端上下文，handle、同步对象与驱动私有状态都以它为单位隔离和回收。是每个设备实例一份的运行时状态，决定建立哪些节点，并让同一设备的所有文件共享一个。下列问题沿本章用到的机制向相邻子系统延伸，每题附一个研究入口，供读者自行追踪。：一个驱动管理多个设备，一个设备可被多次打开。]]></description><category></category></item><item><title><![CDATA[第一章 DRM 子系统概述：1.3 GPU 访存的硬件模型]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169459158</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169459158</guid><author>shenjunpeng</author><pubDate>Thu, 29 Oct 2026 16:30:02 +0800</pubDate><description><![CDATA[本文从硬件角度阐述GPU在系统中的位置及其内存访问机制，涵盖独立GPU、集成GPU与嵌入式SoC三种形态的系统拓扑。重点分析CPU与GPU跨PCIe访问对方内存的流程，包括显存BAR访问路径、地址翻译（GPU MMU与IOMMU两级映射）、缓存一致性问题及命令执行模型。指出CPU访问VRAM读慢写快、窗口受限，且主机访问不经过引擎缓存；GPU访问系统内存需经双重翻译，存在延迟与一致性挑战。强调硬件架构对内存管理与调度设计的根本性影响。]]></description><category></category></item><item><title><![CDATA[第六章 BO 的共享：6.4 dma-buf 中静态导入方实现]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169351397</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169351397</guid><author>shenjunpeng</author><pubDate>Wed, 28 Oct 2026 13:51:08 +0800</pubDate><description><![CDATA[本文系统阐述了dma-buf机制中导入方从fd获取buffer并完成DMA映射的全过程。核心流程为：dma_buf_get通过文件描述符反查内核dma_buf对象，确保类型安全与引用持有；attach建立设备与buffer的连接，协商P2P能力并登记至dmabuf->attachments链表；map调用导出方map_dma_buf回调，生成设备可直接寻址的sg_table，实现地址翻译。静态与动态导入方在映射策略、迁移支持及失效处理上存在差异，通过unmap与detach按逆序释放资源，保障内存一致性。]]></description><category></category></item><item><title><![CDATA[第六章 BO 的共享：6.3 dma-buf 中的导出方实现]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169350857</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169350857</guid><author>shenjunpeng</author><pubDate>Wed, 28 Oct 2026 11:49:27 +0800</pubDate><description><![CDATA[本文详解 dma-buf 机制中私有缓冲区（BO）跨进程共享的实现流程：导出方需提供 buffer 对象与 dma_buf_ops 回调表，内核通过 dma_buf_export() 完成 fd 封装、引用计数管理及 resv 初始化。核心在于 dma_buf_export_info 提供元信息，dma_buf_getfile 创建独立伪文件以支持跨进程传递，resv 可由导出方提供或由 core 内建，确保同步一致性。释放时通过 release 回调销毁资源，实现安全回收。]]></description><category></category></item><item><title><![CDATA[第 4 章 内存管理：4.1 memory 的 alloc 和 free]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/169148890</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/169148890</guid><author>shenjunpeng</author><pubDate>Tue, 27 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文以 hsaKmtAllocMemoryAlignCtx 为主线，剖析 libhsakmt 内存分配的分层架构与决策逻辑。通过接口层校验与 HsaMemFlags 分派，请求被导向 host（系统内存）、device（显存）或 scratch 三路径；管理层依据 APU/dGPU、是否换页等条件选择 aperture 与物理后备来源；收敛层统一预留虚拟地址并调用 KFD ioctl 创建 BO。最终，分配落点分为 GPU 显存、GTT 可访问内存或 scratch 基址，体现对异构内存模型的精细支持。]]></description><category></category></item><item><title><![CDATA[第四章 轻量后备：4.3 shmem 文件后备存储]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/168243690</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/168243690</guid><author>shenjunpeng</author><pubDate>Mon, 26 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[无显存设备的缓冲对象（BO）依赖shmem文件作为通用后备，其页由内核页缓存管理，支持按需分配、换出与丢弃。尽管shmem文件天然满足内容持久性与内存共享，但缺乏设备访问所需的页固定、地址可达与缓存一致性保障。为此，需通过GFP掩码调整、标记不可回收、构建sg_table及特殊映射等补充机制。相较连续内存、用户态匿名内存等方案，shmem在回收能力上更具优势。为减少驱动重复实现，内核引入drm_gem_shmem_helper，封装取页、映射、回收等通用操作，统一管理基于shmem的BO生命周期。]]></description><category></category></item><item><title><![CDATA[第二章 DRM 框架的文件模型： 2.6 DRM 设备的驱动集成]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/168029380</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/168029380</guid><author>shenjunpeng</author><pubDate>Mon, 26 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文系统阐述了DRM驱动接入框架的完整流程，重点围绕drm_driver、drm_device与drm_file三类核心对象的定义与实现。驱动需提供私有ioctl接口、设备操作表及资源管理回调，通过静态描述表与注册机制完成与DRM核心的集成。以amdgpu为例，展示了基于PCI设备的实例分配、注册及电源/作业管理的定制化实现，体现了核心与驱动在设备节点创建、请求分派、客户端生命周期管理中的分工协作。]]></description><category></category></item><item><title><![CDATA[第四章 轻量后备：4.4 shmem 对象的结构与创建]]></title><link>https://blog.youkuaiyun.com/shenjunpeng/article/details/166735809</link><guid>https://blog.youkuaiyun.com/shenjunpeng/article/details/166735809</guid><author>shenjunpeng</author><pubDate>Mon, 26 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文阐述了drm_gem_shmem_helper中采用shmem文件作为后备存储的合理性：通过按需获取页并支持归还，实现高效内存管理。核心数据结构drm_gem_shmem_object包含内嵌的GEM对象、页状态字段及映射信息。创建过程分为分配与初始化两步，由drm_gem_shmem_create()触发，先建立GEM对象与shmem文件（基于tmpfs），再设置页分配策略（gfp_mask），确保后续页分配符合设备需求。初始化时仅建立容器，物理页延迟分配，提升灵活性与性能。]]></description><category></category></item></channel></rss>