# tjuros **Repository Path**: shr1mpA/tjuros ## Basic Information - **Project Name**: tjuros - **Description**: tju 基于rcore的os - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-09-01 - **Last Updated**: 2026-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tjuros — 基于 rCore 的简易文件系统与 Shell 扩展 > 操作系统综合实践课程设计 / 题目三 > 计划书见 [`计划书.md`](./计划书.md) ## 1. 项目简介 在 [`rcore-os/rCore-Tutorial-v3`](https://github.com/rcore-os/rCore-Tutorial-v3) 基线上做增量扩展: - **文件系统内核扩展**:`rename` / `mkdir` / `rmdir` / 增强 `readdir` - **简易权限机制**:inode 上加 mode 位,实现 `rwx` 校验 - **文件信息统计系统调用**:`stat` / `getcwd` / `ls -l` 支持 - **Shell 增强**:`>>` 追加重定向、`&` 后台运行、`;` 命令分隔、内建命令(cd / pwd / mkdir / rm / mv / chmod / stat) - **测试 + 性能对比**:与原版做功能与时延对比 --- ## 2. 环境搭建 ### 2.1 系统依赖(Ubuntu 22.04/24.04/26.04) ```bash sudo apt update sudo apt install -y build-essential qemu-system-riscv64 gcc-riscv64-unknown-elf ``` ### 2.2 Rust 工具链 仓库根的 `rCore/rust-toolchain.toml` 已经固定 nightly 版本,**只要装了 `rustup`,进入 `rCore/` 会自动切换**。 ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" rustup target add riscv64gc-unknown-none-elf cargo install cargo-binutils --vers 0.3.3 rustup component add llvm-tools-preview rust-src ``` > 如果 `cargo build` 报 `can't find crate for 'core'`:`rustup component add rust-src`。 ### 2.3 rcore-fs-fuse(打包文件系统镜像用) ```bash cargo install rcore-fs-fuse --git https://github.com/rcore-os/rcore-fs ``` --- ## 3. 构建与运行 **所有命令都在 `rCore/` 目录下执行**: ```bash cd rCore # 第一次跑:编译 OS + 编译用户程序 + 打包磁盘镜像 + 启动 QEMU make run ``` 启动后会自动进入 user shell `>> ` 提示符。输入 `help`(如果有)查看可用命令。 ### 3.1 常用 Makefile 目标 | 命令 | 作用 | |---|---| | `make run` | 编译并启动 QEMU | | `make build` | 仅编译(生成 `os/target/.../kernel.bin` 和 `user/build/disk.img`) | | `make debug` | 启动 QEMU + 自动开 gdb(需要 `tmux` + `riscv64-unknown-elf-gdb`) | | `make asm` | 反汇编内核 | | `make clean` | 清理所有编译产物 | | `make fmt` | 格式化所有 crate | | `make docker` | 用官方 Docker 镜像跑(已配齐依赖) | ### 3.2 退出 QEMU `Ctrl + a` 松开,再按 `x`。 --- ## 4. 在扩展版本上工作 ### 4.1 分支策略 ``` main # 稳定分支(PM 维护) feat/m1-fscore # 组员1:文件系统内核扩展 feat/m2-perm # 组员2:文件权限机制 feat/m3-stat # 组员3:文件信息统计 syscall feat/m4-shell # 组员4:Shell 增强 test/docs # 组员5:测试 / 性能 / 文档 ``` ### 4.2 推荐开发节奏 ```bash # 第一次拉代码 git clone https://gitee.com/shr1mpA/tjuros.git cd tjuros/rCore git checkout feat/m1-fscore # 或你负责的分支 # 边写边提交,commit 粒度 ≤ 半天 git commit -m "feat(m1): add mkdir syscall" # 每天 18:00 前推 PR,由 PM 合并 git push origin feat/m1-fscore ``` ### 4.3 新增 syscall 三步走(以 `mkdir` 为例) > 涉及 3 个文件、3 处编号、3 处名字,**三处必须同时改**。 ```rust // 1. os/src/syscall/mod.rs const SYSCALL_MKDIR: usize = 290; // ↓ 加入 match 分支 SYSCALL_MKDIR => sys_mkdir(args[0] as *const u8), // 2. os/src/syscall/fs.rs pub fn sys_mkdir(path: *const u8) -> isize { /* ... */ } // 3. user/src/syscall.rs const SYSCALL_MKDIR: usize = 290; pub fn sys_mkdir(path: &str) -> isize { syscall(SYSCALL_MKDIR, [path.as_ptr() as usize, 0, 0]) } ``` ### 4.4 修改 `easy-fs`? **不要动磁盘布局**(避免和原版镜像不兼容)。只在 VFS 层(`os/src/fs/inode.rs`)扩展。 --- ## 5. 目录速查 ``` rCore/ ├── os/ # 内核 │ ├── src/ │ │ ├── fs/ # ← M1/M2 主战场 │ │ │ ├── inode.rs # OSInode + InodeMeta │ │ │ └── mod.rs │ │ ├── syscall/ # ← M1/M2/M3 注册入口 │ │ │ ├── fs.rs │ │ │ └── mod.rs │ │ └── main.rs │ └── Makefile ├── user/ # 用户态 │ └── src/ │ ├── bin/ # ← M3/M4 用户程序入口 │ │ ├── user_shell.rs # M4 主战场 │ │ ├── stat.rs # M3 新增 │ │ ├── ls.rs # M3 新增 │ │ └── pwd.rs # M3 新增 │ ├── syscall.rs # ← M1/M2/M3 用户态 stub │ └── lib.rs ├── easy-fs/ # 简单文件系统(不要改) ├── easy-fs-fuse/ # 镜像打包工具 └── Makefile ``` --- ## 6. 跑测试 ```bash cd rCore # 基础 IO 压力(组员 5 提供) make run >> filetest_basic # Shell 工作流脚本(组员 5 提供) >> shell_demo ``` 详细测试数据见 `docs/test_logs/`。 --- ## 7. 提交规范 - **commit 粒度**:半天至少 1 次。 - **commit 格式**:`feat(m1): add mkdir syscall`、`fix(m2): perm check for write`、`docs: update 计划书`。 - **PR**:每天 18:00 之前开 PR,由 PM(组员 1)review。 --- ## 8. 常见问题 **Q1:`make run` 报错 `failed to open SFS`** A:磁盘镜像没生成成功。先 `cd user && make clean && make build`,再 `cd .. && make run`。 **Q2:QEMU 启动后黑屏 / 没输出** A:检查 `qemu-system-riscv64` 版本 ≥ 7.0。Ubuntu 22.04 自带的版本较老,建议用 `apt` 安装最新版或手动编译。 **Q3:`cargo build` 报 `can't find crate for 'core'`** A:`rustup component add rust-src`,并在 `rCore/` 目录下 `source setenv.sh`。 **Q4:修改用户程序后没生效** A:`cd user && make clean && make build`,再回到 `rCore/` 执行 `make run`。或者直接 `make clean && make run`。 --- ## 9. 进度与文档 - 计划书:[`计划书.md`](./计划书.md) - 设计文档:`docs/design.md` - 测试日志:`docs/test_logs/` - 报告:`docs/report.md` - 答辩 PPT:`docs/slides.pptx` --- ## 10. 参考资料 - [rCore-Tutorial-v3 官方文档](https://rcore-os.github.io/rCore-Tutorial-Book-v3/) - [rCore-Tutorial-v3 仓库](https://github.com/rcore-os/rCore-Tutorial-v3) - [rCore API Docs](https://rcore-os.github.io/rCore-Tutorial-v3/)