xv6 Lab (util)
Nowherechan 学徒

其实 util 和 syscall 在寒假时候就已经写完了,一直没有回过头来再作一些分析。恰逢今天更新一下博客,今晚时间也勉强还算充裕,于是打开代码,进行一波复盘。

整个 util 实验就是通过写一些用户程序来了解并且熟悉 xv6 的系统调用。

Boot xv6

没什么好说的。

sleep

写一个用户程序,代码放在 user/sleep.c,使用 sleep 系统调用来实现休眠对应的时间。
可以直接用 atoi 函数将输入的参数转化为整数类型。
代码

pingpong

写一个用户程序,要求产生一个子进程,子进程和父进程互发并且互读消息,使用 pipe 来进行进程间通信。
pipe 系统调用输入一个 int p[2],分配两个 fd,p[1] 用来写,p[0] 用来读。
代码

primes

输入一个整数 n,输出 2~n 的所有质数。

这里用创建新进程的方法来实现质数筛:第一个进程需要读所有的数,每个进程收到的第一个数一定是质数,然后将后续输入的每个数都模一遍这第一个数,整除就丢掉,不整除说明可能是质数,通过 pipe 扔给子进程。

但是子进程会继承所有祖宗进程开启的那些 fd,但是实际上很多它们是不需要的,因此要关掉,否则就会出现文件描述符不够用的情况。

实际上,作者好像是想通过这个例子来说明,多进程的设计并不仅仅是为了利用线程资源,也可以简化设计,让程序更优雅什么的。但是我做完之后其实感觉并不特别强烈,当时的确也是惊讶了一下:哦呀,还能这样的啊。当我讲给打 ACM 的同学听的时候,他说,啊好那所以呢,大约是:“So what?”(笑)。
代码

find

实现 find 的基本功能。
用一些文件系统的系统调用。
记得是个大模拟,写了好几个小时,大量参考 ls 的代码来着?
代码

xargs

实现一个 xargs。
实际上做这个 lab 的时候,大部分时间都用来看 xargs 的功能了(笑)。
简单来说就是将 xargs 的标准输入作为 xargs 要运行的那个程序的参数,我也不知道为什么我理解了那么久。
代码

 Comments