0%

6_S081_lab1

6-S081-lab1

前置知识:6-S081-lec1

环境配置(boot)

环境的配置按照官方的教程来即可,使用的操作系统的Ubuntu20.04.

需要注意的是使用apt-get安装的qemu版本不对,通常是4.1.0版本,而官方要求版本要在5.1.0以上,因此需要手动编译qemu源码。这个过程比较简单,参考这个教程的第一节和第二节即可。需要注意的是,由于2020版的课程的xv6系统采用riscv指令集,因此在config时的指令

1
2
../qemu-5.1.0/configure --enable-kvm  --target-list=riscv64-linux-user,riscv64-softmmu
# riscv-64-linux-user为用户模式,可以运行基于riscv指令集编译的程序文件,softmmu为镜像模拟器,可以运行基于riscv指令集编译的linux镜像,为了测试方便,这边两个全部安装。

sleep

直接调用sleep系统调用即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// sleep.c 位于xv-labs-2020/user目录下
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("usage: sleep <number>\n");
exit(1);
}
int number = atoi(argv[1]);
sleep(number);
exit(0);
}

此外需要修改Makefile,在UPROGS中加入$U/_sleep\,如下图:

image-20210526142958225

pingpong

需要建立两个管道,分别用于parent给child发和child给parent发。管道的write端不用后将其关闭。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// pingpong.c
#include "kernel/types.h"
#include "user/user.h"

#define READ_END 0
#define WRITE_END 1

int main(int argc, char const *argv[])
{
int p2c_fd[2];
int c2p_fd[2];
pipe(p2c_fd);
pipe(c2p_fd);
if(fork() == 0)
{
char msg[5];
read(p2c_fd[READ_END], msg, 5);
printf("%d: received %s", getpid(), msg);
write(c2p_fd[WRITE_END], "pong\n", 5);
close(c2p_fd[WRITE_END]);
}
else
{
int pid;
char msg[5];
pid = getpid();
write(p2c_fd[WRITE_END], "ping\n", 5);
close(p2c_fd[WRITE_END]);
read(c2p_fd[READ_END], msg, 5);
printf("%d: received %s", getpid(), msg);
}

exit(0);
return 0;
}

primes