X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=doc%2Fuserprog.texi;h=78ef78d8bfc8d9ba3e41a5b67407f7a1390e01e7;hb=c37b82251bbe85edf2d46284f6d4b43b92b09182;hp=f70957f6617ba4a39f32b6a9f7129adb0214d620;hpb=e5a71e1b767082687454f54f3c72b53665101d74;p=pintos-anon diff --git a/doc/userprog.texi b/doc/userprog.texi index f70957f..78ef78d 100644 --- a/doc/userprog.texi +++ b/doc/userprog.texi @@ -247,14 +247,21 @@ requirements: @itemize @bullet @item -The kernel should print out the program's name and exit status -whenever a process terminates, e.g.@: @code{shell: exit(-1)}, whether -termination is due to a call to the @code{exit} system call or for -another reason. The name printed should be the full name passed to -@func{process_execute}, except that it is acceptable to truncate it to -15 characters to allow for the limited space in @struct{thread}. +The kernel should print out the program's name and exit status whenever +a process terminates, whether termination is caused by the @code{exit} +system call or for another reason. @itemize @minus +@item +The message must be formatted exactly as if it was printed with +@code{printf ("%s: exit(%d)\n", @dots{});} given appropriate arguments. + +@item +The name printed should be the full name passed to +@func{process_execute}, except that it is acceptable to truncate it to +15 characters to allow for the limited space in @struct{thread}. The +name printed need not include arguments. + @item Do not print a message when a kernel thread that is not a process terminates. @@ -264,7 +271,7 @@ Do not print messages about process termination for the @code{halt} system call. @item -No message need be printed when a process that fails to load. +No message need be printed when a process fails to load. @end itemize @item @@ -459,7 +466,7 @@ the @file{filesys} directory, and release it afterward. Don't forget that @func{process_execute} also accesses files. @strong{For now, we recommend against modifying code in the @file{filesys} directory.} -We have provided you a function for each system call in +We have provided you a user-level function for each system call in @file{lib/user/syscall.c}. These provide a way for user processes to invoke each system call from a C program. Each of them calls an assembly language routine in @file{lib/user/syscall-stub.S}, which in @@ -467,8 +474,11 @@ turn invokes the system call interrupt and returns. When you're done with this part, and forevermore, Pintos should be bulletproof. Nothing that a user program can do should ever cause the -OS to crash, halt, assert fail, or otherwise stop running. The sole -exception is a call to the @code{halt} system call. +OS to crash, halt, assert fail, or otherwise stop running. It is +important to emphasize this point: our tests will try to break your +system calls in many, many ways. You need to think of all the corner +cases and handle them. The sole way a user program should be able to +cause the OS to halt is by invoking the @code{halt} system call. If a system call is passed an invalid argument, acceptable options include returning an error value (for those calls that return a @@ -832,7 +842,7 @@ After we push all of the strings onto the stack, we adjust the stack pointer so that it is word-aligned: that is, we move it down to the next 4-byte boundary. This is required because we will next be placing several words of data on the stack, and they must be aligned -in order to be read correctly. In our example, as you'll see below, +to be read correctly. In our example, as you'll see below, the strings start at address @t{0xffed}. One word below that would be at @t{0xffe9}, so we could in theory put the next word on the stack there. However, since the stack pointer should always be @@ -964,3 +974,9 @@ In this example, the caller's stack pointer would be at The 80@var{x}86 convention for function return values is to place them in the @samp{EAX} register. System calls that return a value can do so by modifying the @samp{eax} member of @struct{intr_frame}. + +You should try to avoid writing large amounts of repetitive code for +implementing system calls. Each system call argument, whether an +integer or a pointer, takes up 4 bytes on the stack. You should be able +to take advantage of this to avoid writing much near-identical code for +retrieving each system call's arguments from the stack.