基于 Rust 开发的 RISC-V 64 位操作系统内核,集成 C++ 计算图引擎、GPU 图形子系统与自定义网络协议栈。
- Neuro-Vana-CPU 计算图引擎 — C++ 实现的张量运算与自动求导引擎,支持 LSTM、MLP 等神经网络结构,通过
/dev/graph设备节点暴露给用户态,配套零拷贝大页 IPC - GPU 图形子系统 — VirtIO GPU 驱动,支持 framebuffer 渲染与 SDL 显示,已实现俄罗斯方块、贪吃蛇等图形应用
- 自定义网络协议栈(lose-net-stack) — 支持 TCP/UDP 套接字通信
- 功能丰富的 Shell — 支持管道(
|)、I/O 重定向(<>>>)、后台执行(&)、命令行编辑、ANSI 彩色输出 - 进程与线程管理 — fork/exec/waitpid 进程模型,线程创建与同步原语
- 文件系统 — 基于 easy-fs 的简易文件系统,通过 VirtIO Block 设备挂载
- 内存管理 — 页表管理、大页分配(2MB)、写时复制(COW)、mmap 共享内存
推荐使用 Docker 运行,避免宿主机 Rust nightly、Cargo 镜像、QEMU、RISC-V 交叉编译器版本不一致:
./scripts/docker-mindos.sh run图形界面:
# 先无头回归(无需显示器)
./scripts/docker-mindos.sh test-gui-clear
# 再启动 SDL 窗口
./scripts/docker-mindos.sh run-gui调试:
./scripts/docker-mindos.sh debug完整说明见 Docker 使用说明。
- Rust nightly(
riscv64gc-unknown-none-elftarget) - QEMU(
qemu-system-riscv64) riscv64-linux-gnu-g++(用于编译计算图引擎的 C++ 代码)
# 编译内核与用户程序,生成文件系统镜像
cd os && make build
# 命令行模式运行
make run
# 图形界面模式运行
make run-gui# 启动 QEMU 等待 GDB 连接
make gdbserver
# 另开终端连接 GDB
make gdbclientrcore_workspace/
├── os/ # 内核代码(Rust)
│ └── src/
│ ├── trap/ # 中断/异常处理
│ ├── task/ # 进程/线程管理
│ ├── mm/ # 内存管理
│ ├── syscall/ # 系统调用
│ ├── fs/ # 文件系统
│ ├── drivers/ # 设备驱动(GPU、VirtIO、PLIC)
│ ├── device/ # 字符设备(/dev/graph)
│ └── net/ # 网络子系统
├── user/ # 用户态程序(Rust)
│ └── src/
│ ├── bin/ # 可执行程序与测试
│ ├── app/ # Shell 与应用库
│ └── syscall.rs # 系统调用封装
├── neuro-engine/ # C++ 计算图引擎(Neuro-Vana-CPU)
├── easy-fs/ # 简易文件系统实现
├── easy-fs-fuse/ # 文件系统镜像打包工具
├── lose-net-stack/ # 自定义网络协议栈
├── virtio-drivers/ # VirtIO 设备驱动(vendored)
└── riscv/ # RISC-V 寄存器/指令封装(vendored)
本项目使用 MIT 许可证。详见 LICENSE 文件。
项目中的第三方组件遵循各自的许可证:
virtio-drivers/— MIT (rCore Developers)riscv/— MPL 2.0qemu-7.2.0/— GPL 2.0 / LGPL 2.1
提交流程如下:
评测系统会启动一个基础镜像 在里面对上交代码执行make all,预期得到两个elf文件,分别为针对RISC-V架构的kernel-rv 和 LoongArch 架构的 kernel-la,这一步可以有一个disk.img作为自己的文件系统镜像
接下来是对内核的要求,评测时会挂载一个EXT4格式的"硬盘"镜像,内核在启动后需要识别并读取里面的内容,然后依次(串行)执行里面每一个*_testcode.sh的脚本,或者依次执行里面的elf测试文件。(修改main函数)
测试通过捕获屏幕输出记分,所以运行测试的输出要严格遵守题目要求
运行结束后需要主动关机,否则会持续计时
另有两点说明,对于第三方工具,需要以源码形式提交并和内核一并编译,clone项目时,.开头的文件会被忽略,如果需要包括进去需要改名,然后再makefile里改回去
运行测试方法 ./scripts/docker-mindos.sh test /path/to/test-fs.img