利用qemu啟動xv6
git checkout util
參考:https://pdos.csail.mit.edu/6.828/2020/labs/util.html
make qemu
參考:https://pdos.csail.mit.edu/6.828/2020/labs/util.html
ls
參考:https://pdos.csail.mit.edu/6.828/2020/labs/util.html
xv6通過qemu啟動完成後,啟動了shell程序。通過shell,啟動子程序ls,顯示了xv6目錄下的檔案。
檢視xv6中的程序:Ctrl+p(xv6沒有實現ps程式)
退出qemu啟動的xv6:Ctrl+a x
在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
在Makefile 152行新增設定
啟動xv6後,執行copy
xv6通過qemu啟動完成後,啟動了shell程序。通過shell,啟動子程序copy。
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);