NVIDIA 原生命令组件
本目录是原生 GPU 驱动的协议开发和离线验收工具。当前没有可初始化的 XFESystem NVIDIA 通道,也没有实际 GPU/CUDA 执行成功记录。 此模块尚未接入桌面,不会让现有 QEMU 渲染自动变成 GPU 渲染。
Source/XFESystem.Gpu.Nvidia 已实现:
- 由固定版本公开字段生成小端命令:绑定 Blackwell Copy A/B 类、32 位常量填充、同一 Copy Engine 的系统内存刷新及 32 位完成信号。一次命令为 72 字节。
- 57 位 pushbuffer 地址的 segment-base 控制项及 8 字节 GPFIFO 项,拒绝未对齐、截断、跨 40 位分段及越界地址。
- 接收已经建立且由调用者持有的原生 CPU/GPU 映射,向命令内存和环形队列写入,依次进行内存屏障、可选 BAR1 drain-read、GPPut 更新、内存屏障、work-submission token 写入。控制寄存器和 token 必须由资源管理器提供,不猜测 BAR 偏移。
- 单条在途提交的生命周期:完成信号未匹配时拒绝覆盖、重新提交和正常处置;超时保留资源;完成值递增,不允许回绕复用。参数错误不改变任何映射。显式释放 monitor,避免依赖裸机运行时尚不支持的通用
finally展开。
NvidiaMappedCopyChannel 是 unsafe 的设备侧组件。调用者必须先拥有设备、建立 GSP/RM 通道及 GPU 页表,并确保映射的缓存属性、实际长度和存活时间;提供普通托管数组、CPU 地址或仅发现 PCI BAR 均不满足这些前提。模块不会分配 DMA、建立 GPU MMU 或初始化 GSP,不能独立替代它们。
官方依据锁在 NvidiaSources.lock.json:NVIDIA 615.78.08,提交 ca2d03e6fafd4d4b56b383497d931c25b283bfcf。13 个文件均记录 SHA256、Git blob、完整固定链接和 MIT 许可,许可保留在 NvidiaPublicHeaders.txt。Blackwell Copy A/B 按官方 HAL 表继承 Hopper Copy 的相关方法;填色完成采用同 Copy Engine 的 system-flush release,未以可能先行完成的前端 semaphore 充当填色完成信号。
在仓库根目录执行离线检查:
dotnet test Tests/XFESystem.Gpu.Nvidia.Tests/XFESystem.Gpu.Nvidia.Tests.csproj -c Release --artifacts-path build/NvidiaProtocol/Artifacts
dotnet run --project Tools/Gpu/NvidiaProtocolProbe/NvidiaProtocolProbe.csproj -c Release --artifacts-path build/NvidiaProtocol/ProbeArtifacts -- "$PWD/build/NvidiaProtocol/Probe"
python Tools/Gpu/VerifyNvidiaProtocol.py --probe-directory build/NvidiaProtocol/Probe --download
--download 只在缓存缺失时从官方 GitHub blob API 下载固定文件;每次检查都会核对两种哈希。Python 使用官方头文件字段独立生成预期字节,与 C# 输出的完整命令和队列项比较,结果为 HeaderOracle.json。26 项 .NET 测试覆盖固定字节、57 位地址、边界、别名、队列回绕、在途资源保护和异常后的 monitor 释放。测试用的 native memory 是私有宿主内存;测试显式模拟完成信号仅检查生命周期,不算 GPU 结果。
当前安全测试条件只提供标准 VGA/VirtIO/QXL 等 QEMU 设备,现有 Windows QEMU 没有 vfio-pci 或 NVIDIA 设备。宿主 RTX 5090 正在驱动显示器,不能在不解绑/切换宿主设备的情况下当作 XFESystem 来宾 GPU。后续实际验收必须取得供 XFESystem 使用的 NVIDIA 设备,完成 GSP、资源管理、DMA 和 MMU 前置层,再提交并读回真实填色结果;进一步运行 CUDA 内核和接口验收后才可宣告 CUDA 支持。此时还应接入真实显示资源并重新测量首帧,离线命令正确不证明首帧低于 1 秒。