pipinovi4/ga107m-bar1-bad0ac
GitHub: pipinovi4/ga107m-bar1-bad0ac
一套用于诊断 NVIDIA GA107M GPU BAR1 孔径返回未文档化「0xBAD0ACxx」无效响应的只读硬件故障调查工具。
Stars: 0 | Forks: 0
# NVIDIA BAR1 `0xBAD0ACxx` 响应调查
本仓库记录了在读取发生故障的 NVIDIA GA107M GPU 的 BAR1 PCI 孔径时观察到的、可重现且显然未被官方记录的响应。
在测试系统上,每次只读对齐的 32 位访问返回的值都符合:
```
0xBAD0ACxx
```
高 24 位保持固定,而低字节的表现类似于每次读取的全局计数器。PCIe Function Level Reset (FLR) 会重置该计数器,而解绑 NVIDIA 驱动则不会。
## 测试系统
| 项目 | 值 |
|---|---|
| 笔记本电脑 | Acer Nitro AN515-45 |
| GPU | NVIDIA GA107M,GeForce RTX 3050 Laptop GPU |
| PCI ID | `10de:25a2` |
| 子系统 | `1025:151e` |
| VBIOS | `94.07.3A.00.AA` |
| VBIOS 转储 | 65,024 字节,有效的 8 位校验和 |
| PCIe 链接 | Gen3 x8 |
| BAR1 孔径 | 4 GiB |
| NVIDIA RM 故障 | `RmInitAdapter failed! (0x31:0x40:2780)` |
PCIe 链路训练正常,BAR 分配有效,且未观察到 AER/通道错误。NVIDIA RM 初始化仍然失败,并且 `nvidia-smi` 报告 `No devices were found`。
## 主要观察结果
### 1. 与偏移量无关的响应
在不同 BAR1 偏移量处进行的只读对齐 32 位访问返回了一个全局序列:
```
0xbad0ac8f
0xbad0ac90
0xbad0ac91
...
```
改变偏移量并没有改变响应模式。
### 2. 重置行为
- 驱动程序解绑**没有**重置低字节序列。
- PCIe FLR 重置了它。
- 重置后立即观察到的起始值为:
```
0xbad0ac00
0xbad0ac00
0xbad0ac01
0xbad0ac02
...
```
这表明该响应是在 NVIDIA PCI 功能内部或其 FLR 重置域中的另一个模块内生成的,而不是由用户空间或上游 PCIe 根端口生成的。
### 3. 全孔径稀疏扫描
从完整的 4 GiB BAR1 孔径的每个 1 MiB 区域采样了一个对齐的 DWORD:
| 结果 | 计数 |
|---|---:|
| 样本数 | 4,096 |
| `0xBAD0ACxx` | 4,096 |
| 其他值 | 0 |
### 4. 分层 1% 扫描
该孔径包含 1,073,741,824 个对齐的 DWORD 位置。它被划分为由 100 个 DWORD 组成的连续组,并使用种子 `12345` 从每组中选择了一个伪随机 DWORD。
| 结果 | 计数 |
|---|---:|
| 样本数 | 10,737,419 |
| `0xBAD0ACxx` | 10,737,419 |
| 其他值 | 0 |
| 计数器不连续 | 0 |
这意味着完整孔径的每个 400 字节区域都由一个随机选择的读取来表示。
### 5. 部分穷举扫描
只读顺序扫描达到了:
| 结果 | 值 |
|---|---:|
| 已读取的 DWORD | 780,000,000 |
| 覆盖的孔径 | 72.64% |
| `0xBAD0ACxx` | 780,000,000 |
| 其他值 | 0 |
运行通过 `Ctrl+C` 被手动中断;因此它**没有**被描述为已完成的穷举扫描。
## 解释
观察结果强烈表明,`0xBAD0ACxx` 是在尚未建立正常的 BAR1 到帧缓冲区的映射时返回的一种合成的无效/未映射访问或 poison 响应。
它们**并不能**确定物理故障。可能的原因仍然包括:
- GDDR6 设备;
- 内存 PHY/控制器;
- 内存供电或时序;
- 板级连接性;
- VBIOS 内存初始化;
- 另一个早期的 GPU 启动失败。
BAR1 是一个孔径,而不是自动映射的原始物理 VRAM。这些工具测试的是 CPU 可见的 BAR1 行为;它们并不能证明读取到了物理 VRAM 的内容。
## 之前的公开观察
这里的新贡献在于直接的 CPU 端 BAR1 复现、偏移量无关性测试、FLR 重置行为,以及在 GA107M 上进行的大规模只读扫描。
## 构建
```
make
```
二进制文件位于 `build/` 中。
## 工具
### 最小对齐读取器
```
sudo ./build/bar1read32 \
/sys/bus/pci/devices/0000:01:00.0/resource1 \
0x0 16
```
### 稀疏全孔径扫描
每 1 MiB 读取一个 DWORD:
```
sudo ./build/bar1_sparse_scan \
/sys/bus/pci/devices/0000:01:00.0/resource1 \
1 sparse.csv
```
### 分层扫描
每 100-DWORD 组随机读取一个 DWORD,种子为 `12345`:
```
sudo ./build/bar1_stratified_scan \
/sys/bus/pci/devices/0000:01:00.0/resource1 \
anomalies.csv 12345 100 0
```
最后的 `0` 表示没有样本限制:扫描所有组。
### 穷举对齐扫描
```
sudo ./build/bar1_exhaustive_scan \
/sys/bus/pci/devices/0000:01:00.0/resource1 \
anomalies.csv
```
`Ctrl+C` 请求正常停止并保留部分统计数据。
## 安全与范围
- 所有包含的工具均以只读方式打开资源。
- 不执行任何 BAR0/BAR1 写入。
- 不执行任何 PCI 配置写入。
- 本仓库**不自动执行** FLR。
- 在测试发生故障或不稳定的 PCIe 设备之前,请保存正在进行的工作。
- 在测量计数器连续性时,不要同时运行 MATS、MODS、`nvidia-smi` 或其他 BAR1 测试。
## 仓库结构
```
.
├── README.md
├── LICENSE
├── CITATION.cff
├── Makefile
├── CONTRIBUTING.md
├── src/
│ ├── bar1read32.c
│ ├── bar1_sparse_scan.c
│ ├── bar1_stratified_scan.c
│ └── bar1_exhaustive_scan.c
├── scripts/
│ └── collect-system-info.sh
├── docs/
│ ├── observations.md
│ ├── nvidia-forum-draft.md
│ ├── upstream-issue-draft.md
│ ├── prior-art.md
│ └── publishing.md
└── logs/
├── README.md
├── sparse-1mib-summary.txt
├── stratified-1pct-seed-12345.txt
└── exhaustive-partial-72.64pct.txt
```
## 建议的上游途径
1. 发布此仓库。
2. 将详细报告发布到 NVIDIA Developer Forums,Graphics / Linux 板块。
3. 在 EnvyTools 中开启一个 issue,询问该观察结果应归入硬件文档的何处。
4. 与 Nouveau 社区讨论。
5. 仅在维护者确定了正确的文件/分支之后,再提交文档 PR。
6. 可选择开启一个单独的 NVIDIA open-kernel-modules issue,同时注意该故障在专有的 RM 路径下也会发生。
## 许可证
MIT。请参阅 [许可证](LICENSE)。
标签:客户端加密