Laut diesem Repository erhalten Sie den neuesten modifizierten Verson von XV6 hier
Klonen Sie das offizielle XV6 -Repository von hier. Wir brauchen einen Emulator, um XV6 zu starten. Wir werden QEMU für diesen Zweck verwenden. Um QEMU zu installieren, laufen Sie von Ihrem Terminal aus
sudo apt install qemu
Dann von dem Ort, an dem XV6 kloniert wurde, lief make , um xv6 zu kompilieren. Um den Emulator zu starten, make qemu und Sie sehen QEMU in einem anderen Fenster. Wenn QEMU nicht startet, laufen Sie
sudo apt install qemu-system-x86
make qemu
Diesmal sollte es funktionieren. Trotzdem könnten Sie wie diese Probleme haben, dann ist hier ein Weg herum.
Um QEMU in demselben Terminal auszuführen, das Sie verwenden, rennen Sie make qemu-nox anstatt make qemu .
Nachdem Qemu gestartet wurde, werden Sie folgende Systemanrufe durch Ausführen ls sehen 
Wir können den Quellcode getcmd und sh.c Effekte $ sehen.
printf ( 2 , ANSI_COLOR_GREEN " afnan@Xv6:$ " ANSI_COLOR_RESET);Fügen Sie zwei Zeilen oben in dieser Datei hinzu
# define ANSI_COLOR_GREEN " x1b [32m "
# define ANSI_COLOR_RESET " x1b [0m " Kündigen Sie nun vom QEMU-Terminal, cntrl+A drückt, freigeben und dann sofort X eingeben (wie Sie sehen können, dass es sich um eine mühsame Aufgabe handelt, und wir werden einen make qemu-nox erstellen, um aus dem Terminal zu beenden).

Die beiden CPU -Nutzung scheinen immer 100%zu sein. Um dies zu lösen, machen Sie nach der Änderung.
In proc.c schduler -Funktion ändern
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 ();
}
}
} und in x86.h eine halt hinzufügen
static inline void
halt ()
{
asm volatile ( " hlt " : : );
} Lassen Sie uns einen Systemanruf erstellen, um aus dem QEMU -Terminal zu beenden. Wir nennen ihn als shutdown . Also möchten wir etwas tun, das es uns ermöglicht, aus dem Terminal zu beenden, indem wir nur das shutdown des Befehls schreiben.
Erstellen Sie zuerst eine Datei namens 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
}Beachten Sie, dass wir, um irgendetwas in der Konsole zu drucken, einen Dateideskriptor als der erste Parameter von PRINTF hinzufügen, der im Gegensatz zur C -Sprache ist.
Fügen Sie es dann in Makefile in die Aufstände hinzu
UPROGS=
_cat
_echo
_forktest
_grep
_init
_kill
_ln
_ls
_mkdir
_rm
_sh
_stressfs
_usertests
_wc
_zombie
_shutdownFügen Sie es auch in extra hinzu
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 Jetzt können Sie aus dem QEMU-Terminal beenden und make qemu-nox und sehen, dass ls shutdown als Systemaufruf auflistet. Aber ausführen, dass dieser Befehl vorerst nichts unternimmt. Wir können diesen Systemanruf zu 4 folgenden Dateien hinzufügen
extern int sys_shutdown(void); Fügen Sie dann im nächsten Block [SYS_shutdown] sys_shutdown,#define SYS_shutdown 23SYSCALL(shutdown)void shutdown(void); Jetzt gibt es zwei Dateien, die die Methoden für Systemaufrufe enthalten. sysfile.c enthält Methoden, die sich auf Dateien und sysproc.c beziehen, enthält Methoden, die sich auf Prozesse beziehen. Wir müssen eine neue Methode namens sys_shutdown in sysproc.c schreiben.
void sys_shutdown ( void ){
outw ( 0xB004 , 0x0 | 0x2000 );
outw ( 0x604 , 0x0 | 0x2000 );
} Wenn bisher alles in Ordnung ist, können Sie aus QEMU, Run make qemu-nox shutdown beenden und die verfügbaren SYTEM-Aufrufe sehen, indem Sie ls .

NB : Ich habe bereits einige weitere Sytem -Calls implementiert. Sie werden vorerst hinzufügen, inkretiert, GetSize usw. sehen, wenn diese nicht implementiert sind.
Ändern Sie zunächst die atoi -Funktion in ulib.c -Datei so, dass sie auch negative Zahlen behandelt.