CS130 操作系统I Project 2 User Programs | 用户程序

aaaaa Lv3

经过上一个项目,我们已经对内核有了一定的了解,而现在我们来处理关于用户程序的内容。

还是一样,先下载设计文档模板,按照模板填写。如果你不知道怎么填,可以参考这个

接下来我们正式开始代码工作!注意从main分支复制以新建一个分支来存储!


文件介绍

userprog目录下的文件

pintos/src/userprog路径下的12个代码文件(除去.gitignore Makefile Make.vars等仓库和作业配置文件)是这个项目的工作重心,在此一一介绍:

  • process.c process.h
    • 加载ELF可执行文件。
    • 创建并执行用户进程。
    • 需要完全看懂,需要大量修改
  • pagedir.c pagedir.h
    • 将虚拟地址映射到物理内存地址。
    • 操作页目录,启动页表。
    • 可能会调用其中的函数,不要修改。
  • syscall.c syscall.h
    • 每当一个用户进程想要访问某些内核功能时,它都会调用一个系统调用;而这是对于**系统调用(System Call)**的处理器。
    • 需要完全看懂,需要大量修改
  • exception.c exception.h
    • 用户程序的异常处理器。
    • 需要看懂,需要修改
  • gdt.c gdt.h
    • 全局描述符表(Global Descriptor Table),定义内核段、用户段,并设置段权限。
    • 不用看懂,不要修改。
  • tss.c tss.h
    • 任务状态段(Task State Segment),在用户进程进入中断处理程序时切换栈。
    • 不用看懂,不要修改。

更详细的内容请参阅:Background | Pintos


任务要求与执行建议

任务要求

  1. 实现用户进程退出机制:在进程终止时打印 "%s: exit(%d)\n" 格式的信息,并实现参数传递,正确构造用户栈以支持 argcargv
  2. 实现安全的用户内存访问机制:支持在系统调用中安全读取和写入用户虚拟地址空间,正确处理非法指针、越界访问和 page fault ,确保内核稳定且无资源泄漏。
  3. userprog/syscall.c 中实现系统调用框架,并完成 13 个系统调用(进程控制与文件系统相关),包括 exec/wait 的父子进程同步、文件描述符管理、文件系统加锁及进程资源释放。
  4. 实现对正在执行的可执行文件的写保护机制,在进程运行期间调用 file_deny_write() 禁止写入,进程结束时恢复写权限。

详细要求请参考:Your Tasks | Pintos

执行建议

执行顺序

  • 先跑测试,结果应该是 fail 80/80似乎没有跑的意义
  • 完成任务1:进程退出信息打印与参数传递
    • 涉及修改的文件:userprog/process.c threads/thread.h(必要时增加字段)
    • 主要完成:打印 exit 信息、拆分命令行参数、构造用户栈。

  • 完成任务2:用户内存安全访问机制
    • 涉及修改的文件:userprog/syscall.c userprog/exception.c userprog/pagedir.c(可能)
    • 主要完成:安全读取用户栈中的 syscall 参数,处理非法指针与 page fault

  • 完成任务3:系统调用框架与 13 个系统调用实现
    • 涉及修改的文件:userprog/syscall.c userprog/process.c threads/thread.h threads/thread.c
    • 主要完成:实现 halt/exit/exec/wait 及文件系统相关调用,维护父子关系、exit status、文件描述符表,并对文件系统加锁。

  • 完成任务4:可执行文件写保护机制
    • 涉及修改的文件:userprog/process.c
    • 主要完成:对正在执行的 executable 调用 file_deny_write(),在进程结束时恢复写权限。

也可以参考:Suggestions | Pintos

代码量参考值

这是官方给出的参考值,单位是行。由于代码不同,这显然不能代表唯一正确答案。在这次的Project 2中,很有可能出现修改其它文件或者并未修改其中几个文件,而运行结果仍然正确的情况。修改越少越精致!

1
2
3
4
5
6
7
threads/thread.c     |   13 
threads/thread.h | 26 +
userprog/exception.c | 8
userprog/process.c | 247 ++++++++++++++--
userprog/syscall.c | 468 ++++++++++++++++++++++++++++++-
userprog/syscall.h | 1
6 files changed, 725 insertions(+), 38 deletions(-)

如果你也想测试一下,可以在pintos容器内(或Windows的pintos目录下)依次按照以下执行:

  • 安装diffstat

    1
    2
    3
    apt update
    apt install diffstat
    diffstat --version
  • 版本比较:

    1
    2
    cd ~/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,禁止转载。