ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

第三章 GEM 用户态接口:3.8 本章小结

第三章 GEM 用户态接口:3.8 本章小结

1. 本章小结

GEM 只做各驱动共同需要的部分:对象的身份、引用、CPU 映射、共享与同步。这一定位由需求与约束两方面决定。用户态大量引用对象、多个访问方异步访问同一对象、公共逻辑只实现一次这三项需求,要求 GEM 提供按drm_file隔离的整数 handle、每个对象一个dma_resv,以及收拢公共逻辑的 GEM core。内存形态、执行与寻址方式、对象私有状态随硬件而异这三条约束,则把放置与迁移留给后备存储方案,把作业提交与 GPU 地址绑定留给驱动,把私有状态与行为交给驱动经嵌入与回调表提供。

drm_gem_object是这些决策的载体。驱动把它嵌入自己的对象结构,并为对象提供一张回调表:core 决定调用时机,驱动决定具体做法。对象的存续由两个计数共同决定:handle_count决定用户态可见的身份何时清理,refcount决定对象何时释放,关闭 handle 不等于释放对象。

三类访问视图都以 handle 为入口,映射建立后的访问由硬件直接完成。CPU 视图由 GEM 完整实现:对象是设备文件中的一段伪偏移区间,只有持有 handle 的drm_file才能映射,映射可经设备共享的address_space一次撤销。GPU 视图随硬件代际变化,绑定与提交由驱动实现,GEM 只提供少量公共设施。设备间视图经 dma-buf 把对象交给其他驱动,导出方、dma-buf 与导入方共用一个dma_resv,它也是横跨三类视图的同步载体。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进