# 操作系统实践 **Repository Path**: tianfengll/operating-system-practice ## Basic Information - **Project Name**: 操作系统实践 - **Description**: 操作系统综合实践11 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-01 - **Last Updated**: 2026-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xv6-RISC-V 进程沙箱与系统调用审计 > 操作系统综合实践课程项目|基于 MIT xv6-riscv 改造 本项目在 xv6-RISC-V 上实现了一个进程级沙箱原型:进程可安装不可放宽的系统调用白名单,并设置子进程、文件描述符和内存配额。内核同时记录系统调用审计日志,供用户态读取和核对。 ## 项目完成内容 - **系统调用白名单**:沙箱进程只允许执行位图中指定的系统调用;被拒绝的调用返回 `-1` 并记录为 `AUDIT_DENIED`。 - **未知调用处理**:非法系统调用号返回 `-1`,记录为 `AUDIT_UNKNOWN`,不会导致内核崩溃。 - **一次性策略安装**:`sandbox_enter()` 只能成功一次,进程不能自行撤销或放宽已有策略。 - **策略继承与生命周期**:fork 后子进程继承白名单和资源上限;进程槽位创建、回收与复用时清理沙箱状态,避免残留。 - **资源配额**:限制子进程数、打开 fd 数和内存上限;`sbrk()` 与 `sbrklazy()` 都受内存配额约束。 - **审计日志**:记录 `BASELINE`、`ALLOWED`、`DENIED`、`QUOTA`、`UNKNOWN` 五类事件;固定大小环形缓冲满载后覆盖最旧记录。 - **多核审计快照**:写入与快照复制由锁保护,先在锁内取得一致快照,再在锁外复制到用户态,避免并发读写导致记录混杂。 ## 系统结构 ```text 用户程序 │ sandbox_enter / audit_read / sandbox_status ▼ 系统调用分发 syscall() ├─ 未进入沙箱:正常执行,记录 BASELINE ├─ 白名单允许:正常执行,记录 ALLOWED ├─ 白名单拒绝:返回 -1,记录 DENIED └─ 未知编号:返回 -1,记录 UNKNOWN │ ├─ fdalloc() ─────── fd 配额检查 ├─ kfork() ───────── 子进程配额检查 └─ growproc/sys_sbrk 内存配额检查(eager / lazy) ▼ 审计环形缓冲区(256 条)── audit_read() / sandbox_status() ``` ## 快速开始 项目应在 **WSL/Linux** 中构建和运行。Windows PowerShell 中没有 `make` 是正常现象;先进入 WSL。 ```bash cd "/mnt/e/schoollesson/大三上/操作系统综合实践/xv6-riscv" riscv64-unknown-elf-gcc --version qemu-system-riscv64 --version make TOOLPREFIX=riscv64-unknown-elf- qemu CPUS=1 ``` 出现 xv6 的 `$` 提示符后,可输入: ```text t2test # T2:未进入沙箱的普通进程不受影响 t3test # T3:沙箱字段继承、清理与进程槽位复用 syscalltest # T4–T8:白名单允许、拒绝、未知调用、策略锁定、fork/exec 继承 quotatest # T9–T13:fd、child、eager/lazy 内存配额及回收 audittest # T14–T17:审计读取、非法地址、监控调用、环形缓冲满载 m3stress # T18:审计读写与配额的综合压力测试 m3audit # 审计类型和状态快照的集成验证 usertests # xv6 官方完整回归 ``` 退出 QEMU:按 `Ctrl+A`,松开后按 `X`。 ## 自动化测试与复现 以下命令在 WSL 的项目根目录执行: ```bash # 甲负责的核心联调:T2、T3、T11、T12、T13;CPUS=1 和 CPUS=3 sh scripts/run_m3_core.sh # M3 快速/完整回归:覆盖功能、审计、压力和单核/三核组合 python3 scripts/run_m3.py --quick python3 scripts/run_m3.py # 性能矩阵:原版 / 改造版审计关闭 / 改造版审计开启 python3 scripts/run_m3_performance.py ``` 自动化脚本会将原始运行日志写入 `artifacts/m3/`,不会用“重试成功”覆盖原始失败记录。 ## M3 验收摘要 最终验收提交:`f6ab33a`;M3 标签:`m3`。 | 项目 | 结果 | |---|---| | 快速回归(CPUS=1 / 3) | 22/22 PASS | | xv6 官方 `usertests` | CPUS=1 PASS;CPUS=3 干净镜像复验 PASS | | 多核审计压力 | `malformed=0`、`backwards=0`、`worker_failures=0` | | 审计开销(T20) | CPUS=1、3 的中位数均为 7.69% | | 原版对照(T21) | 原版、审计关闭、审计开启均完成 3 次固定运行 | 性能测试每次预热 2000 次后执行 200000 次 `uptime`。由于 xv6 tick 粒度较粗,百分比用于本机横向比较,不应外推为绝对性能结论。历史异常、根因与复验记录见[已知问题(M3)](docs/已知问题-M3-20260916.md)。 ## 项目文档 | 文档 | 内容 | |---|---| | [文档目录](docs/README.md) | 文档索引 | | [详细工作说明](docs/详细工作说明.md) | 模块边界、交付要求与联调事项 | | [分工计划与 T1–T23 测试矩阵](docs/分工计划-9月4日至17日.md) | 任务安排、接口约定、通过标准 | | [开发与测试复现](docs/开发与测试复现.md) | WSL 环境、构建、测试与提交方法 | | [甲:沙箱核心设计说明](docs/甲-沙箱核心设计说明-20260915.md) | 进程状态、白名单、配额接线与错误路径 | | [M2 集成测试报告](docs/M2-集成测试报告-20260910.md) | M2 集成结果与测试证据 | | [M3 已知问题与复验记录](docs/已知问题-M3-20260916.md) | 多核快照修复、三核复验与性能数据边界 | ## 目录说明 ```text kernel/ 内核实现:系统调用分发、沙箱、配额和审计 user/ 用户态接口、功能测试与压力测试 scripts/ WSL 下的构建、回归和性能自动化脚本 docs/ 设计说明、分工计划、测试报告与已知问题 artifacts/ 自动化测试生成的原始日志和结果数据 ``` ## 协作约定 开发在 `dev/*` 分支进行,完成自测后通过 PR 合并到 `main`。提交前请确认: ```bash git status --short git diff --check git log --oneline -5 ``` 不要提交 `kernel/kernel`、`fs.img` 等构建产物;测试结论应附带执行版本、CPU 配置、命令、原始日志位置和已知问题。 ## 开源基础 本项目基于 [MIT xv6-riscv](https://github.com/mit-pdos/xv6-riscv) 教学操作系统改造,遵循仓库内 [MIT License](LICENSE)。