1. DRM GPU SVM 机制概述
在图形处理领域,DRM(Direct Rendering Manager)作为Linux内核中的核心图形子系统,负责管理GPU设备与用户空间程序之间的交互。其中SVM(Shared Virtual Memory)技术允许CPU和GPU共享同一虚拟地址空间,彻底消除了传统架构中数据拷贝的开销。drm_gpusvm作为DRM框架中的关键模块,实现了对GPU SVM功能的统一管理。
这个机制的核心价值在于:
- 零拷贝数据传输:应用程序可以直接将CPU端指针传递给GPU,无需通过PCIe总线进行显式拷贝
- 统一内存视图:CPU和GPU看到的是完全一致的虚拟地址空间,简化了编程模型
- 自动页表同步:当CPU或GPU发生页错误时,系统会自动同步双方的页表项
2. drm_gpusvm_notifier 的工作原理
2.1 通知器机制设计
drm_gpusvm_notifier本质上是一个事件回调系统,采用典型的发布-订阅模式。其核心数据结构包括:
c复制struct drm_gpusvm_notifier {
struct list_head head; // 通知器链表头
int (*notify)(struct drm_gpusvm_event *event); // 回调函数
unsigned int events; // 订阅的事件掩码
};
事件类型通过位掩码定义,常见的有:
- GPU_PAGE_FAULT:GPU侧发生页错误
- CPU_MAP_CHANGE:CPU进程地址空间发生变更
- DEVICE_REMOVE:GPU设备被热拔出
2.2 内存一致性保障
当GPU访问共享内存触发页错误时,完整的处理流程如下:
- GPU MMU产生页错误异常
- 驱动捕获异常,封装为drm_gpusvm_event事件
- 遍历notifier链表,调用所有订阅了GPU_PAGE_FAULT的回调
- 回调函数执行缺页处理(可能涉及磁盘IO或内存迁移)
- 更新GPU页表并恢复执行
关键点:所有notifier回调必须是非阻塞的,因为它们在中断上下文中执行。任何可能导致睡眠的操作都必须通过工作队列异步处理。
