Вы получите последнюю модифицированную Verson XV6 в соответствии с этим хранилищем здесь
Отсюда клонировать официальный репозиторий 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-nox вместо того, чтобы make qemu .
После запуска QEMU вы увидите следующие системные вызовы, запустив ls 
Мы можем изменить исходный код и мгновенно getcmd эффекты. Давайте скажут sh.c что мы хотим заменить знак $ на что -то еще.
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 . shutdown команды, и вы увидите выход терминала.

NB : Я уже реализовал еще несколько звонков Sytem. Вы не увидите Add, Incur, Getize и т. Д., Если они не реализованы.
Прежде всего, измените функцию atoi в файле ulib.c , чтобы она также обрабатывала отрицательные числа.