1. MMU notifier机制解析
在GPU虚拟化场景中,MMU notifier是连接CPU页表与GPU页表的关键桥梁。这个机制本质上是一种回调框架,允许驱动在CPU页表发生变更时获得通知。对于NVIDIA GPU这类需要维护独立页表体系的设备而言,及时同步页表变更是保证内存一致性的基础。
MMU notifier的核心数据结构是mmu_notifier_ops,其中定义了若干关键回调函数:
c复制struct mmu_notifier_ops {
void (*invalidate_range_start)(...);
void (*invalidate_range_end)(...);
void (*change_pte)(...);
};
当CPU侧发生页表修改时(如mprotect、munmap等操作),内核会通过mmu_notifier_invalidate_range_start/end通知所有注册的notifier。NVIDIA驱动正是利用这个时机,同步更新GPU的页表内容。
注意:notifier回调执行在页表锁保护范围内,因此回调函数必须避免任何可能导致睡眠的操作,否则会引发死锁。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. NVIDIA驱动实现细节
2.1 驱动注册流程
NVIDIA驱动在初始化GPU内存管理模块时,会通过以下流程注册notifier:
c复制static const struct mmu_notifier_ops nvidia_mmu_notifier_ops = {
.invalidate_range_start = nvidia_invalidate_range_start,
.invalidate_range_end = nvidia_invalidate_range_end,
};
int nvidia_mmu_notifier_register(struct nvidia_device *ndev)
{
ndev->mmu_notifier.ops = &nvidia_mmu_notifier_ops;
mmu_notifier_register(&ndev->mmu_notifier, current->mm);
}
``
