構造一個自己的 mini 操作系統
任務描述
請實現如下功能: 1.寫一個命令解釋器程序 mysh.c
,其功能是接收用戶輸入的命令并給出反饋。要求該程序既支持內部命令 cd、sync、exit
;也支持外部命令,即可以接收 cat、ls
等命令,然后執行相應的可執行程序。要求首先在 Ubuntu 中測試該程序,然后用版本 0 內核啟動 bochs 虛擬機,在該虛擬機中編譯運行該程序,畫面應如下圖所示:
2.在 bochs 虛擬機的 /etc/rc
文件中增加一組測試命令,如下圖所示:
相關知識
為了完成本關任務,你需要掌握: 1.命令解釋器程序的一般結構是怎樣的; 2.如何獲取當前目錄的路徑名; 3.如何實現內部命令 cd 和 sync ; 4.如何執行一個可執行文件; 5.如何將文件放入 bochs 虛擬機; 6.在 bochs 虛擬機中如何編輯文件。
實驗準備
mysh.c
存放在/data/workspace/myshixun/exp3
中,修改之后請將文件保存在同一位置,否則評測無法通過。
實驗過程及答案
實驗過程
先通過vscode編輯mysh.c
#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> void main() {int size = 20;int pid;char pos[size];char command[size];while(1){getcwd(pos,size);printf("%s$\n",pos);scanf("%s",command);if(!strcmp(command,"cd")){char path[size];scanf("%s",path);chdir(path);}else if(!strcmp(command,"sync")){sync();}else if(!strcmp(command,"exit")){exit(0);}else if(!strcmp(command,"ls")){char ls_command[size];strcpy(ls_command,"ls ");strcat(ls_command,pos);// sprinf(ls_command,"ls %s", pos);system("ls");}else if(!strcmp(command,"cat")){char filename[size];char cat_command[size];scanf("%s",filename);strcpy(cat_command,"cat ");if(filename[0] != '/'){strcat(cat_command,pos);strcat(cat_command,"/");}strcat(cat_command,filename);// sprintf(cat_command,"cat %s/%s",pos, filename);system(cat_command);}} }
把這份代碼保存到os/linux-0.11-lab/b下
代碼搞定,把這段代碼放進內核編譯