Você receberá o mais recente Verson modificado de XV6 de acordo com este repositório aqui
Clone o repositório oficial do XV6 daqui. Precisamos de um emulador para inicializar xv6.we usaremos o Qemu para esse fim. Para instalar o Qemu, execute a partir do seu terminal
sudo apt install qemu
Então, de onde o XV6 foi clonado, make para compilar XV6. Então, para iniciar o emulador, execute make qemu e você verá Qemu em uma janela diferente. Se o Qemu não lançar, então execute
sudo apt install qemu-system-x86
make qemu
Desta vez, deve funcionar. Ainda assim, você pode enfrentar problemas como esse, então aqui está uma maneira de contornar.
Para executar o Qemu no mesmo terminal que você está usando, make qemu-nox em vez de make qemu .
Depois que o Qemu estiver sendo lançado, você verá as seguintes chamadas do sistema executando ls 
$ getcmd o código -fonte e ver sh.c efeitos instantaneamente.
printf ( 2 , ANSI_COLOR_GREEN " afnan@Xv6:$ " ANSI_COLOR_RESET);Adicione duas linhas na parte superior deste arquivo
# define ANSI_COLOR_GREEN " x1b [32m "
# define ANSI_COLOR_RESET " x1b [0m " Agora saia do terminal Qemu pressionando cntrl+A , Libere e digite X imediatamente (como você pode ver, é uma tarefa tediosa e criaremos uma chamada do sistema para sair do terminal). Então, make qemu-nox novamente e verá o resultado agora

O uso de dois CPU sempre parece ser 100%. Para resolver isso, faça a seguinte modificação.
Em proc.c , modifique a função 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 ();
}
}
} e em x86.h , adicione uma função halt
static inline void
halt ()
{
asm volatile ( " hlt " : : );
} Vamos criar uma chamada de sistema para sair do terminal Qemu. Nomeamos como shutdown . Então, queremos fazer algo que nos permitiria sair do terminal, apenas escrevendo o shutdown do comando.
Primeiro, crie um arquivo chamado 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
}Observe que, para imprimir qualquer coisa no console, precisamos adicionar um descritor de arquivo como o primeiro parâmetro do PrintF, diferentemente da linguagem C.
Então, em makefile, adicione -o nos Uprogs
UPROGS=
_cat
_echo
_forktest
_grep
_init
_kill
_ln
_ls
_mkdir
_rm
_sh
_stressfs
_usertests
_wc
_zombie
_shutdownAdicione também em 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 Agora você pode sair do terminal Qemu e executar make qemu-nox novamente e ver que ls listará shutdown como uma chamada do sistema. Mas executar este comando não fará nada por agora.
extern int sys_shutdown(void); Então, no próximo bloco, adicione [SYS_shutdown] sys_shutdown,#define SYS_shutdown 23SYSCALL(shutdown)void shutdown(void); Agora, existem dois arquivos que contêm os métodos para chamadas do sistema. sysfile.c contém métodos relacionados a arquivos e sysproc.c contém métodos relacionados aos processos. Temos que escrever um novo método chamado sys_shutdown no sysproc.c .
void sys_shutdown ( void ){
outw ( 0xB004 , 0x0 | 0x2000 );
outw ( 0x604 , 0x0 | 0x2000 );
} Se estiver tudo bem até agora, você poderá sair do Qemu, executar make qemu-nox e ver as chamadas de sistema disponíveis executando ls .Run o comando shutdown e você verá o terminal saindo.

NB : Eu já implementei mais algumas chamadas SYTEM. Você não verá Add, Incr, Getsize etc por enquanto, se elas não forem implementadas.
Primeiro de tudo, modifique a função atoi no arquivo ulib.c para que ele também lida com números negativos.