このリポジトリに従って、XV6の最新の修正Versonをこちらを入手できます
ここから公式XV6リポジトリをクローンします。 XV6を起動するにはエミュレータが必要です。この目的のためにQEMUを使用します。 QEMUをインストールするには、ターミナルから実行します
sudo apt install qemu
次に、xv6がクローニングされた場所から、xv6をコンパイルするために実行しmake 。次に、エミュレータを起動するには、 make qemu実行すると、別のウィンドウにQemuが表示されます。 Qemuが起動しない場合は、実行します
sudo apt install qemu-system-x86
make qemu
今回は機能するはずです。それでも、あなたはこのような問題に直面するかもしれません。
使用しているのと同じターミナルでQemuを実行するには、 make qemu代わりにmake qemu-nox作成します。
QEMUが起動された後、 lsを実行して次のシステムコールが表示されます
ソースコードgetcmd変更して、効果を即座に確認できます。Letsは、 $サインsh.c他の何かに置き換えたいと言います。
printf ( 2 , ANSI_COLOR_GREEN " afnan@Xv6:$ " ANSI_COLOR_RESET);このファイルの上部に2行を追加します
# define ANSI_COLOR_GREEN " x1b [32m "
# define ANSI_COLOR_RESET " x1b [0m " QEMU端子を押してcntrl+Aを押し、リリースしてからすぐにタイプXから辞めますmake qemu-nox退屈なタスクであることがわかりますので、端末から出るためのシステムコールを作成します)。

2つの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
}Consoleに何かを印刷するには、C言語とは異なり、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をリストすることを確認できます。しかし、このコマンドを実行することで今は何もしません。
extern int sys_shutdown(void);次に、次のブロックで[SYS_shutdown] sys_shutdown,#define SYS_shutdown 23SYSCALL(shutdown)に次の行を追加しますvoid shutdown(void);現在、システム呼び出しの方法を含む2つのファイルがあります。 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 :私はすでに、より多くのシステムコールを実装しています。それらが実装されていない場合は、今のところ追加、増分、GetSizeなどが表示されません。
まず第一に、 ulib.cファイルのatoi関数を変更して、負の数を処理するように変更します。