Linux DRM GEM 在内存管理方面如何与 TTM 配合使用?

问题描述 投票:0回答:0

我刚刚开始研究Linux上的GPU驱动开发。根据内核文档,Linux DRM 中有两个内存管理器,GEM 和 TTM。 TTM被描述为复杂而笼统,而GEM则显得简单而简单,但缺乏视频RAM的兼容性。

内核文档中的介绍很清楚,但是在仔细研究AMD驱动程序和DRM GEM程序的实现后,我遇到了几个问题,发现它并不像文档中所暗示的那么简单和清晰。

  1. 我认为

    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 模块来完成一些内存工作。

  2. 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 帮助程序模块中的另一个函数。

  3. GEM 中的

    free
    实现,
    drm_gem_vram_object_free
    只需调用 TTM 函数
    ttm_bo_put

鉴于上述发现,我有几个问题:

  1. GEM和TTM的实际关系是什么? GEM 是否依赖 TTM 来进行内存管理工作?
  2. 如果GEM可以简单地调用TTM函数来完成这项工作,为什么它会“缺乏视频RAM的兼容性”?难道不能调用另一个 TTM 函数来完成困难的部分吗?

我对驱动开发不熟悉,如果没有足够的背景知识,我的理解可能会非常错误。如果有人能纠正我并解释这些模块的实际工作原理,我将不胜感激。

linux-kernel driver linux-device-driver amd-gpu
© www.soinside.com 2019 - 2024. All rights reserved.