XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
README.md

NVIDIA RM 固定源码与裸机编译前置检查

本目录把 RM 移植准备推进到实际官方组件的 freestanding ELF 对象编译。没有初始化 GPU、没有加载 GSP、没有提交队列、没有链接完成的 RM,也没有 CUDA 验收;所有结果中的 GuestCudaPassed、GpuExecutionPassed 与 CompleteRmCompiled 保持 false。

固定上游为 NVIDIA open-gpu-kernel-modules 615.78.08,提交 ca2d03e6fafd4d4b56b383497d931c25b283bfcf。来源、原始 Git blob、SHA256、长度、Git mode、逐文件许可保存在 RmSources.lock.json。所有下载和引用缓存仅进入 build/Gpu/RmSources,包含元数据在内总量限制为 64 MiB;不写共享 .tools、全局缓存或宿主驱动。

复现

在本工作树根目录执行:

python Tools/Gpu/RmPort/Preflight.py --fetch --compile
python Tools/Gpu/RmPort/TestPreflight.py

前置工具为既有 Python 和 .tools/llvm/bin/{clang.exe,llvm-nm.exe}。--fetch 只取得锁内条目,不发现新源码或更新锁。实际编译使用 x86_64-unknown-none-elf、-ffreestanding、-nostdinc、无 red zone/stack protector/PIC、独立编译单元与函数节,只允许 Clang 自身 builtin 头;不使用 Windows SDK、Linux sysroot、系统库或伪造 RM 类型。

每次运行创建全新的 build/Gpu/RmPort/Proof-*,保存命令、编译器哈希、原始日志、对象哈希、ELF64/x86_64/relocatable 类型校验和 llvm-nm 的真实 defined/undefined 清单。-H 记录每个实际读取的头:NVIDIA 头须匹配锁,Clang builtin 头另记哈希,其他外部头直接拒绝。结束前再次核对工具源和实际头文件,防止并发修改产生错误归属。

固定树没有 Git symlink;nvoc/object.h 是包含 g_object_nvoc.h 的普通转发头,工具保留原字节,不生成替代声明。文件 mode 限定为上游普通/可执行文件,来源缓存不允许文件系统 symlink 或路径越界。

PreflightPassed 只代表固定输入有效,并且在要求编译时至少有一个真实组件编译成功;必须逐项阅读 Components 的 Compiled/日志。它不代表所有尝试成功或 GPU 能力通过。

当前真实结果与仍缺的边界

同一份官方 src/nvidia/src/libraries/msgq/msgq.c 用于 GSP 消息队列基础设施。当前已经生成真实 5,096 字节 ELF64 x86_64 对象,没有执行链接,undefined 为:

实际符号 需要 XFESystem 提供的合约
osGpuReadReg032 从已归属设备、已经合法映射的寄存器窗口读 32 位值
osGpuWriteReg032 按实际设备/队列生命周期写寄存器;本前置工具不会调用
portMemCopy 与上游 ABI 匹配的真实内存复制
portMemSet 与上游 ABI 匹配的真实内存填充

该对象有 12 个实际导出定义(见 msgq.Defined.log),SHA256 为 5824f67b8a9279c083b70a76db71705b2d34343a815819e9cf50da54541057e2。它使用 SysV x86_64 调用约定。portMemCopy(void *dst, NvLength destSize, const void *src, NvLength srcSize) 有 4 个参数,不能直接别名标准 memcpy;NvLength 在此目标为 NvU64。portMemSet(void*,NvU8,NvLength)、osGpuReadReg032(OBJGPU*,NvU32) 和 osGpuWriteReg032(OBJGPU*,NvU32,NvV32) 也应沿用原头,不能按 Windows x64 ABI 猜测桥接。

编译保留两个独立 profile:

  • BareMetalNoOsSelection:不选择上游 OS 接口。实际失败于 NvPort Unsupported target OS;此失败保留。
  • UpstreamUnixInterfaceNeedsPort:仅用 NV_UNIX 选择上游的 os_* 接口形状,不定义 NV_LINUX,不编译 Linux 层或链接任何 Linux 库。队列对象能够编译,以上 4 个调用保持 unresolved,等待自研内核实现接口。这不是“现成 Unix 驱动已经能运行”。

完整 kern_fsp_gb202.c、kernel_gsp_gb202.c 和 message_queue_cpu.c 的原始编译尝试也会执行。已实际执行 --closure all,锁扩到 158 文件 / 4,035,415 字节原始源码,包括真实 GPU/FSP/GSP/NVOC/RPC 头。扩展未完成:raw HTTPS 连接重置,GitHub blob API 返回 403 限流;锁的 CaptureComplete=false、CaptureFailure.PendingPaths/UnscannedPaths 保留准确边界。当前实际编译首先分别缺 ctrl/ctrlxxxx.h、core/bin_data.h、containers/btree.h。这些不是只补 3 个函数即可解决的完整依赖清单;其余实际头及 OS 适配仍须完成,不能用 stub、删方法体或关安全功能标记通过。

两份固定 MIT 头 dev_therm.h、dev_therm_addendum.h 已入锁;前置检查额外固定其 SHA256,核对 NV_THERM_I2CS_SCRATCH=0x00ad00bc、FSP alias 和成功值 0xff,并把生产 NvidiaBootProbe.FspBootComplete 与官方定义对比,绑定生产源 SHA。这仅验证只读探测的依据,没有读取设备、启动固件或宣布 GPU 可用。

官方构建流程与规模

已直接核对锁内 Makefile、utils.mk、version.mk、src/nvidia/Makefile、srcs.mk、链接脚本与导出列表:

  1. 顶层先进入 src/nvidia 构建 OS 无关的 nv-kernel.o,随后才进入 kernel-open 的 Linux kbuild。XFESystem 不执行后一步。
  2. 此发布快照已经携带 NVOC 生成的 .c/.h。公开 Makefile 不调用外部 NVOC 生成器,而是直接编译这些输出。还会生成 version.h 和驱动构建字符串;这两项不同于重新生成 NVOC。
  3. srcs.mk 列出 1,099 个翻译单元,其中 223 个 generated、209 个 NVOC;清单所指源文件共 30,109,804 字节,尚不含头文件、全部依赖与固件。这是固定树/清单的统计,未下载或声称编译了全部源码。
  4. 上游把对象按 nv-kernel.ld、exports_link_command.txt 进行 ld -r、--gc-sections,随后 localize memcpy/memset 等符号。当前工具只编译选取组件,不运行这个全量 RM 链接。
  5. kernel-open/common/inc/os-interface.h 有 164 个 os_* 名称,记录在输出的 OsInterfaceInventory。这是词法声明清单,包含可选 cgroup/IOMMU/vGPU 等接口,既不等于全部 RM imports,也不意味着首个 GB202 路径要实现全部 164 个。

必需接口最终应由实际选定资源路径的对象/链接依赖确定,包括设备访问、DMA/缓存属性、同步、计时、调度/中断上下文、ACPI、随机与错误清理;不以返回成功的空实现代替。

更新固定引用集

仅维护者在有意扩大移植范围时执行:

python Tools/Gpu/RmPort/CaptureReferences.py --closure msgq
python Tools/Gpu/RmPort/CaptureReferences.py --closure all

该命令可重新生成本目录锁,所有取得内容须匹配固定发布树中的 Git blob。--closure all 会尝试扩大四个组件的 literal-include 闭包,仍受 64 MiB 限制;没有完整预处理器含义的条件分支也可能被捕获。UnresolvedLiteralIncludes 中的 Windows/其他 OS/编译器 builtin 条目不自动代表活跃编译缺项,真正活跃缺项以编译日志为准。NVIDIA 公开 RM 的 OS 选择不能被误认为 Linux 内核替换。

网络或容量边界导致停止时,捕获工具保留逐文件可校验的 partial lock 并返回失败,另存 CaptureFailure-*.json。首次失败在 build/Gpu/RmPort/CaptureFailure-1792056460382725900.json,续跑失败在 CaptureFailure-1792056538981266800.json。传输只允许官方 HTTPS 源并验证证书;连接复用不改变固定 Git blob、SHA 或逐文件许可检查。

备用官方 codeload 传输为单次有界尝试:

python Tools/Gpu/RmPort/AcquireArchive.py
# 只有下载完整成功后才使用;仅提取依赖闭包,不整库展开。
python Tools/Gpu/RmPort/CaptureReferences.py --closure all --archive

AcquireArchive.py 将压缩包、已有源码与元数据合计限制在 64 MiB;默认总时限 180 秒,显式 --maximum-seconds 只允许 15..600 秒,无无限重试。下载不重定向、不关闭证书验证,保留成功/失败 SHA 与日志;截断包不会成为完整 archive。实际本轮 codeload 返回 HTTP 200,取得 18,874,368 字节后触发 180 秒界,ArchiveFetch-1792056774642252100/Result.json 明确 Passed=false,总缓存 24,154,141 字节,没有执行 archive 提取或声称三个完整组件通过。后续完整包读取会逐文件核对 Git blob,拒绝路径越界、重复成员、异常索引规模和容量溢出。

原始文件保留全部版权与许可,COPYING 的完整正文及 SHA256 由锁和结果绑定。大部分取得文件是 MIT,仍按每个文件的 SPDX/原始声明判断;本工具不把未来另行取得的 GSP 二进制、CUDA 用户态驱动或全部 NVIDIA 组件都标为 MIT。目前没有捆绑 GSP/CUDA 二进制,未修改宿主驱动,没有访问 GPU 或 USB。