前一节我们总结GEM的五大需求,这些需求更多的是面向用户态而言的。如果从实际物理内存管理的角度看,我们还需要一个模块,它就是TTM。
TTM 概述
TTM 设计目标是为 GPU 提供通用、可扩展的内存管理框架,支持多种内存类型(如 VRAM、GTT、系统内存)、动态迁移、页表管理、内存回收等高级特性。TTM 的主要特性包括:
多内存类型支持:通过 ttm_resource、ttm_placement 等结构体,为不同类型的内存分别初始化 range manager。例如,AMDGPU 驱动会为 VRAM、GTT 分别创建 ttm_range_manager 实例,管理各自的地址空间,实现支持VRAM、GTT、系统内存等多种后端。
页表管理:支持 GPU 虚拟地址空间的页表管理,便于实现大内存、稀疏映射等功能。
动态迁移与回收:支持 BO 在不同内存类型间动态迁移,支持内存回收、swap、备份等机制。
TTM 的出现极大提升了 Linux 图形驱动的内存管理能力,成为 AMDGPU、nouveau 等驱动的核心基础。
GEM 与 TTM 的内在关联十分值得探究,梳理二者的演进时间线,也有助于更深入地理解其设计脉络与依存关系。
1. TTM 与 GEM 的历史关系:先有 TTM,后有 GEM
很多文章将 GEM 和 TTM 的关系描述为"TTM 在 GEM 基础上扩展",在设计上的确如此。但这两者的发展历史却是复杂的。