您將根據此存儲庫獲得最新的XV6修改後的Verson
從這里克隆官方XV6存儲庫。我們需要一個模擬器來引導XV6。我們將使用QEMU為此目的。要安裝QEMU,請從您的終端運行
sudo apt install qemu
然後從克隆XV6的位置,運行make編譯XV6。然後,要啟動模擬器,請運行make qemu ,您將在另一個窗口中看到QEMU。如果Qemu不啟動,請運行
sudo apt install qemu-system-x86
make qemu
這次,它應該起作用。不過,您可能會面臨這樣的問題,這是解決方案。
要在您使用的同一終端中運行QEMU,請運行make qemu-nox而不是make qemu 。
啟動QEMU後,您將通過運行ls看到以下系統調用
我們可以修改源代碼並立即查看效果。 LETS說我們想用其他內容替換$ sign。要執行此操作,轉到sh.c文件並在getcmd方法內更改。
printf ( 2 , ANSI_COLOR_GREEN " afnan@Xv6:$ " ANSI_COLOR_RESET);在此文件的頂部添加兩行
# define ANSI_COLOR_GREEN " x1b [32m "
# define ANSI_COLOR_RESET " x1b [0m "現在從QEMU終端撤消,按cntrl+A ,然後立即釋放X,然後立即鍵入X(如您所見,這是一項繁瑣的任務,我們將創建一個系統make qemu-nox以從終端退出)。

兩種CPU的使用似乎總是100%。解決此問題,進行修改。
在proc.c中,修改schduler函數
void
scheduler ( void )
{
struct proc *p;
int ran;
struct cpu *c = mycpu ();
c-> proc = 0 ;
for (;;){
// Enable interrupts on this processor.
sti ();
// Loop over process table looking for process to run.
acquire (&ptable. lock );
for (ran = 0 , p = ptable. proc ; p < &ptable. proc [NPROC]; p++){
if (p-> state != RUNNABLE)
continue ;
// Switch to chosen process. It is the process's job
// to release ptable.lock and then reacquire it
// before jumping back to us.
ran = 1 ;
c-> proc = p;
switchuvm (p);
p-> state = RUNNING;
swtch (&(c-> scheduler ), p-> context );
switchkvm ();
// Process is done running for now.
// It should have changed its p->state before coming back.
c-> proc = 0 ;
}
release (&ptable. lock );
if (ran == 0 ) {
halt ();
}
}
}在x86.h中,添加一個halt功能
static inline void
halt ()
{
asm volatile ( " hlt " : : );
}讓我們創建一個系統調用以從QEMU終端退出。我們將其命名為shutdown 。因此,我們想做一些可以通過僅寫下命令shutdown來使我們從終端退出的事情。
首先創建一個名為shutdown.c的文件。
# include " types.h "
# include " stat.h "
# include " user.h "
int main ( int argc, char * argv[])
{
printf ( 1 , " Exiting n " );
shutdown ();
exit (); // eq to return zero
}請注意,要在控制台中打印任何內容,我們需要將文件描述符添加為printf語言的第一個參數。
然後在makefile中,將其添加到Uprogs中
UPROGS=
_cat
_echo
_forktest
_grep
_init
_kill
_ln
_ls
_mkdir
_rm
_sh
_stressfs
_usertests
_wc
_zombie
_shutdown也將其添加到額外
EXTRA=
mkfs.c ulib.c user.h cat.c echo.c forktest.c grep.c kill.c
ln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.c shutdown.c現在,您可以從QEMU終端退出並再次運行make qemu-nox ,並看到ls將shutdown為系統調用。但是運行此命令現在不會執行任何操作。我們將此系統調用添加到以下4個以下文件
extern int sys_shutdown(void);然後在下一個塊中添加[SYS_shutdown] sys_shutdown,#define SYS_shutdown 23SYSCALL(shutdown)上添加以下行void shutdown(void);現在,有兩個文件包含用於系統調用的方法。 sysfile.c包含與文件相關的方法,而sysproc.c包含與過程相關的方法。我們必須在sysproc.c中編寫一個名為sys_shutdown的新方法。
void sys_shutdown ( void ){
outw ( 0xB004 , 0x0 | 0x2000 );
outw ( 0x604 , 0x0 | 0x2000 );
}如果到目前為止一切都很好,那麼您可以從QEMU退出,運行make qemu-nox ,並通過運行ls 。運行命令shutdown查看可用的系統調用,您將看到終端退出。

NB :我已經實現了更多的系統調用。
首先,在ulib.c文件中修改atoi函數,以便處理負數。