C.3 DRM/TTM 灵魂拷问 100 问: 解释下 AMDGPU_GEM_CREATE_VRAM_CLEARED 标志的作用和实现原理

1. 概述

AMDGPU_GEM_CREATE_VRAM_CLEARED 是 AMDGPU 驱动中用于 GEM 对象创建的一个标志位。当用户空间或内核分配 VRAM buffer 时设置此标志,驱动会确保分配的显存内容被清零。

/* Flag that the memory should be in VRAM and cleared */
#define AMDGPU_GEM_CREATE_VRAM_CLEARED		(1 << 3)

2. 功能目的

  1. 安全性保障:防止新分配的 buffer 包含前一用户的残留数据,避免信息泄露
  2. 初始化一致性:确保 buffer 内容从已知状态(全零)开始
  3. 配合 AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE:后者在释放时擦除敏感数据

3. 实现流程

3.1 入口检查 (amdgpu_bo_create)

amdgpu_object.camdgpu_bo_create() 函数中:

if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
    bo->tbo.resource->mem_type == TTM_PL_VRAM) {
    struct dma_fence *fence;

    r = amdgpu_ttm_clear_buffer(amdgpu_ttm_next_clear_entity(adev),
                                bo, bo->tbo.base.resv, &fence,
                                true, AMDGPU_KERNEL_JOB_ID_TTM_CLEAR_BUFFER);
    // ...
    if (fence) {
        dma_resv_add_fence(bo->tbo.base.resv, fence,
                           DMA_RESV_USAGE_KERNEL);
        dma_fence_put(fence);
    }
}

关键点:

  • 仅当 buffer 实际分配在 VRAM 时才执行清零
  • 使用 fence 机制确保清零操作完成后才能使用 buffer

3.2 缓冲区清零 (amdgpu_ttm_clear_buffer)

int amdgpu_ttm_clear_buffer(struct amdgpu_ttm_buffer_entity *entity,
                            struct amdgpu_bo *bo,
                            struct dma_resv *resv,
                            struct dma_fence **out_fence,
                            bool consider_clear_status,
                            u64 k_job_id)

实现要点:

  • 使用 amdgpu_res_cursor 遍历 buffer 的所有内存区域
  • 每次最多处理 256MB,避免 GPU 超时
  • 支持跳过已标记为已清零的区域(consider_clear_status
while (dst.remaining) {
    /* Never fill more than 256MiB at once to avoid timeouts */
    cur_size = min(dst.size, 256ULL << 20);
    
    r = amdgpu_ttm_map_buffer(entity, &bo->tbo, ...);
    r = amdgpu_ttm_fill_mem(adev, entity, 0, to, cur_size, ...);
    // ...
}

3.3 SDMA 填充 (amdgpu_ttm_fill_mem)

最终通过 SDMA (System DMA) 引擎执行硬件加速的内存填充:

static int amdgpu_ttm_fill_mem(struct amdgpu_device *adev,
                               struct amdgpu_ttm_buffer_entity *entity,
                               uint32_t src_data,      // 填充值,此处为 0
                               uint64_t dst_addr,      // 目标地址
                               uint32_t byte_count,    // 字节数
                               ...)
{
    for (i = 0; i < num_loops; i++) {
        amdgpu_emit_fill_buffer(adev, &job->ibs[0], src_data, dst_addr,
                                cur_size);
        // ...
    }
}

4. 架构图

用户空间/内核
    │
    ▼ AMDGPU_GEM_CREATE_VRAM_CLEARED
┌──────────────────────┐
│  amdgpu_bo_create()  │
└──────────┬───────────┘
           │ mem_type == TTM_PL_VRAM?
           ▼
┌────────────────────────────┐
│ amdgpu_ttm_clear_buffer()  │
│   遍历所有内存区域            │
│   每块 ≤ 256MB              │
└──────────┬─────────────────┘
           │
           ▼
┌────────────────────────────┐
│  amdgpu_ttm_fill_mem()      │
│   构建 SDMA fill 命令        │
└──────────┬─────────────────┘
           │
           ▼
┌────────────────────────────┐
│    SDMA Engine (GPU)       │
│    硬件加速清零              │
└────────────────────────────┘

5. 相关标志

标志说明
AMDGPU_GEM_CREATE_VRAM_CLEARED分配时清零
AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE释放时擦除敏感数据
AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS分配连续 VRAM

6. 性能考量

  • 清零操作由 GPU SDMA 引擎异步执行,不阻塞 CPU
  • 通过 fence 同步,用户在实际使用 buffer 前等待完成
  • 分块处理(256MB)避免单次操作超时

7. 使用场景

  1. 安全敏感应用:加密密钥、用户数据等
  2. 图形渲染:避免屏幕出现"花屏"(残留纹理数据)
  3. 计算负载:确保累加器等从零开始

8. 一句话总结

AMDGPU_GEM_CREATE_VRAM_CLEARED 在分配 VRAM 时通过 SDMA 引擎异步填零(amdgpu_ttm_fill_mem 提交 GPU job),并用 fence 同步确保使用前完成,避免信息泄露。

内容概要:本文研究了基于二阶线性自抗扰控制器(LADRC)的表贴式永磁同步电机(PMSM)双闭环矢量调速系统,重点在于通过Simulink搭建仿真模型,实现对PMSM的速度电流双环控制。文中系统阐述了LADRC的核心原理及其在估计并补偿系统内部动态与外部扰动方面的优越性,相较于传统PI控制,LADRC显著提升了系统的动态响应速度、抗干扰能力鲁棒性。研究构建了完整的矢量控制体系,涵盖了Park与Clarke坐标变换、空间矢量脉宽调制(SVPWM)技术、转速环与电流环的协同设计,并通过大量仿真实验,全面验证了所提出控制策略在启动过程、突加/突卸负载以及电机参数摄动等多种工况下的卓越性能表现。; 适合人群:自动化、电气工程、控制科学与工程及相关专业的研究生、高校科研人员及从事高性能电机驱动与控制算法开发的工程师。; 使用场景及目标:①深入理解自抗扰控制(ADRC)理论在高精度电机驱动系统中的具体应用与实现方法;②掌握基于Simulink/MATLAB的PMSM矢量控制系统从理论建模到仿真实现的全流程技术;③学习并掌握LADRC控制器的参数整定规律与优化技巧,提升解决实际工程中强扰动、非线性题的能力;④为研发具有更高鲁棒性控制精度的工业级电机控制系统提供先进的技术方案与理论依据。; 阅读建议:建议读者结合所提供的Simulink仿真模型进行同步学习与实践,重点关注扩张状态观测器(ESO)的带宽配置、控制器参数与系统性能之间的内在关系,并可通过修改负载条件电机参数来测试系统的鲁棒性,为进一步研究非线性ADRC或将其应用于其他复杂机电系统奠定坚实基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值