XTOS / OPEN SOURCE REAL-TIME SYSTEMOPEN SOURCE · VERSION 0.9.0 · BUILD FROM SOURCE
文档测试

测试

按主机构建、QEMU 客体和严格标记检查 XTOS。

本页目录

检查范围

源码基线是 OpenXTOS 提交 dd313955ad57542bcd2af8827157d1bbd0cf5e83。主机命令从仓库根目录执行。BUILD_ROOT 默认是 .build;构建和检查必须使用同一个值。

核对本文版本的文件可使用 git show HEAD:path。未提交修改不属于该提交。

检查入口结果
构建build_system.sh、build_system_arm64.sh、build_system_riscv64.sh生成内核、BusyBox、库和 initramfs;不能单独证明启动通过。
x86_64scripts/verify_system.sh检查 QEMU 退出、实时配置、模块、SDK 测试和工具,并要求 XTOS_SYSTEM_TEST=PASS。
跨架构基础启动verify_system_arm64.sh、verify_system_riscv64.sh检查内核、init、版本和启动日志;不是完整客体验收。
跨架构严格检查verify_guest_arm64.sh、verify_guest_riscv64.sh检查 realtime、配置、三个模块、三个测试、标记和 panic。必须 Failed: 0。
主机:记录提交、工作区状态和产物目录。
git rev-parse HEAD
git status --short
BUILD_ROOT="${BUILD_ROOT:-$PWD/.build}"
printf 'build_root=%s\n' "$BUILD_ROOT"

x86_64 自检

build_system.sh 生成 images/xtos-bzImage、images/xtos-rootfs.cpio.gz 和 images/kernel.config。verify_system.sh 启动 QEMU 时传入 console=ttyS0、rdinit=/init、xtos.selftest=1。

主机:构建后运行 x86_64 严格自检。
. ./scripts/reproducible_env.sh
JOBS=$(nproc) ./scripts/build_system.sh
QEMU_TIMEOUT=300 ./scripts/verify_system.sh
检查项通过条件
QEMU退出码为 0;timeout 不是通过。
系统标记去掉串口 CR 后有独立行 XTOS_SYSTEM_TEST=PASS。
失败扫描日志没有 XTOS_SYSTEM_TEST=FAIL 或 Kernel panic。
主机输出成功打印 system_qemu=pass log=…;失败打印 system_qemu=fail exit=… 并返回 1。
日志$BUILD_ROOT/system-qemu.log,默认是 .build/system-qemu.log。

客体中的 /usr/bin/xtos-selftest 使用 set -eu。

它要求 /sys/kernel/realtime 为 1,/proc/config.gz 含 CONFIG_PREEMPT_RT=y 和 CONFIG_XTOS_SCHED=y,加载 xtos_bci_core、xtos_bci_buffer、openbci_cyton,运行 test_rt、test_spsc、test_signal,检查 CSV JSON 的 status=ok,并检查 signal-benchmark 输出非空。

跨架构客体

主机先完成对应架构构建。ARM64 使用 kernel-install-arm64/Image、rootfs-arm64 和 ttyAMA0;RISC-V64 使用 kernel-install-riscv64/Image、rootfs-riscv64、ttyS0,以及 /usr/share/qemu/opensbi-riscv64-generic-fw_dynamic.bin。

主机:按需分别构建并运行严格客体检查。
JOBS=$(nproc) ./scripts/build_system_arm64.sh
QEMU_TIMEOUT=300 ./scripts/verify_guest_arm64.sh

JOBS=$(nproc) ./scripts/build_system_riscv64.sh
QEMU_TIMEOUT=360 ./scripts/verify_guest_riscv64.sh

verify_guest_* 复制已构建 rootfs,在副本中用 system/rootfs/xtos-guest-check 替换 /init,再生成 initramfs-arm64-guestcheck.cpio.gz 或 initramfs-riscv64-guestcheck.cpio.gz。

普通 initramfs 加 init= 参数不等价于该检查入口。

架构日志结果
ARM64$BUILD_ROOT/qemu-arm64-guestcheck-output.txt14 项、Failed: 0、ARM64 in-guest validation PASSED、退出 0。
RISC-V64$BUILD_ROOT/qemu-riscv64-guestcheck-output.txt15 项、Failed: 0、RISC-V 64 in-guest validation PASSED、退出 0。

客体标记

xtos-guest-check 挂载 proc、sysfs、devtmpfs 后输出状态。它会继续执行并输出 DONE;DONE 只表示到达末尾,不表示每项通过。主机脚本逐项查找标记,缺少一项就增加失败数。

标记检查内容
XTOS_GUEST_CHECK=START专用 /init 已运行。
realtime=1客体 /sys/kernel/realtime 为 1。
preempt_rt=y、xtos_sched=y/proc/config.gz 中两项配置为 y。
module_xtos_bci_core=okmodprobe 成功且 /sys/module/xtos_bci_core 存在。
module_xtos_bci_buffer=ok缓冲模块加载并在 sysfs 可见。
module_openbci_cyton=ok驱动模块加载;不代表真实设备绑定。
xtos_modules=pass三个模块检查通过。
guest_test_rt=pass/bin/test_rt 存在、可执行并返回 0。
guest_test_spsc=pass/bin/test_spsc 存在、可执行并返回 0。
guest_test_signal=pass/bin/test_signal 存在、可执行并返回 0。
guest_userspace=pass三个客体测试汇总通过。
XTOS_GUEST_CHECK=DONE检查结束,随后 sync、poweroff -f。
OpenSBIRISC-V64 的固件启动标记。
无 Kernel panic日志没有 panic。

guest 验证器用 tee 保存输出,并按标记判定;QEMU 输出管线状态被脚本忽略。检查日志末尾的关机过程。guest 检查器隐藏三个测试的标准输出,失败时在交互客体中单独运行测试。

交互客体

主机用 run_system.sh 启动普通 x86_64 控制台;它不传 xtos.selftest=1。

客体手动运行 xtos-selftest 不会自行关机,/init 自动模式才会在结束后关机。

/run/pipeline.json 和 /run/signal-benchmark.json 需在关机前读取。

主机:启动 x86_64 交互客体。
./scripts/run_system.sh
客体:检查运行内核、配置、自检退出值和 JSON。
uname -r
uname -m
cat /sys/kernel/realtime
zcat /proc/config.gz | grep -E '^CONFIG_(PREEMPT_RT|XTOS_SCHED|XTOS_BCI|XTOS_BCI_OPENBCI)='
/usr/bin/xtos-selftest
selftest_status=$?
printf 'selftest_exit=%s\n' "$selftest_status"
cat /run/pipeline.json
cat /run/signal-benchmark.json
x86_64 客体路径;ARM64/RISC-V64 路径是 /bin/test_rt、/bin/test_spsc、/bin/test_signal。
/usr/libexec/xtos/test_rt
/usr/libexec/xtos/test_spsc
/usr/libexec/xtos/test_signal

test_rt 覆盖调度、CPU 亲和性、无效参数和权限边界,并允许实时调度或锁内存的预期权限错误。test_spsc 覆盖空满、顺序、无效帧和并发。test_signal 覆盖时间戳、DFT 能量、滤波、SSVEP 和 P300。通过不等于硬件最坏调度延迟指标。

保存日志

验证器会覆盖固定日志。重跑前把日志复制到新目录,并记录源码提交、工具链、QEMU 版本、BUILD_ROOT 和超时。结果应包含命令、脚本状态、客体标记和失败输出。

主机:保存已有日志和工作区状态。
BUILD_ROOT="${BUILD_ROOT:-$PWD/.build}"
evidence_dir=$(mktemp -d "$HOME/xtos-evidence.XXXXXX")
git rev-parse HEAD > "$evidence_dir/source-commit.txt"
git status --short > "$evidence_dir/worktree.txt"
for logfile in system-qemu.log qemu-arm64-guestcheck-output.txt qemu-riscv64-guestcheck-output.txt; do
  if [ -f "$BUILD_ROOT/$logfile" ]; then
    cp -p "$BUILD_ROOT/$logfile" "$evidence_dir/"
  fi
done
printf 'evidence=%s\n' "$evidence_dir"
  • QEMU 检查软件启动、客体配置、模块加载和用户态测试。
  • CSV fixture 和信号基准使用软件输入,不证明真实 EEG 设备。
  • 模块可加载不等于设备注册、串口绑定、样本单位或端到端采集正确。
  • 目标硬件时延、抖动、持续负载和 OpenBCI 接通须单独测量。

源码:scripts/verify_system.sh、scripts/verify_system_arm64.sh、scripts/verify_system_riscv64.sh、scripts/verify_guest_arm64.sh、scripts/verify_guest_riscv64.sh、system/rootfs/init、system/rootfs/xtos-guest-check、system/rootfs/usr/bin/xtos-selftest 和三个 SDK C 测试。