이 저장소에 따라 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 대신 make qemu-nox 실행하십시오.
QEMU가 출시되면 ls 실행하여 다음 시스템 호출을 볼 수 있습니다. 
소스 코드를 수정하고 효과를 즉시 볼 수 있습니다 .Lets는 $ 부호를 다른 것으로 바꾸려면 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를 입력 한 다음 즉시 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
}콘솔에서 무엇이든 인쇄하려면 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 나열 할 수 있습니다. 그러나이 명령을 실행하는 것은 지금은 아무것도하지 않을 것입니다.이 시스템을 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 실행하여 사용 가능한 SYTEM 호출을 볼 수 있습니다. 명령 shutdown 실행하면 터미널이 종료됩니다.

NB : 이미 더 많은 SYTEM 전화를 구현했으며, 구현되지 않은 경우 Add, ycr, GetSize 등이 표시되지 않습니다.
우선, atoi 기능을 ulib.c 파일로 수정하여 음수도 처리하십시오.