Skip to content

oskernel: add initial arch layer for riscv64 wrappers

不让内核死机 requested to merge restore/reapply-ext4 into main

This reverts commit 129a7747fce86b本 MR 在 oskernel/ 中引入初始 arch/ 架构分层,为后续支持 LoongArch64 的 kernel-la 做准备。

本次改动只做架构边界整理和低风险 wrapper 封装,不修改 EXT4、runner、syscall 语义逻辑,不修改 baseline-rcore。当前仍只有 RISC-V 参与实际编译和运行,LoongArch64 仅建立目录和 TODO 占位。

主要改动

  1. 新增 arch 目录结构

新增:

oskernel/os/src/arch/ mod.rs riscv64/ loongarch64/

其中:

arch/mod.rs 通过 #[cfg(target_arch = "riscv64")] 默认导出 arch/riscv64 arch/riscv64/ 提供当前 RISC-V 架构相关 wrapper arch/loongarch64/ 仅建立占位文件,暂不参与 RISC-V 编译 2. RISC-V 侧封装低风险架构接口

当前已封装接口:

pub fn shutdown() -> !; pub fn shutdown_failure() -> !; pub fn init_console(); pub fn console_putchar(c: u8); pub fn init_timer(); pub fn current_time() -> usize; pub fn set_next_timer(); pub fn init_trap();

这些 wrapper 内部继续调用原有 RISC-V 实现,包括:

SBI shutdown / failure shutdown UART init / putchar RISC-V time CSR timer interrupt 初始化 原 trap::init() 3. main 启动路径接入 arch wrapper

oskernel/os/src/main.rs 中启动初始化路径调整为:

arch::init_console(); arch::init_trap(); arch::init_timer(); arch::shutdown();

保持现有 RISC-V 行为不变。

  1. 通用层改为通过 arch 转发

以下模块中的 shutdown / console / timer 调用改为走 crate::arch::*:

oskernel/os/src/console.rs oskernel/os/src/timer.rs oskernel/os/src/lang_items.rs oskernel/os/src/task/mod.rs oskernel/os/src/fs/inode.rs 5. 新增架构状态文档

新增:

docs/ARCH_STATUS.md

记录内容包括:

当前 arch 分层状态 已封装 RISC-V wrapper 必须放入 arch/ 的架构相关内容 不迁移到 arch/ 的架构无关内容 后续 LoongArch64 最小启动目标 本轮验证结果 本 MR 不包含的内容

本 MR 不做以下修改:

不修改 EXT4 解析逻辑 不修改 VFS / 文件路径读取语义 不修改 runner 脚本解析和测试调度逻辑 不修改 syscall 语义实现 不修改文件描述符表 不实现 LoongArch64 启动 不实现 LoongArch64 trap / syscall / 页表 / 上下文切换 不修改 baseline-rcore 后续计划

下一阶段 LoongArch64 方向计划:

增加 kernel-la 构建目标 实现 LoongArch64 最小启动入口 实现 LoongArch64 串口输出 实现 LoongArch64 主动 shutdown 保持 RISC-V kernel-rv 当前行为和日志检查不回退

RISC-V 主线仍继续推进:

完整扫描 /glibc、/musl 自动发现 *_testcode.sh 串行执行测试脚本 继续补齐 syscall / runner 执行闭环 验证结果

已执行:

cd oskernel make kernel-rv

cd .. QEMU=$(which qemu-system-riscv64) bash scripts/run_ours.sh python3 scripts/check_ours_log.py --log logs/ours/qemu.log --strict-syscalls

验证结果:

make kernel-rv 通过 成功生成 oskernel/kernel-rv strict syscall trace 检查通过 logs/ours/exit_code.txt = 0 日志仍包含 EXT4 读取 /glibc/basic_testcode.sh runner 仍能解析第一条 busybox echo 命令 wait4 仍能成功回收 child:[runner] wait4 ret = 1 注意事项

当前日志没有出现独立的 busybox echo 输出行,只能看到 runner 解析出的:

OS COMP TEST GROUP START basic-glibc

同时 child 后续仍会触发已有 illegal instruction 并以 -4 退出。使用旧 os.bin 对照运行也呈现相同行为,因此判断该现象不是本 MR 的 arch 分层引入的变化。

本 MR 的目标是架构分层准备,不改变当前执行语义。09b77ada461b82f563d2c65305.

Merge request reports