xv6-labs-2020.lab0.utils
lab0 环境配置及系统调用
- 环境配置:https://pdos.csail.mit.edu/6.828/2020/tools.html
实验环境
实验环境基于 WSL(windows linux subsystem)
- WSL 1.0
1 | lsb_release -a |
1 | No LSB modules are available. |
换源
- 打开文件 "/etc/apt/sources.list"
- 可以备份一下原始的文件
1 | sudo cp /etc/apt/sources.list /etc/apt/sources.list.back |
- 修改文件为清华源
- https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
- 根据版本选择即可
1 | sudo apt-get update |
配置 VSCode 作为编辑器
- 安装好直接 code . 即可
- 权限问题
1 | /mnt/c/Users/User/.vscode/extensions/ms-vscode-remote.remote-wsl-0.54.6/scripts/wslServer.sh: Permission denied |
- 修改文件 /etc/wsl.conf
1 | sudo vim /etc/wsl.conf |
1 | [automount] |
- 修改访问权限
1 | cd /mnt/c/Users/XXX/.vscode/extensions/ms-vscode-remote.remote-wsl-0.54.6/scripts/ |
1 | chmod +x * |
安装工具
1 | sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu |
1 | sudo apt-get remove qemu-system-misc |
- 评分需要安装 python
1 | sudo apt-get install python |
其他
- 例如写好了
sleep.c
之后需要修改 makefile 文件 - Add your
sleep
program toUPROGS
in Makefile
Lab0
准备工作
预备知识
- pipe
- 管道通信
- https://blog.csdn.net/skyroben/article/details/71513385
- linux 标准流
- 标准输入流:0
- 标准输出流:1
- 标准错误流:2
- 命令行中括号的含义
[]
:可写可不写{}
:那就必须要在{}
内给出的选择里选一个<>
:表示必选
一些准备
- 修改 makefile
- 添加程序
1 | UPROGS=\ |
- 在 user 文件夹下新建文件
1 | sleep.c |
函数封装
- 在 user/user.h 中添加封装函数
1 | // user/user.h |
- 在某个文件中添加实现
- 这里我们为了不修改 makefile,直接在 user/printf.c 中实现了
1 | // user/printf.c |
sleep
- 通过系统调用 sleep 实现即可
1 | // user/sleep.c |
pingpong
- 实现进程间通信
1 | // user/pingpong.c |
思考
- 题目的设计很巧妙,如果是子进程先传消息的话可能出现如下的问题
- pingpong 输出如下
- 这个错误是子进程先写导致的
- 父进程结束了,但是子进程还在
1 | $ pingpong |
1 | if(fork() == 0) { |
- 只需要等到父进程结束,shell 就可以输出
- linux 代码测试
1 |
|
primes
- https://swtch.com/~rsc/thread/
- 保证这样一个性质:每一个进程接收到的一个数字序列的第一个数字一定是质数
- 主要想法如下
- 第一个进程把数字 2-32 通过管道输出给下一个进程
- 之后每一个进程记录第一个数(记作 a),输出 a(a
是质数),将序列中的其他数字除以 a
- 如果能够被 a 整除,说明是合数,丢弃
- 如果能够不被 a 整除,说明可能是质数,传递给下一个进程
1 |
|
xargs
- 实现功能 xargs
- 具体功能见注释
1 | // user/xargs.c |