第三章:GEM分析:3.2.1 gem_object 生命周期与使用流程(动态使用视角)

发布时间:2026/8/13 10:01:09

第三章:GEM分析:3.2.1 gem_object 生命周期与使用流程(动态使用视角)
gem_object 讲对象是什么字段与结构本文以时间线为主轴把一个drm_gem_object从诞生到销毁的完整流程串起来并在每个阶段指出涉及哪些字段和哪些回调。1. 全景一个对象的一生① 创建分配 init② 暴露handle③ CPU 使用mmap④ GPU 使用VA 映射 / 提交⑤ 共享flink / dma-buf⑥ 回收压力evict / swap⑦ 销毁handle 关闭 → refcount 归零 → free贯穿全程的一条主线是 gem_object 强调的双计数refcountkref——控制对象的物理生命周期归零即freehandle_count——追踪用户态引用归零时清理 flink 名与 dma-buf 关联但不一定销毁对象。一句话记住二者关系handle 是用户态的门票refcount 是对象的生死簿。门票全退了对象未必死内核态可能还持票。当然并不是所有的对象都会走完整个生命周期例如一个对象只在内核里使用那么它就不需要暴露给用户态因此只有创建和销毁两个流程。2. 阶段①创建分配 初始化用户态通过驱动特定的 ioctl如AMDGPU_GEM_CREATE、DRM_IOCTL_MODE_CREATE_DUMB请求分配。内核侧分两步分配内存驱动kzalloc自己的对象如amdgpu_bo其中内嵌drm_gem_object见 gem_object 的驱动扩展。初始化 core 部分二选一初始化函数后端对应字段drm_gem_object_init()shmem-backed由 shmfs 提供可换出的匿名页filp ! NULLdrm_gem_private_object_init()private驱动自管存储VRAM / CMA / TTM BOfilp NULL初始化会设置dev、size此后不可变、内置_resv同步对象并把funcs指针挂上驱动的回调表。此时refcount 1但还没有 handle——对象只存在于内核。涉及回调本阶段不触发funcs里的任何回调回调表只是被挂载等后续操作时才被调用。3. 阶段②暴露给用户态handle 分配对象要被用户态使用必须换成一个handle进程内的 32 位整数。核心函数drm_gem_handle_create_tail()做三件事在该drm_file的 IDR 中分配 handlehandle_count、refcounthandle 也是一份引用调用funcs-open(obj, file)若实现。驱动回调DRM core用户态驱动回调DRM core用户态CREATE ioctl分配对象 initrefcount1handle_create → handle_count, refcountfuncs-open(obj, file)返回 handle关键点open绑定的是handle 而非对象。同一对象被多个进程 open例如经 flink/dma-buf 再GEM_OPEN就会多次触发open。amdgpu 常在此建立该drm_file的 VM × 本 BO的记账关系。涉及字段handle_count、refcount涉及回调gem_object_funcs 的open。4. 阶段③CPU 使用mmap用户态要用 CPU 读写对象内容时走 mmap。GEM 用伪偏移fake offset把mmap 一个文件的某偏移转译为映射某个 GEM 对象先DRM_IOCTL_MODE_MAP_DUMB之类拿到对象在drm_vma_offset_manager中的偏移记录在vma_node见 gem_object 2.3 和 gem设计目标 3.3mmap(drm_fd, offset)→ core 的drm_gem_mmap()按 offset 反查到对象drm_gem_mmap_obj()若实现了funcs-mmap就调它建立 VMA否则用funcs-vm_ops其fault处理缺页、按需填页。有无mmap(drm_fd, fake_offset)drm_vma_offset_manager 反查定位 drm_gem_objectfuncs-mmap ?funcs-mmap 自行建 VMA默认路径用 funcs-vm_ops访问触发 fault → 按需填页涉及字段vma_node、filpshmem 缺页从 shmfs 取页涉及回调mmap与vm_ops二者互斥见 gem_object_funcs 3.3。关于gem_ojbectmmap的详细分析请参见 用户态访问 BO 的 CPU VA的 fake offset 机制全流程解析。5. 阶段④GPU 使用地址映射与提交让 GPU 访问对象是整条演进线的核心它有新旧两种范式详见专门文档旧模型提交时带 BO-list relocation内核在提交时临时决定地址——见 gem_object 如何被 GPU 访问上。新模型VM_BIND6.6用户态显式建立持久 GPU VA 映射由drm_gpuvm/drm_gpuva框架管理对象里的gpuva字段是这些映射的反向索引——见 GEM分析gem_object 如何被 GPU 访问下与 gpuva。无论哪种范式提交执行都要挂 fence 到对象的dma_resvresv/_resv字段以保证同步——GPU 还在用时回收/迁移必须等待。涉及字段resv/_resv同步、gpuva6.6 反向索引本阶段不直接对应某个funcs回调但会与阶段⑥的evict相互作用evict 时需让指向本对象的 GPU VA 映射失效。6. 阶段⑤共享flink 与 dma-buf对象可被跨进程或跨设备共享两条路径对比见 gem设计目标 3.5路径机制相关字段 / 回调flink全局名nameGEM_FLINK分配、GEM_OPEN取回 handle不安全遗留 X11 用name字段PRIME / dma-bufPRIME_HANDLE_TO_FD导出为 dma-buf跨设备安全共享dma_buf/import_attach字段export/pin/unpin/get_sg_table/vmap回调dma-buf 被导入方 attach时core 会dma_resv_lock后调funcs-pin钉住后端存储——这是共享抑制迁移的根源见 gem_object_funcs 3.2 的时序图。注意引用循环对象导出为 dma-buf 后dma_buf与对象互相持引用core 在最后一个 handle 释放时打破这个循环见 [gem_object](https://blog.csdn.net/shenjunpeng/article/details/160797999。7. 阶段⑥回收压力evict 与 swap内存紧张时对象后端可能被换出evictdrm_gem_object_evict()在已持obj-resv的前提下调funcs-evict把后端从 VRAM 搬到系统内存或释放可重建页。GEM core 不做迁移策略只在合适时机通知驱动迁移实作通常借 TTM见 gem设计目标 第 6 节。swapshmem-backed 对象filp ! NULL的匿名页可被内核页回收换出——这是可被 swap不等于VRAM↔RAM 迁移。与 gpuva 联动evict 后指向本对象的所有 GPU VA 映射都要drm_gpuva_invalidate()驱动遍历gpuva.list见 gem_object_gpuva。涉及回调evict进入时已持 resv实现内不得重复加锁见 gem_object_funcs 第 4 节。8. 阶段⑦销毁handle 关闭 → refcount 归零 → free销毁是双计数协同的终点必须分清两个关闭驱动回调DRM core用户态驱动回调DRM core用户态handle_count0 → 清理 flink name、断开 dma_buf 关联对象存活等最后一个引用释放alt[refcount 归零][仍有内核态引用]GEM_CLOSE / 进程退出funcs-close(obj, file) (每个 handle 一次)handle_count--refcount--funcs-free(obj) (唯一必需回调析构)drm_gem_object_release() 清理 core 部分关 handledrm_gem_object_release_handle()调funcs-closehandle_count--。归零时清理 flink 名与 dma-buf 关联但对象未必死。refcount 归零这才触发funcs-free唯一必需回调驱动释放后端、drm_gem_object_release()清 core、kfree自身。最常见误解以为关了 handle 对象就没了。只要还有 mmap 映射、dma-buf 导出或内核内部引用close之后对象不会free见 gem_object_funcs 3.1 的误区提示。9. 字段 × 回调 × 阶段一张对照表阶段主要字段触发的回调深入文档① 创建dev/size/filp/_resv/funcs无gem_object② 暴露handle_count/refcountopengem_object_funcs 3.1③ CPU mmapvma_node/filpmmap/vm_opsgem_object_funcs 3.3④ GPU 使用resv/gpuva与 evict 联动⑤ 共享name/dma_buf/import_attachexport/pin/unpin/get_sg_table/vmapgem_object_funcs 3.2⑥ 回收filp/resv/gpuvaevictgem_object_funcs 3.4⑦ 销毁handle_count/refcount/name/dma_bufclose→freegem_object_funcs 3.110. 小结一个 GEM 对象的一生 创建 → 暴露(handle) → 使用(CPU/GPU) → 共享 → 回收 → 销毁全程由双计数refcount生死簿 /handle_count门票驱动。每个阶段都在用某些字段并触发某些回调本文的对照表就是 gem_object字段与 gem_object_funcs回调之间的索引。记住三条易错点handle 归零 ≠ 对象销毁共享(pin) 会抑制迁移可被 swap ≠ 支持 VRAM 迁移。

相关新闻

P1580 yyy loves Easter_Egg I【洛谷算法习题】

P1580 yyy loves Easter_Egg I【洛谷算法习题】

2026/8/13 10:01:09

P1580 yyy loves Easter_Egg I 网页链接 P1580 yyy loves Easter_Egg I 题目背景 Soha 的出题效率着实让人大吃一惊。OI,数学,化学的题目都出好了,物理的题还没有一道。于是,Huntfire,absi2011,redbag…

K3s单节点K8S集群部署指南与优化实践

K3s单节点K8S集群部署指南与优化实践

2026/8/13 10:01:09

1. K3s单节点K8S集群部署概述 K3s作为轻量级Kubernetes发行版,已经成为开发者本地测试和小型生产环境的首选方案。相比标准K8S动辄需要多台服务器的资源消耗,K3s单节点方案仅需1台2核4G配置的机器即可运行完整集群功能。我在2026年3月最新测试中验证&…

VulkanSceneGraph学习教程(十)

VulkanSceneGraph学习教程(十)

2026/8/13 10:01:09

第 10 章 描述符与资源绑定摘要:本章系统讲解了 Vulkan 场景图(VSG)中描述符(Descriptor)与资源绑定的核心机制。内容涵盖从概念(Descriptor → DescriptorSet → BindDescriptorSet)到实践&am…

大模型推理显存优化:KV Cache原理、计算与vLLM部署实践

大模型推理显存优化:KV Cache原理、计算与vLLM部署实践

2026/8/13 11:11:12

1. 从一次显存“爆仓”说起:KV Cache的显存账单那天下午,我正在本地调试一个基于Qwen-7B的长文档摘要任务。文档大约有8000个token,我信心满满地启动了推理服务,心想7B模型对一张24G显存的消费级显卡来说应该绰绰有余。然而&#…

一招重置Windows更新组件:Reset Windows Update Tool让我摆脱0x80070002报错的纠缠

一招重置Windows更新组件:Reset Windows Update Tool让我摆脱0x80070002报错的纠缠

2026/8/13 11:11:12

一招重置Windows更新组件:Reset Windows Update Tool让我摆脱0x80070002报错的纠缠 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-U…

阿里云Elasticsearch日志采集与加工服务:一体化托管方案解析与实践

阿里云Elasticsearch日志采集与加工服务:一体化托管方案解析与实践

2026/8/13 11:11:12

1. 项目概述:从“组件堆叠”到“服务内聚”的日志管理新范式在云原生和微服务架构成为主流的今天,日志管理是每个技术团队都无法绕开的“必修课”。回想一下我们构建一个标准日志链路的典型过程:首先,我们需要在每台服务器或容器里…

Vue3低代码平台物料模式配置:从Schema设计到AI智能生成

Vue3低代码平台物料模式配置:从Schema设计到AI智能生成

2026/8/13 11:11:12

1. 从“搭积木”到“造积木”:物料模式配置的本质 在低代码或者AI驱动的开发平台里,我们总说“像搭积木一样构建应用”。这话听起来很美,但如果你真去用过一些平台,可能会发现一个尴尬的现实:平台提供的“积木”要么太…

碧蓝幻想Relink伤害统计利器GBFR Logs快速上手:免费开源DPS工具5步通关

碧蓝幻想Relink伤害统计利器GBFR Logs快速上手:免费开源DPS工具5步通关

2026/8/13 11:11:12

碧蓝幻想Relink伤害统计利器GBFR Logs快速上手:免费开源DPS工具5步通关 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbf…

Python爬虫实战:基于Playwright的企业数据采集与反爬策略

Python爬虫实战:基于Playwright的企业数据采集与反爬策略

2026/8/13 11:01:12

1. 项目概述与核心价值 最近在做一个市场分析的项目,需要批量获取一批目标公司的工商信息、股东背景和经营状况。手动去天眼查、企查查这类网站一个个搜,效率低不说,还容易出错。于是,用Python写一个爬虫来自动化这个数据采集过程…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/13 11:01:28

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/11 8:44:43

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/11 15:57:54

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

电商毛利率别再手动算了!2026年3种自动分析工具实测对比

电商毛利率别再手动算了!2026年3种自动分析工具实测对比

2026/8/13 0:00:21

一、开篇:毛利率——电商运营最该盯但最难盯的指标 电商运营中有一个指标,几乎所有老板都会问,但几乎所有运营都回答得不够确定——毛利率。不是"店铺毛利率",而是"每条链接的毛利率""每个品类的毛利率…

15-SaaS系统灰度发布:滚动更新、金丝雀发布、不停机迭代

15-SaaS系统灰度发布:滚动更新、金丝雀发布、不停机迭代

2026/8/13 0:00:21

15-SaaS系统灰度发布:滚动更新、金丝雀发布、不停机迭代 一、为什么需要不停机发布? 传统发布方式:停服务 → 替换包 → 启服务。在内部系统里勉强能用,但在SaaS系统中是灾难。 我们的无人售货柜SaaS平台服务全国几千台设备&#…

17-线上Bug热修复流程:紧急分支、补丁合并、版本快速回退方案

17-线上Bug热修复流程:紧急分支、补丁合并、版本快速回退方案

2026/8/13 0:00:21

17-线上Bug热修复流程:紧急分支、补丁合并、版本快速回退方案 前言 大家好,我是黒漂技术佬。 线上出 Bug 这种事,就像你正吃着火锅唱着歌,突然接到电话说"柜子门打不开了"。炸不炸?慌不慌?别急&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…