前两篇处理的是框架视图与 BO 集合,页表本身不在 drm_gpuvm 的范围之内。框架不规定页表格式,不分配页表内存,也不发起 TLB 失效,这些工作全部由驱动完成。驱动的实现差别很大,但都要解决四个问题:页表内存在何时分配;在 GPU 可能并发访问的情况下如何写入;映射变更后如何按正确的顺序失效 TLB;以及页表本身何时可以释放。本篇以 Xe、panthor、nouveau 等驱动为例说明这四个问题的处理方式。1. 页表的实现方式1.1 驱动的选择GPU 页表的格式由硬件决定。集成在 SoC 中的 GPU 往往复用 CPU 侧 IOMMU 的页表格式,驱动可以直接使用内核的 io-pgtable 库;独立 GPU 的页表格式通常是专有的,驱动需要自行实现页表的遍历与写入。写入方同样有两种:由 CPU 直接写页表内存,或由 GPU 的复制引擎以作业的形式写入。各驱动的选择如表 10.6.1 所示。表 10.6.1 各驱动的页表实现驱动页表存储写入方TLB 失效方式Xe页表 BO,与 VM 共用 resvm