Vous obtiendrez le dernier Verson modifié de XV6 en fonction de ce référentiel ici
Clone le référentiel officiel XV6 d'ici. Nous avons besoin d'un émulateur pour démarrer XV6.Nous utiliserons QEMU à cet effet. Pour installer Qemu, courez à partir de votre terminal
sudo apt install qemu
Ensuite, à partir de l'endroit où XV6 a été cloné, make à compiler XV6. Ensuite, pour lancer l'émulateur, exécutez make qemu et vous verrez Qemu dans une fenêtre différente. Si Qemu ne se lance pas, alors exécutez
sudo apt install qemu-system-x86
make qemu
Cette fois, cela devrait fonctionner. Pourtant, vous pourriez faire face à des problèmes comme celui-ci, alors voici un moyen de contourner.
Pour exécuter Qemu dans le même terminal que vous utilisez, exécutez make qemu-nox au lieu de make qemu .
Une fois le Qemu lancé, vous verrez les appels du système suivant en exécutant ls 
Nous sh.c modifier le code source et getcmd les effets instantanément.Lets disent que nous voulons remplacer le signe $ par autre chose.
printf ( 2 , ANSI_COLOR_GREEN " afnan@Xv6:$ " ANSI_COLOR_RESET);Ajoutez deux lignes en haut de ce fichier
# define ANSI_COLOR_GREEN " x1b [32m "
# define ANSI_COLOR_RESET " x1b [0m " Maintenant, quittez le terminal QEMU en appuyant sur cntrl+A , libérez puis tapez make qemu-nox immédiatement (comme vous pouvez le voir, c'est une tâche fastidie

L'utilisation des deux processeurs semble toujours être à 100% pour résoudre ce problème, faites après modification.
Dans proc.c , modifiez la fonction 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 ();
}
}
} et dans x86.h , ajoutez une fonction halt
static inline void
halt ()
{
asm volatile ( " hlt " : : );
} Créons un appel système pour shutdown shutdown terminal Qemu.
Créez d'abord un fichier nommé 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
}Notez que pour imprimer quoi que ce soit dans la console, nous devons ajouter un descripteur de fichier comme premier paramètre de printf contrairement à la langue C.
Ensuite, dans Makefile, ajoutez-le dans les Uprogs
UPROGS=
_cat
_echo
_forktest
_grep
_init
_kill
_ln
_ls
_mkdir
_rm
_sh
_stressfs
_usertests
_wc
_zombie
_shutdownAjoutez-le aussi en extra
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 Maintenant, vous pouvez quitter le terminal Qemu et exécuter REFORMER make qemu-nox et voir que ls répertoriera shutdown en tant qu'appel système. Mais exécuter cette commande ne fera rien pour l'instant. Nous devons ajouter cet appel système à 4 fichiers suivants suivants
extern int sys_shutdown(void); Ensuite, dans le bloc suivant, ajoutez [SYS_shutdown] sys_shutdown,#define SYS_shutdown 23SYSCALL(shutdown)void shutdown(void); Maintenant, il existe deux fichiers qui contiennent les méthodes pour les appels système. sysfile.c contient des méthodes liées aux fichiers et sysproc.c contient des méthodes liées aux processus.Nous devons écrire une nouvelle méthode nommée sys_shutdown dans sysproc.c .
void sys_shutdown ( void ){
outw ( 0xB004 , 0x0 | 0x2000 );
outw ( 0x604 , 0x0 | 0x2000 );
} Si tout va bien jusqu'à présent, vous pouvez sortir de Qemu, exécuter make qemu-nox et voir les appels sytem disponibles en exécutant ls .Run l' shutdown de la commande et vous verrez le terminal quitter.

NB : J'ai déjà implémenté quelques appels de système supplémentaires.
Tout d'abord, modifiez la fonction atoi dans le fichier ulib.c afin qu'il gère également les nombres négatifs.