内核验证

定向检查

从本仓运行受影响目标;作为父仓子模块时 TMPDIR 使用父仓 out/tmp:

make O=out/check -j4 all
make O=out/check test-tools test-header-export test-vdso
make O=out/check test-boot test-boot-logo test-panic-console test-module-layout

module-layout 检查本地 Kbuild、重复/遗漏对象、生产实现包含和上游引擎摘要。 宿主工具/ASan/UBSan、头导出、自包含 C/C++、ELF 和真实运行是不同层次。 ABI 变化必须明确审查,不通过重生成历史 golden 消除差异。

测试归属

tools/test_*.py、tools/tests/ 与 tests/host/ 保存内核实现、 驱动、文件系统、调度、内存管理和 Linux UAPI 的宿主测试、原生系统调用探针、 夹具及参考头。它们使用本仓源码与头文件,不依赖 ReliefOS 父仓的用户态或 构建目录。固定 syscall 表及其维护生成器也由本仓持有。

独立 checkout 或源码归档中可运行:

mkdir -p out/tmp
TMPDIR="$PWD/out/tmp" make O=out/check test-ownership test-host-smoke
TMPDIR="$PWD/out/tmp" make O=out/check test-host
python3 tools/test_host.py --list
python3 tools/test_host.py --suite drm --suite svga --output out/drm-tests

tools/tests/host-suites.list 显式登记宿主套件和必要参数;runner 保留各套件 日志及 results.json,任何失败均返回非零,后续套件仍会执行以形成完整报告。 test-host-smoke 是 CI 中的定向门禁;完整 test 还包括所有宿主套件、 ABI golden、导出头、启动、vDSO、徽标、panic、Kconfig 和模块布局检查。 仅有 Linux 参考探针通过,不表示相同接口已在 ReliefNT 来宾运行通过。

procfs 套件执行真实 proc/VFS/fdinfo 的 ASan/UBSan 夹具,并在宿主 Linux 编译运行 tools/tests/procfs_probe.c 作为 ABI 参考。探针检查系统/进程节点、 seek、maps、二进制 auxv、描述符和多线程 thread-self;来宾验证应由操作系统 使用其 SDK 编译该探针后实际运行,并与宿主结果分别记录。

同套件还运行无需 libc 的 tools/tests/procfs_raw_probe.c。该探针可编译为 initramfs 的 /init,通过 rdinit=/init 在真实挂载的 procfs 上验收; PID 1 将结果写入串口并等待。编译示例:

cc -std=c11 -O2 -Wall -Wextra -Werror -ffreestanding -fno-builtin \
   -fno-stack-protector -nostdlib -static -no-pie -Wl,-e,_start \
   -Wl,-Ttext-segment=0x400000 -Iinclude/uapi \
   tools/tests/procfs_raw_probe.c -o <initramfs-root>/init

来宾验收分别记录单核和多核启动的完整串口日志、内核与探针摘要; 出现 PASS 后仍需检查没有 FAIL 或 panic,不能只以启动完成代替 syscall 验证。

service_roles 套件检查旧内核桌面实现未恢复、旧窗口服务权限标志未恢复, 以及 exec 只保留允许的任务标志;这些内核源码检查由本仓持有,父仓不再重复。

syscall_io 套件覆盖真实设备节点标志组合下的 /dev/null 写入、访问模式、 O_PATH 和 Linux MAX_RW_COUNT 上限,避免通用设备分片截短空设备写入。 其原生探针 tools/tests/syscall_io_runtime_probe.c 编译后可用 --null 单独检查大块写入、原始 write syscall、dup 和 writev;默认模式继续运行综合 POSIX I/O 检查。宿主 Linux 参考运行与 ReliefNT 来宾执行分别记录。

test-smp-time、test-page-cache-growth、test-user-return、 test-syscall-io、test-vdso-host 和 test-version 提供定向入口。 make test-ext4-reference LINUX_REFERENCE=<目录> 检查 ext4 schema, 需要已有 Linux 参考树; 它不会下载参考源码。互操作检查需要宿主 e2fsprogs。 音频探针 --build-guest 需要显式传入由操作系统提供的 --sdk。

兼容性基线

tools/tests/abi_layout_golden.json 保留原始布局基线; tools/tests/fixtures/legacy-abi-layout.json 保存旧导出面的原始布局记录, 迁移时逐字保留,两份均不能通过重生成来掩盖布局变化。 驱动服务表版本 2 的 17 个追加字段在 tools/tests/fixtures/driver-api-v2.json 单独冻结:168 字节旧前缀的类型与 偏移仍与原始基线比较,当前服务表总长为 304 字节、对齐为 8。 make test-abi 同时检查旧前缀与追加字段,版本、大小、偏移和类型变化 均需显式审查。abi_layout_checks 套件包含对应的失败反例;驱动管理器的 driver_modules 套件验证旧版本、未知版本和错误描述符大小在 init 前被拒绝。 这不表示版本 1 驱动二进制能在版本 2 内核运行。

音频 ioctl 支持清单为 configs/audio-abi-support.json。 宿主门禁检查标志类型、构建前提、证据路径和验证范围;来宾、上游 ALSA 与 硬件声明必须有对应说明,缺少证据声明的反例应失败。清单保留已有的验证标志 和未解决项;这些静态检查不重新执行历史来宾测试,不构成新的运行验收。 linux_audio 的 ASan/UBSan 探针遇到未定义行为立即失败,不将带有 sanitizer 错误的零退出状态计为通过;PCM 回归覆盖尚无 DMA 缓冲区时的 DROP。

sched_wakeup 套件覆盖生产调度唤醒与 SMP IPI 的逻辑 CPU/APIC 映射、启动 交接、合并通知、本地 IRQ 状态、离线/单核及停止/vfork 任务边界。输入 IRQ 夹具另检查重新调度向量不会被当成 timer 或 PIC 中断。I/O 预算测试在旧 uptime 停止增长时检查续传、偏移与完整结果;vDSO/timekeeper 测试区分内部 CPU 本地工作计数与用户可见时钟。framebuffer 的 guard-page 夹具检查精确 像素范围、未对齐来源和行尾边界,既有 FIFO 满时的损伤重试仍须通过。

同一调度套件检查 IRQ 延迟时的公平时间计费、ACPI PM 回绕及源切换;APIC 夹具检查 100/250/1000 Hz 的计数与失败回退。private_fault_transactions 使用真实缺页分发、页表和返回谓词,检查无抢占请求时的私有页直接恢复, 以及远端通知、信号、停止、亲和性和失效帧仍进入调度路径。

process_priority 使用真实 syscall 分发验证 PRIO_PROCESS 的同属主父进程 降优先级、跨属主拒绝、CAP_SYS_NICE、升优先级拒绝、数值钳制、ESRCH 和 Linux 返回值编码;不修改宿主进程的调度状态。整机还需验证 XDM/IceWM 与用户终端分别继承预期优先级,不能以临时 root 提权实验代替启动链检查。

pat 套件覆盖生产 PAT 引导/AP 策略及真实页表的 UC 到 WC 转换: 功能缺失、固件布局、写回读失败、冲突别名/租约、RAM、用户页表阶段与 失败原子性。VMware 引导夹具检查可预取 BAR、FIFO 交叠和模式切换策略; SVGA 夹具检查 FIFO 初始化不把已保留的 WC 显存重新声明为 UC。

目标运行

启动检查固件与内核完成、PID 1;系统调用探针必须实际进入来宾。 panic 验证还需真实异常与画面,徽标需检查数量、留距和移除。 主仓提供集成 QEMU 工具,但它们不是本仓新增产品;每次记录源码与二进制 摘要,保留源镜像。VMware 与物理硬件未验证不能记作通过。