MIT 6.S081/6.828 OS Lab
最一开始是因为我导师这学期教本科生《操作系统》这门课,想把这个实验作为提高实验,因此让作为助教的我也摸一下这个实验。接触后发现这个实验其实很有意思,也的确锻炼系统编程能力,十分契合我对自己的规划,因此决定坚持做下去,特此记录过程中遇到的一些问题和启示。
实验内容详情:https://pdos.csail.mit.edu/6.828/2019/overview.html
一、装环境
1、我使用VisualBox安装Ubuntu 18.04.3系统镜像,内存4GB,硬盘20GB,最小安装。
2、按照官网给的tools章节安装。
a.从GitHub上clone模拟硬件用的qemu。注意这里的clone命令加了–recursive,所以不仅仅是一个qemu仓库那么简单,实际上还有很多子仓库。最后好像一共5G多。建议科学地clone,否则很容易失败。
b.安环境。
c.configure and build the tool chain。这里的make会很久很久。
d.build qemu。configure的时候报错:没有pkg-config包,apt-get安装即可。
e.然后又说没有glib-2.40。这个是第三方库,没办法直接apt-get:
sudo apt-get install libffi-dev
wget http://ftp.acc.umu.se/pub/GNOME/sources/glib/2.40/glib-2.40.0.tar.xz
tar -vxf glib-2.40.0.tar.xz
cd glib-2.40.0
./configure --prefix=/usr/local
sudo make
sudo make install
中间make报了一个错:gdate.c:2497:7:…
参考https://blog.youkuaiyun.com/zmlovelx/article/details/81664043创建一个patch文件(头两行各去掉一个“glib/”)放在glib的上一级文件夹,然后cd进glib文件夹,执行:
f.又报错没有pixman,于是安装sudo apt-get install libpixman-1-dev。
g.验证是否安装成功。
3、下载系统代码,编译运行测试。
(课多作业多project多,慢慢跟进,争取做完~)
二、实验一util
额,惭愧,第一节其实是我研一上写的,但研一上的时候课太多,还要当助教,看文献等一顿杂事,这事儿居然搁置了一年:)现在研二了,又在当OS助教,只不过今年所有学生的实验都换成了MIT的这个,要求是做1、2、3、7这四个。既然如此,我也不得不做了,于是回来填坑。区别在于,这次我用的是实验中心统一配好的环境,系统不再是Ubuntu而是Debian,不过区别应该不大。截止到写这篇文,已经做完了实验一和二,但是考虑到课程还在继续,所以代码就暂时先不贴,只记录一下我自己遇到的问题。我现在仍然很忙,所以大概率不会把全部的11个实验做完,而是只抽空做一下课程要求的这四个。
实验一是5个小实验组成的,sleep、pingpong、primes、find感觉都没什么好说的。我自己遇到问题的实验是最后一个xargs。当时写完后发现程序有一个bug,就是当输入的参数个数非常多的时候,最后若干个参数不能正确传进去,但是能通过实验的打分脚本。其实这个bug到现在也没找到出在哪里,不过bug被解决了——这并不矛盾,既然找不到,就全部推翻重写。。。。一开始做的时候我以为参数是要向后传递的,比如第一次echo first,输入second后就要echo first second,再输入third后要echo dirst second third,因此我用了一个二维数组来保存历史arg记录。后来发现不需要这样,于是只需要用一个一维数组作为buffer就可以了,每次输入的时候直接把之前的给覆盖掉。这样重写之后bug就消失了。
其他的需要注意的地方就是primes实验里要及时关闭文件描述符,因为根据kernel/param.h中的定义:
#define NOFILE 16 // open files per process
每个进程最多只能开16个描述符。
三、实验二shell
思路是根据第一个“|”字符将输入的命令行cmd划分成两部分,分别用两个子进程运行。第一部分将输出重定向到管道,然后用用exec运行。第二部分则递归上述过程,直到不再有“|”字符出现。做这个实验要对管道充分熟悉!我本人做的时候遇到了很多坑。下述代码就是分两个子进程并重定向和递归的核心代码,也是我遇到问题最多的地方。
void
process(char *before, char *behind)