Mit6.S081-实验1-Xv6 and Unix utilities
前言
一、Boot xv6
1,实验目的
利用qemu启动xv6
2,操作流程
1)切换到xv6-labs-2020代码库的lab1分支
git checkout util
参考:https://pdos.csail.mit.edu/6.828/2020/labs/util.html
2)启动xv6
make qemu
参考:https://pdos.csail.mit.edu/6.828/2020/labs/util.html
3)测试xv6
ls
参考:https://pdos.csail.mit.edu/6.828/2020/labs/util.html
4)过程分析
xv6通过qemu启动完成后,启动了shell进程。通过shell,启动子进程ls,显示了xv6目录下的文件。
5)其他操作
查看xv6中的进程:Ctrl+p(xv6没有实现ps程序)
退出qemu启动的xv6:Ctrl+a x
二、在xv6中添加一个自己编写的程序
1,源码准备
在user目录下创建copy.c
// copy.c: 将控制台输入内容输出到控制台
#include "kernel/types.h"
#include "user/user.h"
int
main()
{
char buf[64];
while(1){
//从console读取输入,通过system call的read函数实现
int n = read(0, buf, sizeof(buf));
//无输入结束程序
if(n <= 0)
break;
//将console输入输出到控制台,通过system call的write函数实现
write(1, buf, n);
}
exit(0);
}
参考:https://pdos.csail.mit.edu/6.828/2020/lec/l-overview/copy.c
2,编译配置
在Makefile 152行添加配置
3,测试添加程序
启动xv6后,执行copy
4,过程分析
xv6通过qemu启动完成后,启动了shell进程。通过shell,启动子进程copy。
三、xv6中shell简析
shell也是一个用户进程,不过在xv6启动后就运行了。源码为user/sh.c,入口函数在145行。
在shell下输入命令行,shell程序读取输入内容,通过调用fork(system call)开启一个shell的子进程,
shell进程利用wait(system call),等待子进程执行完后继续执行。
//创建子进程
//父进程中fork1()返回创建的子进程pid;子进程中fork1执行成功返回0。所以子进程才会执行runcmd()
if(fork1() == 0)
//在子进程中执行shell中输入的程序
runcmd(parsecmd(buf));
//父进程等待子进程执行结束
wait(0);