<?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.csdn.net/shenjunpeng</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; shenjunpeng]]></copyright><item><title><![CDATA[第六章 BO 的共享：6.4 dma-buf 中静态导入方实现]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/169351397</link><guid>https://blog.csdn.net/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.csdn.net/shenjunpeng/article/details/169350857</link><guid>https://blog.csdn.net/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.csdn.net/shenjunpeng/article/details/169148890</link><guid>https://blog.csdn.net/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：从 BO 需求到 GEM 框架，再到 shmem]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168243690</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168243690</guid><author>shenjunpeng</author><pubDate>Mon, 26 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[在 UMA 设备上，大量 BO 需共享系统内存且频繁闲置，传统 DMA-CMA 一次性分配固定内存代价过高。GEM 采用 shmem 文件作为通用后备：其内容由文件管理，支持按需分配、可换出、可丢弃，天然满足回收需求；通过 helper 补充 pin、地址映射、缓存一致性等设备访问要求，实现高效内存管理。相比 CMA（固定分配）或私有分配（无法换出），shmem 结合 helper 提供了灵活、可回收的最优解，成为 UMA 驱动的标准选择。]]></description><category></category></item><item><title><![CDATA[第二章 DRM 框架的文件模型： 2.6 DRM 设备的驱动集成]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168029380</link><guid>https://blog.csdn.net/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.3.1 对象与创建：只有文件，没有页]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/166735809</link><guid>https://blog.csdn.net/shenjunpeng/article/details/166735809</guid><author>shenjunpeng</author><pubDate>Mon, 26 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文论证了采用shmem文件作为后备的合理性：内容存于文件，helper按需获取页并使用后归还。drm_gem_shmem_create()创建对象时，仅建立shmem文件，不分配物理页。核心结构drm_gem_shmem_object管理页状态、映射与回收。初始化过程中，通过drm_gem_object_init创建文件，设置伪偏移与gfp掩码，确保后续页可按需分配，实现高效内存管理。]]></description><category></category></item><item><title><![CDATA[第二章 DRM 框架的文件模型：2.5 框架 ioctl 与访问控制]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168774577</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168774577</guid><author>shenjunpeng</author><pubDate>Fri, 23 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文系统梳理了DRM框架中drm_driver、drm_device与drm_file三者关系，通过框架ioctl分析其权限控制机制。核心关系包括：驱动识别（VERSION等）、设备能力协商（GET_CAP/SET_CLIENT_CAP）、master仲裁（SET_MASTER/AUTH_MAGIC）及文件标识（SET_CLIENT_NAME）。访问控制分两层：VFS权限决定能否打开节点，DRM层则依据节点类型与认证状态（如DRM_AUTH、DRM_MASTER）进行细粒度权限检查。]]></description><category></category></item><item><title><![CDATA[HIP hip::Stream 对象：功能与底层实现]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168762268</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168762268</guid><author>shenjunpeng</author><pubDate>Fri, 23 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[hip::Stream 是 HIP 运行时中命令流的核心实现，继承自 amd::HostQueue，底层对应 ROCclr 命令队列。它以 FIFO 顺序执行 GPU 指令，支持多流并发。通过 hipStreamCreate 创建，生命周期由引用计数管理，不可直接析构。支持优先级、CU 掩码等属性，提供默认流（null stream）、每线程流等特殊语义。通过 finish() 实现同步，支持流捕获（Graph Capture）功能，将命令序列录制为可重用图。]]></description><category></category></item><item><title><![CDATA[第三章：GEM分析 3.4 GPU 视图：从 GPU 寻址硬件的演进看 gem_object 被 GPU 访问]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168452800</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168452800</guid><author>shenjunpeng</author><pubDate>Thu, 22 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文梳理GPU寻址硬件演进的四代模型：第一代物理直连（需连续内存，无隔离）；第二代全局GART与重定位（内核统一分配地址，提交时回填）；第三代每进程GPU VM（用户态分配VA，绑定后生效，支持多映射反向索引）；第四代统一寻址与可恢复缺页（GPU直接使用CPU页表，缺页时动态映射，支持SVM）。各代模型分别对应“谁分配地址、何时生效、如何驻留”三大核心问题的不同解法，推动DRM中drm_mm、Relocation、dma_resv、drm_gpuvm及SVM等机制演进。]]></description><category></category></item><item><title><![CDATA[3.5 设备间视图：dma_buf、import_attach 与 resv]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168446901</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168446901</guid><author>shenjunpeng</author><pubDate>Thu, 22 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文概述 GEM 中设备间视图的共享机制，核心是通过 dma-buf 实现跨驱动内存共享。对象导出时生成唯一的 dma_buf 作为共享凭证，导入方通过 import_attach 和 resv 实现访问同步与资源管理。dma_buf 将存储与文件分离，支持跨设备、跨进程传递，并通过 PRIME ioctl 在 handle 与 fd 间转换。三类视图（CPU、GPU、设备间）共用同一对象身份，导入后可重建本地视图，实现无缝访问。]]></description><category></category></item><item><title><![CDATA[3.3.2 动手验证：从用户态观察 CPU 视图]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168022983</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168022983</guid><author>shenjunpeng</author><pubDate>Wed, 21 Oct 2026 19:40:45 +0800</pubDate><description><![CDATA[本文通过一个不到100行的用户态程序，基于DRM通用ioctl（dumb buffer与GEM_CLOSE），在真实设备上逐项验证了伪偏移分配、mmap反查对象、权限控制、映射生命周期等核心机制。实验结果与理论完全一致：偏移恒定且位于4 GiB以上窗口；映射偏移即文件内偏移；长度与偏移必须匹配；权限按drm_file而非进程隔离；关闭handle后旧映射仍有效，但新映射失败；最后释放后区间消失。程序兼容任意支持dumb buffer的设备，无需依赖具体驱动，直观印证了GEM内存管理的关键设计原则。]]></description><category></category></item><item><title><![CDATA[Linux 地址空间与 mremap：从页表、VMA 到 MREMAP_DONTUNMAP]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168024734</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168024734</guid><author>shenjunpeng</author><pubDate>Wed, 21 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文从页表与VMA的分工出发，构建地址空间三层模型，揭示mremap的本质：其行为取决于缺页机制、物理页来源及VMA合并规则。核心结论包括：共享映射（B/C）可多VA共用同一物理页；私有映射（A/D）仅在COW前共享；VMA合并需满足VA与文件偏移连续性；THP要求连续且属性一致的VMA。这些机制共同决定mremap是否复制数据、新旧地址是否一致、性能开销及内核拒绝场景。]]></description><category></category></item><item><title><![CDATA[第 12 篇 dma-mapping 的分层架构：从映射接口到 dma_map_ops]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/167700059</link><guid>https://blog.csdn.net/shenjunpeng/article/details/167700059</guid><author>shenjunpeng</author><pubDate>Wed, 21 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文解析 DMA 映射调用的分发机制，揭示其从驱动接口到后端实现的三层结构：接口层统一参数形式，分发层依据 dev->dma_iommu、get_dma_ops() 及 dma_ops_bypass 等条件选择后端，后端则执行物理地址到 DMA 地址的转换。当前内核中，dma_map_ops 仅用于虚拟化或旧平台等特殊场景，IOMMU 路径已直接由标志控制，提升效率。分发依据在设备初始化阶段（如 IOMMU 探测、dma_set_mask()）建立，确保映射时路径稳定。]]></description><category></category></item><item><title><![CDATA[第三章：GEM分析 3.3.1 drm_vma_offset_manager：偏移窗口与访问控制]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168030390</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168030390</guid><author>shenjunpeng</author><pubDate>Tue, 20 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文剖析 drm_vma_offset_manager 组件，其核心为偏移分配与访问控制两大职责。通过“二三四”框架：两个职责、三个结构（manager/node/file）、四组接口（窗口/区间/查找/访问控制），详解其在 DRM 驱动中如何管理用户态 mmap 偏移。依托 drm_mm 实现页级区间分配，以红黑树维护文件访问权限，支持幂等操作与对象生命周期管理，确保映射安全与高效。]]></description><category></category></item><item><title><![CDATA[第 11 篇 DMA 掩码与寻址能力协商：dma_set_mask 与 SWIOTLB]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/167699895</link><guid>https://blog.csdn.net/shenjunpeng/article/details/167699895</guid><author>shenjunpeng</author><pubDate>Tue, 20 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[驱动需声明DMA掩码以告知内核设备的寻址能力，内核据此判断能否满足映射需求。掩码过窄导致内存分配受限于低地址区，引发资源竞争与性能下降；过宽则可能因硬件不支持而失败。掩码影响直接映射（触发SWIOTLB中转）、一致性分配（限制区域）及IOMMU路径（限制IOVA范围）。SWIOTLB在地址超出时进行数据复制，虽保证正确性，但带来额外开销。正确声明掩码可避免不必要的中转，提升系统吞吐。]]></description><category></category></item><item><title><![CDATA[第三章 GEM 用户态接口：3.6 设备间视图与同步]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168223365</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168223365</guid><author>shenjunpeng</author><pubDate>Mon, 19 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文介绍 DRM 驱动中 BO 在跨设备共享时的机制。通过 dma-buf 实现导出方与导入方的协作：导出方将对象封装为 dma-buf 文件描述符，导入方通过 attach 与 map 获取设备可访问的 DMA 地址，并建立本地 GEM 对象。共享后，双方共用同一 dma_resv 实现跨设备同步，确保访问顺序正确。该机制支持跨进程、跨驱动的高效数据共享，且与 CPU/GPU 视图无缝衔接，实现统一的对象管理与访问。]]></description><category></category></item><item><title><![CDATA[第 10 篇 Scatter-Gather 与 sg_table：分散内存的统一映射]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/167699713</link><guid>https://blog.csdn.net/shenjunpeng/article/details/167699713</guid><author>shenjunpeng</author><pubDate>Mon, 19 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[物理分散的内存可通过 scatterlist 描述为多个连续片段，dma_map_sg() 在映射时根据 IOMMU 或物理连续性合并相邻段，减少 DMA 段数。它填充 dma_address 与 dma_length，实现设备访问的连续视图。驱动使用 sg_dma_address() 和 sg_dma_len() 获取映射后地址，nents 表示实际映射段数，可能小于原始条目数。该接口统一处理分段与地址翻译，提升性能并支持大块传输。]]></description><category></category></item><item><title><![CDATA[第三章 GEM 用户态接口：3.2 GEM 的用户态接口]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/167585420</link><guid>https://blog.csdn.net/shenjunpeng/article/details/167585420</guid><author>shenjunpeng</author><pubDate>Mon, 19 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[本文阐述了用户态通过 DRM 接口管理缓冲对象（BO）的完整生命周期：从创建（如 DRM_IOCTL_MODE_CREATE_DUMB）、CPU 访问（DRM_IOCTL_MODE_MAP_DUMB + mmap）、GPU 访问（驱动私有接口）、共享（DRM_IOCTL_PRIME_HANDLE_TO_FD/FD_TO_HANDLE），到释放（DRM_IOCTL_GEM_CLOSE）。尽管关闭 handle 仅撤销引用，真正释放由内核根据引用计数决定。]]></description><category></category></item><item><title><![CDATA[第 四 章 轻量后备：4.1 轻量后备存储的定位]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/168325239</link><guid>https://blog.csdn.net/shenjunpeng/article/details/168325239</guid><author>shenjunpeng</author><pubDate>Sun, 18 Oct 2026 11:55:43 +0800</pubDate><description><![CDATA[本章探讨GEM在无显存设备上的轻量级后备存储方案。针对SoC GPU、虚拟GPU等共享系统内存的设备，因无需显存管理，故不适用TTM。根据设备是否支持非连续内存访问，选择DMA helper（连续内存）或shmem helper（离散页）。前者简单但占用连续内存，后者支持换出、通用性强。两者均为辅助库，驱动嵌入即可使用，避免引入冗余机制。章节按从简到繁顺序展开，涵盖对象创建、内存管理与实际应用。]]></description><category></category></item><item><title><![CDATA[4.2 drm_gem_dma_object：基于 CMA 的物理连续后备]]></title><link>https://blog.csdn.net/shenjunpeng/article/details/167584836</link><guid>https://blog.csdn.net/shenjunpeng/article/details/167584836</guid><author>shenjunpeng</author><pubDate>Sun, 18 Oct 2026 05:00:00 +0800</pubDate><description><![CDATA[drm_gem_dma_object 用于支持设备需连续 DMA 地址的场景，如显示控制器。其内存一次性分配并常驻，提供 CPU（vaddr）与设备（dma_addr）访问地址，结构简洁。创建时通过 dma_alloc_wc/dma_alloc_noncoherent 分配连续内存，释放时直接归还。用户态 mmap 一次性建立页表，无需缺页处理；设备访问直接使用 dma_addr，跨设备共享时依赖 IOMMU 保证对端地址连续性。适用于 sun4i、imx 等 SoC 显示驱动。]]></description><category></category></item></channel></rss>