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
| #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\
,如下图:
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
| #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