当前位置: 首页 > article >正文

第四章:TTM分析: 4.5.1 ttm_device对三大设计目标的实现

2. 统一管理异构内存域这是ttm_device最基础的职责将 VRAM、GTT、SYSTEM 等物理上完全不同的内存纳入统一的管理框架。2.1 资源管理器数组man_drv[]structttm_resource_manager*man_drv[TTM_NUM_MEM_TYPES];这是一个按内存域类型索引的指针数组。每种内存类型由TTM_PL_SYSTEM、TTM_PL_TT、TTM_PL_VRAM等常量标识对应数组中的一个槽位指向该域的资源管理器实例。访问接口简洁明了staticinlinestructttm_resource_manager*ttm_manager_type(structttm_device*bdev,intmem_type){returnbdev-man_drv[mem_type];}staticinlinevoidttm_set_driver_manager(structttm_device*bdev,inttype,structttm_resource_manager*manager){bdev-man_drv[type]manager;}驱动在初始化时将各域的管理器注册到对应槽位。例如 amdgpu 会注册 VRAM 域buddy 分配器、GTT 域区间分配器等。之后 TTM 核心代码通过ttm_manager_type(bdev, mem_type)统一访问无需关心底层是什么分配策略。设计意图一个数组统一所有内存域上层代码用mem_type索引即可彻底解耦内存域的种类与内存域的实现。2.2 内建的 SYSTEM 域管理器sysmanstructttm_resource_managersysman;SYSTEM 域TTM_PL_SYSTEM是最基础的内存域——BO 暂存在系统内存中尚未绑定到任何设备可见的地址空间。由于所有 GPU 设备都需要 SYSTEM 域作为兜底TTM 将其直接内嵌在ttm_device中在ttm_device_init()时自动初始化驱动无需额外注册。对比VRAM、GTT 等域的管理器由驱动创建并通过ttm_set_driver_manager()注册是可选的、硬件相关的而sysman是必有的、硬件无关的。2.3 页池ttm_poolstructttm_poolpool;当 BO 需要系统内存 backing pages 时即ttm_tt_populate不直接调用伙伴系统分配而是优先从设备的页池中获取。页池按页大小4K、2M、1G和缓存属性WC、UC、cached分桶管理提供分配加速避免频繁调用alloc_pages和set_memory_*切换缓存属性统一接口不管底层是 DMA coherent 内存还是普通页页池对外接口一致页池是统一管理目标在页级别的体现——不同缓存属性的页通过同一个池子管理。2.4 驱动回调ttm_tt_create/ttm_tt_populate/ttm_tt_unpopulatettm_device_funcs中的这组回调定义了系统内存页的生命周期structttm_tt*(*ttm_tt_create)(structttm_buffer_object*bo,uint32_tpage_flags);int(*ttm_tt_populate)(structttm_device*bdev,structttm_tt*ttm,structttm_operation_ctx*ctx);void(*ttm_tt_unpopulate)(structttm_device*bdev,structttm_tt*ttm);void(*ttm_tt_destroy)(structttm_device*bdev,structttm_tt*ttm);TTM 核心只定义何时需要创建/填充/释放页比如 BO 迁移到 TT 域时需要 populate而如何做则交给驱动。这让不同硬件可以定制是否使用 huge page是否需要特殊的 DMA 映射如 IOMMU bypass是否支持加密内存如 AMD SEV/TMZ小结man_drv[]实现域级统一pool实现页级统一ttm_tt_*回调实现行为级统一。三者协同让驱动只需注册能力而非重写框架。3. 显存动态调度与超配当应用的显存需求超过物理 VRAM 容量时TTM 需要自动将不活跃的 BO 驱逐到系统内存并在需要时迁回。ttm_device中有一组成员专门为此而设。3.1 LRU 管理基础设施lru_lock— 全局自旋锁spinlock_tlru_lock;TTM 的 eviction 策略基于 LRULeast Recently Used最久未被访问的 BO 优先被驱逐。每个ttm_resource_manager内部维护了按优先级分桶的 LRU 链表lru[TTM_MAX_BO_PRIORITY]而lru_lock是保护所有这些链表的全局锁。为什么用全局锁而非 per-manager 锁因为 eviction 经常涉及跨域操作——从 VRAM 管理器的 LRU 中选出候选 BO然后迁移到 TT 域。全局锁避免了跨锁死锁问题代价是锁粒度较粗但 eviction 本身不是热路径这个取舍是合理的。unevictable— 不可驱逐链表structlist_headunevictable;被 pin 住的 BO如正在被 GPU 使用的页表 BO或已被 swap out 的 BO不应参与 eviction 选择。TTM 将它们从各管理器的 LRU 链表中摘出挂到unevictable链表上避免 eviction 扫描时的无效遍历。这是一个简单但重要的优化没有它每次 eviction 都要遍历并跳过大量不可驱逐的 BO。3.2 驱动回调中的 eviction 策略ttm_device_funcs中有三个回调共同定义了 eviction 的决策与执行bool(*eviction_valuable)(structttm_buffer_object*bo,conststructttm_place*place);void(*evict_flags)(structttm_buffer_object*bo,structttm_placement*placement);int(*move)(structttm_buffer_object*bo,bool evict,structttm_operation_ctx*ctx,structttm_resource*new_mem,structttm_place*hop);三者的分工形成一条完整的 eviction 决策链回调职责回答的问题eviction_valuable()筛选“这个 BO 值得驱逐吗”evict_flags()定向“驱逐到哪个域用什么 placement”move()执行“如何把数据搬过去”move()还支持multihop当 BO 无法从 A 域直接迁移到 B 域时如某些硬件不支持 VRAM→SYSTEM 直接 DMA驱动可返回-EMULTIHOP并指定一个中间域如先到 TTTTM 核心会自动进行两跳迁移。3.3 延迟删除工作队列wqstructworkqueue_struct*wq;初始化时创建bdev-wqalloc_workqueue(ttm,WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_UNBOUND,16);BO 的销毁可能涉及等待 GPU fence 完成不能在持有锁或中断上下文中阻塞。TTM 将这些延迟删除任务投递到wq异步完成清理。WQ_MEM_RECLAIM标志确保即使系统内存紧张工作队列仍能推进——否则 eviction 释放内存的路径本身会因内存不足而死锁。3.4 Swapout 路径当系统整体内存压力大时如 Linux 的 shrinker 触发TTM 提供两级 swapout// 设备级遍历该设备所有使用 TT 的管理器尝试将 BO swap 到 shmemintttm_device_swapout(structttm_device*bdev,structttm_operation_ctx*ctx,gfp_tgfp_flags);// 全局级遍历所有 TTM 设备轮询 swapoutintttm_global_swapout(structttm_operation_ctx*ctx,gfp_tgfp_flags);ttm_global_swapout()的实现中有一个细节——成功 swap 后将当前设备移到全局链表尾部list_move_tail实现跨设备的公平轮转避免某个设备的 BO 被反复驱逐。此外swap_notify()回调在 swapout 前通知驱动让驱动有机会做清理如释放 GPU 页表映射。休眠场景下ttm_device_prepare_hibernation()会循环调用ttm_device_swapout()直到所有 GTT BO 都被移入 shmem确保休眠镜像中不包含设备相关的页映射。小结lru_lockunevictable提供数据结构基础三个 eviction 回调定义策略wq保障异步执行swapout 路径应对系统级内存压力。这套机制让 TTM 能够在 VRAM 容量有限的情况下透明地为应用提供远超物理显存的使用体验。4. GPU 地址映射支撑如 4.1 节所述TTM 不直接操作 GPU 页表但它为地址映射提供关键的基础设施。ttm_device中有三组成员与此相关。4.1 VMA 偏移管理vma_managerstructdrm_vma_offset_manager*vma_manager;用户空间要访问 BO需要通过mmap将其映射到进程地址空间。但多个 BO 不能映射到同一个文件偏移因此需要一个偏移分配器为每个 BO 分配唯一的虚拟偏移。drm_vma_offset_manager就是这个分配器。它基于drm_mm区间分配器管理一个巨大的虚拟偏移空间。当用户调用mmap时DRM 核心通过偏移找到对应的 BO再建立 CPU 页表映射。ttm_device持有该指针而非内嵌因为vma_manager通常由drm_device创建并共享给 TTM体现了 GEM 与 TTM 的协作关系。4.2 CPU 映射失效dev_mappingstructaddress_space*dev_mapping;当 BO 发生迁移如从 VRAM 迁到 TT其物理地址改变了但用户空间可能仍持有旧的 CPU 映射通过 mmap 建立的 PTE 指向旧 VRAM 地址。如果不处理CPU 会访问到错误的物理地址。dev_mapping指向设备的address_spaceTTM 在 BO 迁移时调用unmap_mapping_range()批量失效该 BO 对应的所有 CPU 页表项。下次用户空间访问时触发 page faultfault handler 会根据 BO 的新物理位置重新建立映射。这是一个被动更新策略不主动重建所有映射而是先失效、按需重建避免了迁移时遍历所有映射进程的开销。4.3 IO 内存映射回调int(*io_mem_reserve)(structttm_device*bdev,structttm_resource*mem);void(*io_mem_free)(structttm_device*bdev,structttm_resource*mem);unsignedlong(*io_mem_pfn)(structttm_buffer_object*bo,unsignedlongpage_offset);VRAM 对 CPU 而言是 IO 内存MMIO不能像普通内存一样直接访问。这组回调为 CPU 访问 VRAM 提供支持io_mem_reserve()在 CPU 需要访问某个 VRAM 资源前调用驱动在此设置 BAR 映射窗口如 amdgpu 的 VRAM 只有部分通过 PCIe BAR 对 CPU 可见需要动态调整映射窗口io_mem_free()与reserve配对释放映射窗口io_mem_pfn()为 fault handler 返回 BO 指定偏移处的 PFNPage Frame Number用于建立 CPU 到 VRAM 的 PTE三者配合让 TTM 的 fault handlerttm_bo_vm_fault能够透明地处理 CPU 对 VRAM BO 的 mmap 访问驱动只需实现硬件相关的 BAR 映射细节。小结vma_manager解决用户空间如何找到 BOdev_mapping解决BO 搬家后 CPU 映射怎么办io_mem_*回调解决CPU 如何访问 VRAM。三者共同构成 TTM 对 CPU/GPU 地址映射的支撑体系。 导航上一节4.5 ttm_device 设计与实现解析下一节4.5.2 ttm_device 初始化与全局管理返回目录: linux drm子系统技术实现分析产品化应用分享专栏目录

相关文章:

第四章:TTM分析: 4.5.1 ttm_device对三大设计目标的实现

2. 统一管理异构内存域 这是 ttm_device 最基础的职责:将 VRAM、GTT、SYSTEM 等物理上完全不同的内存,纳入统一的管理框架。 2.1 资源管理器数组 man_drv[] struct ttm_resource_manager *man_drv[TTM_NUM_MEM_TYPES];这是一个按内存域类型索引的指针…...

Intv_ai_mk11 数据处理实战:模拟VLOOKUP功能实现智能表格匹配与问答

Intv_ai_mk11 数据处理实战:模拟VLOOKUP功能实现智能表格匹配与问答 1. 办公数据处理的痛点与机遇 在日常办公场景中,数据匹配是最常见也最令人头疼的任务之一。想象这样一个场景:你手上有两个表格,一个包含员工基本信息&#x…...

终极指南:如何用NX代码所有权彻底解决团队协作中的责任难题

终极指南:如何用NX代码所有权彻底解决团队协作中的责任难题 【免费下载链接】nx The Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time. …...

内存计算与XBTorch框架:深度学习硬件加速新范式

1. 内存计算与深度学习加速器:突破冯诺依曼瓶颈的新范式在深度学习模型规模呈指数级增长的今天,传统计算架构的局限性日益凸显。作为一名长期关注AI硬件加速的研究者,我深刻体会到内存计算技术带来的变革潜力。这种技术最吸引我的地方在于它从…...

Zotero PDF Translate:打破语言壁垒的智能文献翻译革命

Zotero PDF Translate:打破语言壁垒的智能文献翻译革命 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mirrors…...

5个理由告诉你为什么tModLoader是泰拉瑞亚模组开发的终极工具

5个理由告诉你为什么tModLoader是泰拉瑞亚模组开发的终极工具 【免费下载链接】tModLoader A mod to make and play Terraria mods. Supports Terraria 1.4 (and earlier) installations 项目地址: https://gitcode.com/gh_mirrors/tm/tModLoader 如果你正在寻找一款能…...

实用GTNH汉化指南:3分钟让Minecraft科技整合包变中文界面

实用GTNH汉化指南:3分钟让Minecraft科技整合包变中文界面 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH GTNH汉化项目是一个专为GregTech: New Horizons整合包设计的全面中文翻译…...

STM32F411CEU6上,用HAL库硬件IIC搞定MPU6050 DMP的完整流程(附代码避坑点)

STM32F411CEU6硬件IIC驱动MPU6050 DMP全流程实战指南 第一次在STM32F4上尝试用硬件IIC驱动MPU6050的DMP功能时,我遇到了无数个深夜调试的崩溃时刻——从IIC通信失败到DMP解算异常,每个环节都暗藏杀机。本文将分享一套经过实战验证的完整解决方案&#xf…...

如何一键捕获完整网页?这款免费Chrome扩展让你轻松搞定长网页截图

如何一键捕获完整网页?这款免费Chrome扩展让你轻松搞定长网页截图 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-c…...

如何通过Python脚本化CATIA V5实现机械设计开发流程重构?

如何通过Python脚本化CATIA V5实现机械设计开发流程重构? 【免费下载链接】pycatia python module for CATIA V5 automation 项目地址: https://gitcode.com/gh_mirrors/py/pycatia 在当今的机械设计领域,工程师们面临着一个核心困境:…...

如何永久保存微信聊天记录?本地导出工具完全指南

如何永久保存微信聊天记录?本地导出工具完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...

3大核心功能+5步实战:DLSS Swapper终极性能优化指南

3大核心功能5步实战:DLSS Swapper终极性能优化指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款革命性的游戏性能优化工具,它让普通玩家也能像专业调优师一样,…...

5分钟解决Windows系统臃肿:Win11Debloat终极优化指南

5分钟解决Windows系统臃肿:Win11Debloat终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cus…...

从数据丢失到无缝迁移:Dgraph数据迁移工具终极实战指南

从数据丢失到无缝迁移:Dgraph数据迁移工具终极实战指南 【免费下载链接】dgraph high-performance graph database for real-time use cases 项目地址: https://gitcode.com/gh_mirrors/dg/dgraph Dgraph作为高性能图数据库,在实时应用场景中扮演…...

如何让GTNH科技整合包说中文:从语言障碍到流畅体验的完整指南

如何让GTNH科技整合包说中文:从语言障碍到流畅体验的完整指南 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH 你是否曾经面对GTNH(GregTech: New Horizons&#xff09…...

SwiftUI 5.0 里用 @Observable 宏,为什么你的视图刷新总失灵?一个真实案例的排查过程

SwiftUI 5.0 中 Observable 宏的视图刷新陷阱:从实战案例解析状态管理机制 当我在最新项目中尝试将核心数据模型迁移到 Swift 5.9 的 Observable 宏时,一个诡异的视图刷新问题让我耗费了整整两天时间。这个案例发生在嵌套视图结构中:父视图的…...

终极Windows热键冲突解决指南:快速定位占用进程的完整教程

终极Windows热键冲突解决指南:快速定位占用进程的完整教程 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是…...

3步搞定抖音无水印批量下载:douyin-downloader实战指南

3步搞定抖音无水印批量下载:douyin-downloader实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

从云平台控制台到命令行:详解阿里云/腾讯云CentOS 7.6数据盘挂载全流程(含分区方案选择)

从云平台控制台到命令行:详解阿里云/腾讯云CentOS 7.6数据盘挂载全流程(含分区方案选择) 当你第一次在阿里云或腾讯云控制台为CentOS 7.6实例购买了额外的云硬盘后,可能会困惑于如何让操作系统识别并使用这块磁盘。不同于物理服务…...

避坑指南:饥荒Mod开发中AddRecipe2添加配方失败的5个常见原因及解决方法(基于最新API)

避坑指南:饥荒Mod开发中AddRecipe2添加配方失败的5个常见原因及解决方法(基于最新API) 第一次在《饥荒联机版》Mod开发中使用AddRecipe2函数时,那种看着代码完美运行但游戏里死活不显示配方的挫败感,相信很多开发者都深…...

信息学奥赛刷题必备:OpenJudge NOI 2.5 156题LETTERS的两种DFS解法详解(附C++代码)

信息学奥赛刷题进阶:LETTERS题目的DFS双解与竞赛思维突破 在信息学竞赛的征途中,DFS(深度优先搜索)算法就像一把瑞士军刀,能解决各类路径搜索与状态遍历问题。OpenJudge NOI 2.5 156题LETTERS正是检验这把"军刀&…...

别再死磕官方文档了!用Live555搭建RTSP服务器,从编译到推流实战避坑指南

从零构建Live555 RTSP服务器的实战避坑手册 当我们需要快速验证一个摄像头流或者开发RTSP播放器时,Live555往往是首选方案。但官方文档的晦涩和编译过程的复杂性让不少开发者望而却步。本文将带你绕过那些令人头疼的依赖问题,用最短路径搭建起可用的RTS…...

别再自己造轮子了!Spring Boot文件上传,为什么MockMultipartFile只适合测试?

为什么MockMultipartFile在生产环境是个危险选择? 在Spring Boot开发中,文件上传是个高频需求。不少开发者为了快速实现功能,会直接使用MockMultipartFile来处理生产环境的文件上传。这看似省事的做法,实则暗藏巨大风险。上周团队…...

Ventoy+U盘搞定麒麟V10服务器版安装:从镜像下载到补丁升级的保姆级避坑指南

VentoyU盘高效部署麒麟V10服务器版:全流程避坑与性能调优实战 在服务器操作系统部署领域,传统的光盘刻录和单一U盘刻录方式正逐渐被更灵活的解决方案取代。Ventoy作为新一代开源启动工具,以其"一盘多启"的特性彻底改变了系统安装的…...

深度解析w64devkit:Windows平台便携式C/C++开发套件完全掌握指南

深度解析w64devkit:Windows平台便携式C/C开发套件完全掌握指南 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit w64devkit是一款专为Windows平台设计的便携…...

轻舟于骞:一家公司要干20年,必须不断革自己的命

点击下方卡片,关注“自动驾驶之心”公众号戳我-> 领取自动驾驶近30个方向学习路线编辑 | 自动驾驶之心>>自动驾驶前沿信息获取→自动驾驶之心知识星球“我们正站在从‘无人驾驶’迈向‘物理AI’的历史拐点上。世界模型强化学习是链接数字与物理世界的核心桥…...

UltimateAndroid自动化测试最佳实践:从入门到精通的完整指南

UltimateAndroid自动化测试最佳实践:从入门到精通的完整指南 【免费下载链接】UltimateAndroid UltimateAndroid is a rapid development framework for developing your apps 项目地址: https://gitcode.com/gh_mirrors/ul/UltimateAndroid UltimateAndroid…...

比迪丽AI绘图效果惊艳展示:100+高质量龙珠角色生成实录

比迪丽AI绘图效果惊艳展示:100高质量龙珠角色生成实录 1. 前言:当AI画笔遇见童年偶像 如果你是看着《龙珠》长大的,一定对那个一头短发、性格倔强、后来成为悟饭妻子的比迪丽印象深刻。现在,有个好消息:不用再羡慕别…...

淘宝淘金币自动化脚本:每天节省25分钟的完整实用指南

淘宝淘金币自动化脚本:每天节省25分钟的完整实用指南 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 还在为…...

10个CoOp最佳实践:避免常见陷阱,让你的模型性能最大化

10个CoOp最佳实践:避免常见陷阱,让你的模型性能最大化 【免费下载链接】CoOp Prompt Learning for Vision-Language Models (IJCV22, CVPR22) 项目地址: https://gitcode.com/gh_mirrors/co/CoOp CoOp(Context Optimization&#xff0…...