我刚刚开始研究Linux上的GPU驱动开发。根据内核文档,Linux DRM 中有两个内存管理器,GEM 和 TTM。 TTM被描述为复杂而笼统,而GEM则显得简单而简单,但缺乏视频RAM的兼容性。
内核文档中的介绍很清楚,但是在仔细研究AMD驱动程序和DRM GEM程序的实现后,我遇到了几个问题,发现它并不像文档中所暗示的那么简单和清晰。
我认为
drm_gem_object_funcs
结构体用于存储 GEM 对象的回调,但是 AMD 驱动程序实现(在 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
中)将成员变量 vmap
和 vumap
设置为 drm_gem_ttm_vmap
和 drm_gem_ttm_vumap
分别,这似乎暗示 GEM 对象最终将依赖 TTM 模块来完成一些内存工作。
DRM VRAM 管理中的默认回调设置(在
drivers/gpu/drm/drm_gem_vram_helper.c
中)将drm_gem_object_funcs
的成员设置为drm_gem_vram_object_xxx
,包括pin
、unpin
、free
等。但是 mmap
被分配了 drm_gem_ttm_mmap
,这是 TTM 帮助程序模块中的另一个函数。
GEM 中的
free
实现,drm_gem_vram_object_free
只需调用 TTM 函数 ttm_bo_put
。
鉴于上述发现,我有几个问题:
我对驱动开发不熟悉,如果没有足够的背景知识,我的理解可能会非常错误。如果有人能纠正我并解释这些模块的实际工作原理,我将不胜感激。