# 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](RmSources.lock.json)。所有下载和引用缓存仅进入 `build/Gpu/RmSources`,包含元数据在内总量限制为 **64 MiB**;不写共享 `.tools`、全局缓存或宿主驱动。 ## 复现 在本工作树根目录执行: ```powershell 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、随机与错误清理;不以返回成功的空实现代替。 ## 更新固定引用集 仅维护者在有意扩大移植范围时执行: ```powershell 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 传输为单次有界尝试: ```powershell 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。