MIT 6.S081/6.828 OS Lab

本文详细记录了MIT 6.S081/6.828操作系统实验室的环境安装过程,包括Ubuntu 18.04的配置、qemu的安装与配置、实验一到三的概述。实验一中,作者遇到并解决了xargs程序的bug。实验二讲解了shell的实现原理,强调了管道的理解与使用。实验三涉及file.c和buddy.c的修改,实现了动态分配和伙伴系统。在实验过程中,作者分享了遇到的问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


最一开始是因为我导师这学期教本科生《操作系统》这门课,想把这个实验作为提高实验,因此让作为助教的我也摸一下这个实验。接触后发现这个实验其实很有意思,也的确锻炼系统编程能力,十分契合我对自己的规划,因此决定坚持做下去,特此记录过程中遇到的一些问题和启示。
实验内容详情: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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值