MIT 6.S081 Operating Systems Lab Notes [Lab Utils & System Call]

MIT 6.S081 Operating Systems Lab Notes [Lab Utils & System Call]

💡 原文英文,约2400词,阅读约需9分钟。
📝

内容提要

本文记录MIT 6.S081实验过程:先在Arch Linux上搭建xv6环境,安装riscv64工具链与QEMU,并解决liburing版本问题;随后完成Unix工具实验,包括实现sleep、用双管道实现pingpong、通过递归fork与管道筛选素数的primes、仿find遍历目录及xargs执行命令;系统调用实验实现trace打印系统调用和sysinfo统计空闲内存与进程数,并简述页表实验。

🔎

延伸解读

环境搭建中的版本兼容问题

文章记录了在 Arch Linux 上搭建 xv6 环境时遇到的两个典型问题:一是缺少 riscv64 工具链导致汇编报错,需安装 riscv64-linux-gnu-binutils、gcc、gdb 及 qemu-arch-extra;二是 QEMU 启动时提示缺少 liburing.so.1,作者发现已安装的 liburing 为 2.0.0 版本,通过降级解决。这提示读者在复现实验时需留意依赖版本,而非仅关注是否安装。

管道与 fork 的进程协作模式

pingpong 和 primes 两个实验都围绕 pipe 与 fork 展开。pingpong 使用一对管道实现父子进程双向传递一个字节;primes 则用递归 fork 构建进程链,每个进程从左侧管道读取数字流,筛掉当前素数的倍数后写入右侧管道,父进程用 wait 等待子进程结束。这些练习体现了 xv6 中文件描述符和进程数量有限,因此素数范围限定在 2 到 35。

系统调用实验的关键实现点

trace 实验需要在 struct proc 中增加 tracemask 字段,并在 syscall() 返回时根据掩码打印进程号、系统调用名和返回值,且该设置需被 fork 出的子进程继承。sysinfo 实验则要求在 kalloc.c 中维护空闲内存计数,在 proc.c 中统计非 UNUSED 状态进程数,并强调拿到用户地址后先用 fetchaddr() 校验合法性,再通过 copyout 写回结果。

❓

Q&A

在 Arch Linux 上搭建 xv6 实验环境需要安装哪些依赖?

需要安装 riscv64 工具链和 QEMU:sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-arch-extra。其他系统可参考课程提供的 tools 页面。

make qemu 时提示找不到 liburing.so.1 怎么办?

这是因为安装的 liburing 版本(如 2.0.0)与 QEMU 所需版本不兼容,将 liburing 降级即可解决。

xv6 的 pingpong 实验要求实现什么功能?

使用一对管道(每个方向一个)在两个进程间传递一个字节:父进程发送字节给子进程,子进程打印“<pid>: received ping”并通过另一个管道回传字节,父进程读取后打印“<pid>: received pong”。

primes 实验如何用管道和 fork 筛选素数?

主进程将 2 到 35 写入管道,然后递归调用 prime_sieve:每个进程从左侧管道读取数字,第一个读到的数即为素数并打印,之后将不能被该素数整除的数写入右侧管道,再 fork 子进程继续处理,父进程用 wait 等待子进程结束。

实现 find 命令时需要注意什么?

需要递归遍历目录树,匹配特定文件名。注意不要在 . 和 .. 目录下递归查找,并且可以复用 ls.c 中的 fmtname 函数(需修改以去除空格后缀)。

trace 系统调用实验要求打印什么信息?如何实现?

要求打印进程 id、系统调用名和返回值,并且对调用 trace 的进程及其 fork 的子进程生效。实现时在 struct proc 中添加 tracemask 字段,在 syscall() 中根据掩码判断是否打印,并使用 argint() 获取用户传入的掩码。

sysinfo 系统调用需要统计哪些信息?如何实现?

需要统计空闲内存字节数(freemem)和非 UNUSED 状态的进程数(nproc)。在 kalloc.c 中为 kmem 增加 freemem 字段并在 kfree/kalloc 中增减,提供 kfreemem() 返回空闲页数;在 proc.c 中增加 process_count() 遍历进程数组统计非 UNUSED 进程;sys_sysinfo() 用 fetchaddr 验证用户地址后填充结构体并 copyout 到用户空间。

🏷️

标签

➡️

继续阅读