ستحصل على أحدث Verson المعدلة من XV6 وفقًا لهذا المستودع هنا
استنساخ مستودع XV6 الرسمي من هنا. نحتاج إلى محاكي للتمهيد XV6. سنستخدم QEMU لهذا الغرض. لتثبيت QEMU ، قم بالتشغيل من المحطة الخاصة بك
sudo apt install qemu
ثم من حيث تم استنساخ XV6 ، قم بتشغيل make to Toled XV6. ثم لإطلاق المحاكي ، قم make qemu وسترى QEMU في نافذة مختلفة. إذا لم تطلق Qemu ، فستدير
sudo apt install qemu-system-x86
make qemu
هذه المرة ، يجب أن تعمل. ومع ذلك ، قد تواجه مشكلات مثل هذا ، فهناك طريقة.
لتشغيل QEMU في نفس المحطة التي تستخدمها ، قم بتشغيل make qemu-nox بدلاً من make qemu .
بعد إطلاق QEMU ، سترى مكالمات النظام التالية عن طريق تشغيل ls 
يمكننا تعديل الكود المصدري ورؤية التأثيرات على الفور. تقول أننا نريد استبدال علامة $ بشيء آخر. للقيام بذلك ، انتقل إلى ملف 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 كما يمكنك أن ترى أنها مهمة مملة وسننشئ دعوة نظام للخروج من المحطة).

يبدو أن استخدام وحدة المعالجة المركزية دائمًا 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
}لاحظ أنه لطباعة أي شيء في وحدة التحكم ، نحتاج إلى إضافة واصف ملف كمعلمة أول من printf على عكس لغة C.
ثم في 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); الآن ، هناك ملفان يحتويان على طرق لمكالمات النظام. يحتوي sysfile.c على طرق تتعلق بالملفات و sysproc.c يحتوي على طرق تتعلق بالعمليات. يجب أن نكتب طريقة جديدة تسمى sys_shutdown في sysproc.c .
void sys_shutdown ( void ){
outw ( 0xB004 , 0x0 | 0x2000 );
outw ( 0x604 , 0x0 | 0x2000 );
} إذا كان كل شيء على ما يرام حتى الآن ، فيمكنك الخروج من QEMU ، وتشغيل make qemu-nox وشاهد مكالمات Sytem المتاحة عن طريق تشغيل ls .Run shutdown الأمر وسترى الطرف يخرج.

NB : لقد قمت بالفعل بتنفيذ عدد قليل من مكالمات Sytem. لن ترى إضافة ، زيادة ، GetC وما إلى الآن إذا لم يتم تنفيذها.
بادئ ذي بدء ، قم بتعديل وظيفة atoi في ملف ulib.c بحيث يتعامل مع الأرقام السلبية أيضًا.