// the registers xv6 will save and restore // to stop and subsequently restart a process structcontext { int eip; int esp; int ebx; int ecx; int edx; int esi; int edi; int ebp; };
// the different states a process can be in enumproc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
// the information xv6 tracks about each process // including its register context and state structproc { char *mem; // Start of process memory uint sz; // Size of process memory char *kstack; // Bottom of kernel stack // for this process enumproc_statestate;// Process state int pid; // Process ID structproc *parent;// Parent process void *chan; // If non-zero, sleeping on chan int killed; // If non-zero, have been killed structfile *ofile[NOFILE];// Open files structinode *cwd;// Current directory structcontextcontext;// Switch here to run process structtrapframe *tf;// Trap frame for the // current interrupt };
要执行系统调用,程序必须执行特殊的陷阱(trap)指令。该指令同时跳入内核并将特权级别提升到内核模式。一旦进入内核,系统就可以执行任何需要的特权操作,完成后,操作系统调用一个特殊的从陷阱返回(return-from-trap)指令,该指令返回到发起调用的用户程序中,同时将特权级别降低,回到用户模式。为了保证在操作系统发出从陷阱返回指令时能够正确返回,必须确保存储足够的调用者寄存器。例如,在 x86 上,处理器会将程序计数器、标志和其他一些寄存器推送到每个进程的内核栈(kernel stack)上
vfork() differs from fork(2) in that the calling thread is suspended until the child terminates (either normally, by calling _exit(2), or abnormally, after delivery of a fatal signal), or it makes a call to execve(2).
L vs V: whether you want to pass the parameters to the exec’ed program as
L: individual parameters in the call (variable argument list): execl(), execle(), execlp(), and execlpe()
V: as an array of char* execv(), execve(), execvp(), and execvpe()
The array format is useful when the number of parameters that are to be sent to the exec’ed process are variable – as in not known in advance, so you can’t put in a fixed number of parameters in a function call.
E: The versions with an ‘e’ at the end let you additionally pass an array of char* that are a set of strings added to the spawned processes environment before the exec’ed program launches. Yet another way of passing parameters, really.
P: The versions with ‘p’ in there use the environment variable PATH to search for the executable file named to execute. The versions without the ‘p’ require an absolute or relative file path to be prepended to the filename of the executable if it is not in the current working directory.