X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=doc%2Fuserprog.texi;h=60a53ee09cc6d876cb562d64be4544689e4716fc;hb=d26c924c8cd947e91bd4f5e8d0b7f74d3460d22b;hp=fa534d2382ef3007c36a3f809efbe3eaee29be55;hpb=837e5b7fb902bd749106309ef76a5276c73ca34c;p=pintos-anon diff --git a/doc/userprog.texi b/doc/userprog.texi index fa534d2..60a53ee 100644 --- a/doc/userprog.texi +++ b/doc/userprog.texi @@ -301,7 +301,7 @@ regardless of what user process or kernel thread is running. In Pintos, kernel virtual memory is mapped one-to-one to physical memory, starting at @code{PHYS_BASE}. That is, virtual address @code{PHYS_BASE} accesses physical -address 0, virtual address @code{PHYS_BASE} + @t{0x1234} access +address 0, virtual address @code{PHYS_BASE} + @t{0x1234} accesses physical address @t{0x1234}, and so on up to the size of the machine's physical memory. @@ -314,11 +314,6 @@ the running process. However, even in the kernel, an attempt to access memory at an unmapped user virtual address will cause a page fault. -You must handle memory fragmentation gracefully, that is, a process that -needs @var{N} pages of user virtual memory must not require those pages -to be contiguous in physical memory (or, equivalently, in kernel virtual -memory). - @menu * Typical Memory Layout:: @end menu @@ -571,13 +566,13 @@ word is the program name, the second word is the first argument, and so on. That is, @code{process_execute("grep foo bar")} should run @command{grep} passing two arguments @code{foo} and @code{bar}. -Within a command line, multiple spaces are equivalent to a single space, -so that @code{process_execute("grep foo bar")} is equivalent to our -original example. You can impose a reasonable limit on the length of -the command line arguments. For example, you could limit the arguments -to those that will fit in a single page (4 kB). (There is an unrelated -limit of 128 bytes on command-line arguments that the @command{pintos} -utility can pass to the kernel.) +Within a command line, multiple spaces are equivalent to a single +space, so that @code{process_execute("grep @w{ }foo @w{ }@w{ }bar")} +is equivalent to our original example. You can impose a reasonable +limit on the length of the command line arguments. For example, you +could limit the arguments to those that will fit in a single page (4 +kB). (There is an unrelated limit of 128 bytes on command-line +arguments that the @command{pintos} utility can pass to the kernel.) You can parse argument strings any way you like. If you're lost, look at @func{strtok_r}, prototyped in @file{lib/string.h} and @@ -621,13 +616,17 @@ Runs the executable whose name is given in @var{cmd_line}, passing any given arguments, and returns the new process's program id (pid). Must return pid -1, which otherwise should not be a valid pid, if the program cannot load or run for any reason. +Thus, the parent process cannot return from the @code{exec} until it +knows whether the child process successfully loaded its executable. +You must use appropriate synchronization to ensure this. @end deftypefn @deftypefn {System Call} int wait (pid_t @var{pid}) -Waits for process @var{pid} to die and returns the status it passed to -@code{exit}. Returns -1 if @var{pid} +If process @var{pid} is still alive, waits until it dies. +Then, returns the status that @var{pid} passed to @code{exit}, +or -1 if @var{pid} was terminated by the kernel (e.g.@: killed due to an exception). If -@var{pid} is does not refer to a child of the +@var{pid} does not refer to a child of the calling thread, or if @code{wait} has already been successfully called for the given @var{pid}, returns -1 immediately, without waiting. @@ -659,11 +658,15 @@ of the rest. @deftypefn {System Call} bool create (const char *@var{file}, unsigned @var{initial_size}) Creates a new file called @var{file} initially @var{initial_size} bytes in size. Returns true if successful, false otherwise. +Opening the new file is a separate operation using the @code{open} +system call. @end deftypefn @deftypefn {System Call} bool remove (const char *@var{file}) Deletes the file called @var{file}. Returns true if successful, false otherwise. +A file may be removed regardless of whether it is open or closed +(@pxref{Removing an Open File}, for more information). @end deftypefn @deftypefn {System Call} int open (const char *@var{file}) @@ -679,6 +682,12 @@ as explicitly described below. Each process has an independent set of file descriptors. File descriptors are not inherited by child processes. + +When a single file is opened more than once, whether by a single +process or different processes, each @code{open} returns a new file +descriptor. Different file descriptors for a single file are closed +independently in separate calls to @code{close} and they do not share +a file position. @end deftypefn @deftypefn {System Call} int filesize (int @var{fd}) @@ -969,6 +978,18 @@ or the machine shuts down. You may modify the stack setup code to allocate more than one page of stack space for each process. In the next project, you will implement a better solution. + +@item What should happen if an @code{exec} fails midway through loading? + +@code{exec} should return -1 if the child process fails to load for +any reason. This includes the case where the load fails part of the +way through the process (e.g.@: where it runs out of memory in the +@code{multi-oom} test). Therefore, the parent process cannot return +from the @code{exec} system call until it is established whether the +load was successful or not. The child must communicate this +information to its parent using appropriate synchronization, such as a +semaphore (@pxref{Semaphores}), to ensure that the information is +communicated without race conditions. @end table @node 80x86 Calling Convention