CS130 操作系统I Project 2 User Programs | 用户程序
经过上一个项目,我们已经对内核有了一定的了解,而现在我们来处理关于用户程序的内容。
还是一样,先下载设计文档模板,按照模板填写。如果你不知道怎么填,可以参考这个。
接下来我们正式开始代码工作!注意从main分支复制以新建一个分支来存储!
文件介绍
userprog目录下的文件
pintos/src/userprog路径下的12个代码文件(除去.gitignore Makefile Make.vars等仓库和作业配置文件)是这个项目的工作重心,在此一一介绍:
process.cprocess.h- 加载
ELF可执行文件。 - 创建并执行用户进程。
- 需要完全看懂,需要大量修改。
- 加载
pagedir.cpagedir.h- 将虚拟地址映射到物理内存地址。
- 操作页目录,启动页表。
- 可能会调用其中的函数,不要修改。
syscall.csyscall.h- 每当一个用户进程想要访问某些内核功能时,它都会调用一个系统调用;而这是对于**系统调用(System Call)**的处理器。
- 需要完全看懂,需要大量修改。
exception.cexception.h- 用户程序的异常处理器。
- 需要看懂,需要修改。
gdt.cgdt.h- 全局描述符表(Global Descriptor Table),定义内核段、用户段,并设置段权限。
- 不用看懂,不要修改。
tss.ctss.h- 任务状态段(Task State Segment),在用户进程进入中断处理程序时切换栈。
- 不用看懂,不要修改。
更详细的内容请参阅:Background | Pintos
任务要求与执行建议
任务要求
- 实现用户进程退出机制:在进程终止时打印
"%s: exit(%d)\n"格式的信息,并实现参数传递,正确构造用户栈以支持argc和argv。 - 实现安全的用户内存访问机制:支持在系统调用中安全读取和写入用户虚拟地址空间,正确处理非法指针、越界访问和
page fault,确保内核稳定且无资源泄漏。 - 在
userprog/syscall.c中实现系统调用框架,并完成 13 个系统调用(进程控制与文件系统相关),包括exec/wait的父子进程同步、文件描述符管理、文件系统加锁及进程资源释放。 - 实现对正在执行的可执行文件的写保护机制,在进程运行期间调用
file_deny_write()禁止写入,进程结束时恢复写权限。
详细要求请参考:Your Tasks | Pintos
执行建议
执行顺序
- 先跑测试,结果应该是 fail 80/80。
似乎没有跑的意义
- 完成任务1:进程退出信息打印与参数传递;
- 涉及修改的文件:
userprog/process.cthreads/thread.h(必要时增加字段) - 主要完成:打印
exit信息、拆分命令行参数、构造用户栈。
- 涉及修改的文件:
- 完成任务2:用户内存安全访问机制;
- 涉及修改的文件:
userprog/syscall.cuserprog/exception.cuserprog/pagedir.c(可能) - 主要完成:安全读取用户栈中的
syscall参数,处理非法指针与page fault。
- 涉及修改的文件:
- 完成任务3:系统调用框架与 13 个系统调用实现;
- 涉及修改的文件:
userprog/syscall.cuserprog/process.cthreads/thread.hthreads/thread.c - 主要完成:实现
halt/exit/exec/wait及文件系统相关调用,维护父子关系、exit status、文件描述符表,并对文件系统加锁。
- 涉及修改的文件:
- 完成任务4:可执行文件写保护机制;
- 涉及修改的文件:
userprog/process.c - 主要完成:对正在执行的
executable调用file_deny_write(),在进程结束时恢复写权限。
- 涉及修改的文件:
也可以参考:Suggestions | Pintos
代码量参考值
这是官方给出的参考值,单位是行。由于代码不同,这显然不能代表唯一正确答案。在这次的Project 2中,很有可能出现修改其它文件或者并未修改其中几个文件,而运行结果仍然正确的情况。修改越少越精致!
1 | threads/thread.c | 13 |
如果你也想测试一下,可以在pintos容器内(或Windows的pintos目录下)依次按照以下执行:
安装
diffstat:1
2
3apt update
apt install diffstat
diffstat --version版本比较:
1
2cd ~/pintos
git diff | diffstat
笔者写的代码比官方的标准版本修改多很多,说明笔者代码效率不高。
需要注意的内容
- PintOS支持多进程操作,但不支持一个进程有多个线程。
- 耐心调试,有看不懂的
不想看的可以问AI,这个项目代码应该大部分主流LLM都熟悉。
- 标题: CS130 操作系统I Project 2 User Programs | 用户程序
- 作者: aaaaa
- 创建于 : 2026-02-20 15:00:00
- 更新于 : 2026-02-20 15:02:23
- 链接: https://redefine.ohevan.com/2026/02/20/零基础速通:CS130 操作系统I_5/
- 版权声明: 版权所有 © aaaaa,禁止转载。