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);

猜你喜欢

转载自blog.csdn.net/u013577996/article/details/108680888