Mit6.S081-實驗1-Xv6 and Unix utilities

2020-09-21 17:00:52

前言

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