# oscp **Repository Path**: hippogypi/oscp ## Basic Information - **Project Name**: oscp - **Description**: 大三操作系统课设,基于NachOS的分析与实验 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-17 - **Last Updated**: 2026-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### (1)NachOS代码框架 NachOS是一个基于MIPS指令框架的轻量级教学用操作系统。采用编译时模块化体系结构(内核=核心模块+功能模块。模块在编译时静态链接,通过Makefile选择包含哪些模块。每个模块有明确的职责): ``` nachos-3.4-ualr-2022/ ├── c++example/ # C++编程示例 ├── code/ # 核心源码 │ ├── threads/ # 线程管理(核心) │ │ ├── thread.h/cc # 线程控制块 │ │ ├── scheduler.h/cc # 线程调度 │ │ └── synch.h/cc # 同步原语 │ ├── machine/ # 硬件模拟层(基础) │ │ ├── machine.h/cc # 机器模拟器 │ │ ├── interrupt.h/cc # 中断处理 │ │ └── translate.h/cc # 地址翻译 │ ├── userprog/ # 用户程序管理 │ │ ├── addrspace.h/cc # 地址空间 │ │ └── exception.cc # 系统调用 │ ├── filesys/ # 文件系统 │ │ ├── filesys.h/cc # 文件系统接口 │ │ ├── directory.h/cc # 目录管理 │ │ └── filehdr.h/cc # 文件头 │ ├── network/ # 网络通信 │ ├── test/ # 测试程序 │ └── lab2-lab7/ # 实验目录 └── doc/ # 文档 ``` ### (2)NachOS进程调度 默认采用非抢占式FCFS调度策略 但通过命令行选项可启用 "随机" 时间片调度: 当使用特定参数 (如 - rs) 时,系统会在程序执行的 "随机但可重复的点" 触发时钟中断,强制线程切换 这种机制使线程在时间片用完后被抢占,切换到就绪队列的下一个线程 -rs 参数的作用:为这种随机时间片调度提供种子,确保每次运行时线程在相同的 "随机" 点被抢占,实现可重复的调试体验 ### (3)NachOS的OneTick与中断响应 NachOS用的是模拟时间系统,tick其实完全不等同于物理硬件产生的时钟。它只是一种模拟的先后顺序!这一点曾让我混淆了很久,让我感到非常困惑。因为我完全想不通OneTick为什么要这样设计,但现在我懂了:因为这推进的是逻辑上的时间,跟物理时间过去了多久没关系。而这个时间“逻辑”的划分标准是什么呢?就是响应中断的时间顺序!换句话说,这个OneTick说到底只是为了响应中断而设计的......但我之前一直理解反了。 事实上OneTick有且只有两种调用场景: - Machine::Run()中执行用户指令后:为了在用户程序执行中模拟中断 - 使用Interrupt::SetLevel()开中断时:为了处理在关中断期间累积的中断 ### (4)NachOS的文件系统 在操作系统中,文件系统管理磁盘上的数据。Nachos使用简单的文件系统结构: - __文件头(FileHeader)__:存储文件 __元数据__(metadata),包括: - 文件大小(字节数) - 文件内容所在 __数据扇区编号__(dataSectors数组) - 文件最后修改时间(实验四新增) - __数据扇区(Data Sectors)__:实际存储文件内容的磁盘块 - __打开文件表项(OpenFile)__:当文件被打开时,在内存中创建的对象,包含: - 指向文件头的指针 - 当前读写位置 - 其他操作状态 NachOS的文件读取流程: - 相关文件:openfile.h(OpenFile) 、 filehdr.h(FileHeader) ``` 上层调用 → OpenFile::Read → OpenFile::ReadAt → 扇区转换 → 模拟磁盘IO → 数据复制 → 返回结果 ```