您将根据此存储库获得最新的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-nox而不是make qemu 。
启动QEMU后,您将通过运行ls看到以下系统调用
我们可以修改源代码并立即查看效果。LETS说我们想用其他内容替换$ sign。要执行此操作,转到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,然后立即键入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
}请注意,要在控制台中打印任何内容,我们需要将文件描述符添加为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 。运行命令shutdown查看可用的系统调用,您将看到终端退出。

NB :我已经实现了更多的系统调用。
首先,在ulib.c文件中修改atoi函数,以便处理负数。