qemu is much faster than Bochs.
[pintos-anon] / doc / userprog.texi
1 @node Project 2--User Programs
2 @chapter Project 2: User Programs
3
4 Now that you've worked with Pintos and are becoming familiar with its
5 infrastructure and thread package, it's time to start working on the
6 parts of the system that allow running user programs.
7 The base code already supports loading and
8 running user programs, but no I/O or interactivity
9 is possible.  In this project, you will enable programs to interact with
10 the OS via system calls.
11
12 You will be working out of the @file{userprog} directory for this
13 assignment, but you will also be interacting with almost every
14 other part of Pintos.  We will describe the
15 relevant parts below.
16
17 You can build project 2 on top of your project 1 submission or you can
18 start fresh.  No code from project 1 is required for this
19 assignment.  The ``alarm clock'' functionality may be useful in
20 projects 3 and 4, but it is not strictly required.
21
22 You might find it useful to go back and reread how to run the tests
23 (@pxref{Testing}).  In particular, the tests for project 2 (and later
24 projects) will run much faster if you use the qemu emulator, e.g.@:
25 via @code{make check PINTOSOPTS='--qemu'}.
26
27 @menu
28 * Project 2 Background::        
29 * Project 2 Suggested Order of Implementation::  
30 * Project 2 Requirements::      
31 * Project 2 FAQ::               
32 * 80x86 Calling Convention::    
33 @end menu
34
35 @node Project 2 Background
36 @section Background
37
38 Up to now, all of the code you have run under Pintos has been part
39 of the operating system kernel.  This means, for example, that all the
40 test code from the last assignment ran as part of the kernel, with
41 full access to privileged parts of the system.  Once we start running
42 user programs on top of the operating system, this is no longer true.
43 This project deals with the consequences.
44
45 We allow more than one process to run at a time.  Each process has one
46 thread (multithreaded processes are not supported).  User programs are
47 written under the illusion that they have the entire machine.  This
48 means that when you load and run multiple processes at a time, you must
49 manage memory, scheduling, and other state correctly to maintain this
50 illusion.
51
52 In the previous project, we compiled our test code directly into your
53 kernel, so we had to require certain specific function interfaces within
54 the kernel.  From now on, we will test your operating system by running
55 user programs.  This gives you much greater freedom.  You must make sure
56 that the user program interface meets the specifications described here,
57 but given that constraint you are free to restructure or rewrite kernel
58 code however you wish.
59
60 @menu
61 * Project 2 Source Files::      
62 * Using the File System::       
63 * How User Programs Work::      
64 * Virtual Memory Layout::       
65 * Accessing User Memory::       
66 @end menu
67
68 @node Project 2 Source Files
69 @subsection Source Files
70
71 The easiest way to get an overview of the programming you will be
72 doing is to simply go over each part you'll be working with.  In
73 @file{userprog}, you'll find a small number of files, but here is
74 where the bulk of your work will be:
75
76 @table @file
77 @item process.c
78 @itemx process.h
79 Loads ELF binaries and starts processes.
80
81 @item pagedir.c
82 @itemx pagedir.h
83 A simple manager for 80@var{x}86 hardware page tables.
84 Although you probably won't want to modify this code for this project,
85 you may want to call some of its functions.
86 @xref{Page Tables}, for more information.
87
88 @item syscall.c
89 @itemx syscall.h
90 Whenever a user process wants to access some kernel functionality, it
91 invokes a system call.  This is a skeleton system call
92 handler.  Currently, it just prints a message and terminates the user
93 process.  In part 2 of this project you will add code to do everything
94 else needed by system calls.
95
96 @item exception.c
97 @itemx exception.h
98 When a user process performs a privileged or prohibited operation, it
99 traps into the kernel as an ``exception'' or ``fault.''@footnote{We
100 will treat these terms as synonyms.  There is no standard
101 distinction between them, although Intel processor manuals make 
102 a minor distinction between them on 80@var{x}86.}  These files handle
103 exceptions.  Currently all exceptions simply print a message and
104 terminate the process.  Some, but not all, solutions to project 2
105 require modifying @func{page_fault} in this file.
106
107 @item gdt.c
108 @itemx gdt.h
109 The 80@var{x}86 is a segmented architecture.  The Global Descriptor
110 Table (GDT) is a table that describes the segments in use.  These
111 files set up the GDT.  You should not need to modify these
112 files for any of the projects.  You can read the code if
113 you're interested in how the GDT works.
114
115 @item tss.c
116 @itemx tss.h
117 The Task-State Segment (TSS) is used for 80@var{x}86 architectural
118 task switching.  Pintos uses the TSS only for switching stacks when a
119 user process enters an interrupt handler, as does Linux.  You
120 should not need to modify these files for any of the projects.
121 You can read the code if you're interested in how the TSS
122 works.
123 @end table
124
125 @node Using the File System
126 @subsection Using the File System
127
128 You will need to interface to the file system code for this project,
129 because
130 user programs are loaded from the file system and many of the
131 system calls you must implement deal with the file system.  However,
132 the focus of this project is not the file system, so we have
133 provided a simple but complete file system in the @file{filesys}
134 directory.  You
135 will want to look over the @file{filesys.h} and @file{file.h}
136 interfaces to understand how to use the file system, and especially
137 its many limitations.
138
139 There is no need to modify the file system code for this project, and so
140 we recommend that you do not.  Working on the file system is likely to
141 distract you from this project's focus.
142
143 Proper use of the file system routines now
144 will make life much easier for project 4, when you improve the file
145 system implementation.  Until then, you will have to tolerate the
146 following limitations:
147
148 @itemize @bullet
149 @item
150 No internal synchronization.  Concurrent accesses will interfere with one
151 another.  You should use synchronization to ensure that only one process at a
152 time is executing file system code.
153
154 @item
155 File size is fixed at creation time.  The root directory is
156 represented as a file, so the number of files that may be created is also
157 limited.
158
159 @item
160 File data is allocated as a single extent, that is, data in a single
161 file must occupy a contiguous range of sectors on disk.  External
162 fragmentation can therefore become a serious problem as a file system is
163 used over time.
164
165 @item
166 No subdirectories.
167
168 @item
169 File names are limited to 14 characters.
170
171 @item
172 A system crash mid-operation may corrupt the disk in a way
173 that cannot be repaired automatically.  There is no file system repair
174 tool anyway.
175 @end itemize
176
177 One important feature is included:
178
179 @itemize @bullet
180 @item
181 Unix-like semantics for @func{filesys_remove} are implemented.
182 That is, if a file is open when it is removed, its blocks
183 are not deallocated and it may still be accessed by any
184 threads that have it open, until the last one closes it.  @xref{Removing
185 an Open File}, for more information.
186 @end itemize
187
188 You need to be able to create simulated disks.  The
189 @command{pintos-mkdisk} program provides this functionality.  From the
190 @file{userprog/build} directory, execute @code{pintos-mkdisk fs.dsk@tie{}2}.
191 This command creates a 2 MB simulated disk named @file{fs.dsk}.  Then
192 format the disk by passing @option{-f -q} on the kernel's command
193 line: @code{pintos -f -q}.  The @option{-f} option causes the disk to be
194 formatted, and @option{-q} causes Pintos to exit as soon as the format
195 is done.
196
197 You'll need a way to copy files in and out of the simulated file system.
198 The @code{pintos} @option{-p} (``put'') and @option{-g} (``get'')
199 options do this.  To copy @file{@var{file}} into the
200 Pintos file system, use the command @file{pintos -p @var{file} -- -q}.
201 (The @samp{--} is needed because @option{-p} is for the @command{pintos}
202 script, not for the simulated kernel.)  To copy it to the Pintos file
203 system under the name @file{@var{newname}}, add @option{-a
204 @var{newname}}: @file{pintos -p @var{file} -a @var{newname} -- -q}.  The
205 commands for copying files out of a VM are similar, but substitute
206 @option{-g} for @option{-p}.
207
208 Incidentally, these commands work by passing special commands
209 @command{put} and @command{get} on the kernel's command line and copying
210 to and from a special simulated ``scratch'' disk.  If you're very
211 curious, you can look at the @command{pintos} script as well as
212 @file{filesys/fsutil.c} to learn the implementation details.
213
214 Here's a summary of how to create and format a disk, copy the
215 @command{echo} program into the new disk, and then run @command{echo},
216 passing argument @code{x}.  (Argument passing won't work until
217 you implemented it.)  It assumes
218 that you've already built the
219 examples in @file{examples} and that the current directory is
220 @file{userprog/build}:
221
222 @example
223 pintos-mkdisk fs.dsk 2
224 pintos -f -q
225 pintos -p ../../examples/echo -a echo -- -q
226 pintos -q run 'echo x'
227 @end example
228
229 The three final steps can actually be combined into a single command:
230
231 @example
232 pintos-mkdisk fs.dsk 2
233 pintos -p ../../examples/echo -a echo -- -f -q run 'echo x'
234 @end example
235
236 If you don't want to keep the file system disk around for later use or
237 inspection, you can even combine all four steps into a single command.
238 The @code{--fs-disk=@var{n}} option creates a temporary disk
239 approximately @var{n} megabytes in size just for the duration of the
240 @command{pintos} run.  The Pintos automatic test suite makes extensive
241 use of this syntax:
242
243 @example
244 pintos --fs-disk=2 -p ../../examples/echo -a echo -- -f -q run 'echo x'
245 @end example
246
247 You can delete a file from the Pintos file system using the @code{rm
248 @var{file}} kernel action, e.g.@: @code{pintos -q rm @var{file}}.  Also,
249 @command{ls} lists the files in the file system and @code{cat
250 @var{file}} prints a file's contents to the display.
251
252 @node How User Programs Work
253 @subsection How User Programs Work
254
255 Pintos can run normal C programs, as long as they fit into memory and use
256 only the system calls you implement.  Notably, @func{malloc} cannot be
257 implemented because none of the system calls required for this project
258 allow for memory allocation.  Pintos also can't run programs that use
259 floating point operations, since the kernel doesn't save and restore the
260 processor's floating-point unit when switching threads.
261
262 The @file{src/examples} directory contains a few sample user
263 programs.  The @file{Makefile} in this directory
264 compiles the provided examples, and you can edit it
265 compile your own programs as well.  Some of the example programs will
266 only work once projects 3 or 4 have been implemented.
267
268 Pintos can load @dfn{ELF} executables with the loader provided for you
269 in @file{userprog/process.c}.  ELF is a file format used by Linux,
270 Solaris, and many other operating systems for object files,
271 shared libraries, and executables.  You can actually use any compiler
272 and linker that output 80@var{x}86 ELF executables to produce programs
273 for Pintos.  (We've provided compilers and linkers that should do just
274 fine.)
275
276 You should realize immediately that, until you copy a
277 test program to the simulated disk, Pintos will be unable to do
278 useful work.  You won't be able to do
279 interesting things until you copy a variety of programs to the disk.
280 You might want to create a clean reference disk and copy that
281 over whenever you trash your @file{fs.dsk} beyond a useful state,
282 which may happen occasionally while debugging.
283
284 @node Virtual Memory Layout
285 @subsection Virtual Memory Layout
286
287 Virtual memory in Pintos is divided into two regions: user virtual
288 memory and kernel virtual memory.  User virtual memory ranges from
289 virtual address 0 up to @code{PHYS_BASE}, which is defined in
290 @file{threads/vaddr.h} and defaults to @t{0xc0000000} (3 GB).  Kernel
291 virtual memory occupies the rest of the virtual address space, from
292 @code{PHYS_BASE} up to 4 GB.
293
294 User virtual memory is per-process.
295 When the kernel switches from one process to another, it
296 also switches user virtual address spaces by changing the processor's
297 page directory base register (see @func{pagedir_activate} in
298 @file{userprog/pagedir.c}).  @struct{thread} contains a pointer to a
299 process's page table.
300
301 Kernel virtual memory is global.  It is always mapped the same way,
302 regardless of what user process or kernel thread is running.  In
303 Pintos, kernel virtual memory is mapped one-to-one to physical
304 memory, starting at @code{PHYS_BASE}.  That is, virtual address
305 @code{PHYS_BASE} accesses physical
306 address 0, virtual address @code{PHYS_BASE} + @t{0x1234} access
307 physical address @t{0x1234}, and so on up to the size of the machine's
308 physical memory.
309
310 A user program can only access its own user virtual memory.  An attempt to
311 access kernel virtual memory causes a page fault, handled by
312 @func{page_fault} in @file{userprog/exception.c}, and the process
313 will be terminated.  Kernel threads can access both kernel virtual
314 memory and, if a user process is running, the user virtual memory of
315 the running process.  However, even in the kernel, an attempt to
316 access memory at an unmapped user virtual address
317 will cause a page fault.
318
319 You must handle memory fragmentation gracefully, that is, a process that
320 needs @var{N} pages of user virtual memory must not require those pages
321 to be contiguous in physical memory (or, equivalently, in kernel virtual
322 memory).
323
324 @menu
325 * Typical Memory Layout::       
326 @end menu
327
328 @node Typical Memory Layout
329 @subsubsection Typical Memory Layout
330
331 Conceptually, each process is
332 free to lay out its own user virtual memory however it
333 chooses.  In practice, user virtual memory is laid out like this:
334
335 @html
336 <CENTER>
337 @end html
338 @example
339 @group
340    PHYS_BASE +----------------------------------+
341              |            user stack            |
342              |                 |                |
343              |                 |                |
344              |                 V                |
345              |          grows downward          |
346              |                                  |
347              |                                  |
348              |                                  |
349              |                                  |
350              |           grows upward           |
351              |                 ^                |
352              |                 |                |
353              |                 |                |
354              +----------------------------------+
355              | uninitialized data segment (BSS) |
356              +----------------------------------+
357              |     initialized data segment     |
358              +----------------------------------+
359              |           code segment           |
360   0x08048000 +----------------------------------+
361              |                                  |
362              |                                  |
363              |                                  |
364              |                                  |
365              |                                  |
366            0 +----------------------------------+
367 @end group
368 @end example
369 @html
370 </CENTER>
371 @end html
372
373 In this project, the user stack is fixed in size, but in project 3 it
374 will be allowed to grow.  Traditionally, the size of the uninitialized
375 data segment can be adjusted with a system call, but you will not have
376 to implement this.
377
378 The code segment in Pintos starts at user virtual address
379 @t{0x08084000}, approximately 128 MB from the bottom of the address
380 space.  This value is specified in @bibref{SysV-i386} and has no deep
381 significance.
382
383 The linker sets the layout of a user program in memory, as directed by a
384 ``linker script'' that tells it the names and locations of the various
385 program segments.  You can learn more about linker scripts by reading
386 the ``Scripts'' chapter in the linker manual, accessible via @samp{info
387 ld}.
388
389 To view the layout of a particular executable, run @command{objdump}
390 (80@var{x}86) or @command{i386-elf-objdump} (SPARC) with the @option{-p}
391 option.
392
393 @node Accessing User Memory
394 @subsection Accessing User Memory
395
396 As part of a system
397 call, the kernel must often access memory through pointers provided by a user
398 program.  The kernel must be very careful about doing so, because
399 the user can pass a null pointer, a pointer to
400 unmapped virtual memory, or a pointer to kernel virtual address space
401 (above @code{PHYS_BASE}).  All of these types of invalid pointers must
402 be rejected without harm to the kernel or other running processes, by
403 terminating the offending process and freeing its resources.
404
405 There are at least two reasonable ways to do this correctly.  The
406 first method is to verify
407 the validity of a user-provided pointer, then dereference it.  If you
408 choose this route, you'll want to look at the functions in
409 @file{userprog/pagedir.c} and in @file{threads/vaddr.h}.  This is the
410 simplest way to handle user memory access.
411
412 The second method is to check only that a user
413 pointer points below @code{PHYS_BASE}, then dereference it.
414 An invalid user pointer will cause a ``page fault'' that you can
415 handle by modifying the code for @func{page_fault} in
416 @file{userprog/exception.cc}.  This technique is normally faster
417 because it takes advantage of the processor's MMU, so it tends to be
418 used in real kernels (including Linux).
419
420 In either case, you need to make sure not to ``leak'' resources.  For
421 example, suppose that your system call has acquired a lock or
422 allocated memory with @func{malloc}.  If you encounter an invalid user pointer
423 afterward, you must still be sure to release the lock or free the page
424 of memory.  If you choose to verify user pointers before dereferencing
425 them, this should be straightforward.  It's more difficult to handle
426 if an invalid pointer causes a page fault,
427 because there's no way to return an error code from a memory access.
428 Therefore, for those who want to try the latter technique, we'll
429 provide a little bit of helpful code:
430
431 @verbatim
432 /* Reads a byte at user virtual address UADDR.
433    UADDR must be below PHYS_BASE.
434    Returns the byte value if successful, -1 if a segfault
435    occurred. */
436 static int
437 get_user (const uint8_t *uaddr)
438 {
439   int result;
440   asm ("movl $1f, %0; movzbl %1, %0; 1:"
441        : "=&a" (result) : "m" (*uaddr));
442   return result;
443 }
444  
445 /* Writes BYTE to user address UDST.
446    UDST must be below PHYS_BASE.
447    Returns true if successful, false if a segfault occurred. */
448 static bool
449 put_user (uint8_t *udst, uint8_t byte)
450 {
451   int error_code;
452   asm ("movl $1f, %0; movb %b2, %1; 1:"
453        : "=&a" (error_code), "=m" (*udst) : "r" (byte));
454   return error_code != -1;
455 }
456 @end verbatim
457
458 Each of these functions assumes that the user address has already been
459 verified to be below @code{PHYS_BASE}.  They also assume that you've
460 modified @func{page_fault} so that a page fault in the kernel merely
461 sets @code{eax} to @t{0xffffffff} and copies its former value
462 into @code{eip}.
463
464 @node Project 2 Suggested Order of Implementation
465 @section Suggested Order of Implementation
466
467 We suggest first implementing the following, which can happen in
468 parallel:
469
470 @itemize
471 @item
472 Argument passing (@pxref{Argument Passing}).  Every user program will
473 page fault immediately until argument passing is implemented.
474
475 For now, you may simply wish to change
476 @example
477 *esp = PHYS_BASE;
478 @end example
479 @noindent to
480 @example
481 *esp = PHYS_BASE - 12;
482 @end example
483 in @func{setup_stack}.  That will work for any test program that doesn't
484 examine its arguments, although its name will be printed as
485 @code{(null)}.
486
487 Until you implement argument passing, you should only run programs
488 without passing command-line arguments.  Attempting to pass arguments to
489 a program will include those arguments in the name of the program, which
490 will probably fail.
491
492 @item
493 User memory access (@pxref{Accessing User Memory}).  All system calls
494 need to read user memory.  Few system calls need to write to user
495 memory.
496
497 @item
498 System call infrastructure (@pxref{System Calls}).  Implement enough
499 code to read the system call number from the user stack and dispatch to
500 a handler based on it.
501
502 @item
503 The @code{exit} system call.  Every user program that finishes in the
504 normal way calls @code{exit}.  Even a program that returns from
505 @func{main} calls @code{exit} indirectly (see @func{_start} in
506 @file{lib/user/entry.c}).
507
508 @item
509 The @code{write} system call for writing to fd 1, the system console.
510 All of our test programs write to the console (the user process version
511 of @func{printf} is implemented this way), so they will all malfunction
512 until @code{write} is available.
513
514 @item
515 For now, change @func{process_wait} to an infinite loop (one that waits
516 forever).  The provided implementation returns immediately, so Pintos
517 will power off before any processes actually get to run.  You will
518 eventually need to provide a correct implementation.
519 @end itemize
520
521 After the above are implemented, user processes should work minimally.
522 At the very least, they can write to the console and exit correctly.
523 You can then refine your implementation so that some of the tests start
524 to pass.
525
526 @node Project 2 Requirements
527 @section Requirements
528
529 @menu
530 * Project 2 Design Document::   
531 * Process Termination Messages::  
532 * Argument Passing::            
533 * System Calls::                
534 * Denying Writes to Executables::  
535 @end menu
536
537 @node Project 2 Design Document
538 @subsection Design Document
539
540 Before you turn in your project, you must copy @uref{userprog.tmpl, ,
541 the project 2 design document template} into your source tree under the
542 name @file{pintos/src/userprog/DESIGNDOC} and fill it in.  We recommend
543 that you read the design document template before you start working on
544 the project.  @xref{Project Documentation}, for a sample design document
545 that goes along with a fictitious project.
546
547 @node Process Termination Messages
548 @subsection Process Termination Messages
549
550 Whenever a user process terminates, because it called @code{exit}
551 or for any other reason, print the process's name
552 and exit code, formatted as if printed by @code{printf ("%s:
553 exit(%d)\n", @dots{});}.  The name printed should be the full name
554 passed to @func{process_execute}, omitting command-line arguments.
555 Do not print these messages when a kernel thread that is not a user
556 process terminates, or
557 when the @code{halt} system call is invoked.  The message is optional
558 when a process fails to load.
559
560 Aside from this, don't print any other
561 messages that Pintos as provided doesn't already print.  You may find
562 extra messages useful during debugging, but they will confuse the
563 grading scripts and thus lower your score.
564
565 @node Argument Passing
566 @subsection Argument Passing
567
568 Currently, @func{process_execute} does not support passing arguments to
569 new processes.  Implement this functionality, by extending
570 @func{process_execute} so that instead of simply taking a program file
571 name as its argument, it divides it into words at spaces.  The first
572 word is the program name, the second word is the first argument, and so
573 on.  That is, @code{process_execute("grep foo bar")} should run
574 @command{grep} passing two arguments @code{foo} and @code{bar}.
575
576 Within a command line, multiple spaces are equivalent to a single space,
577 so that @code{process_execute("grep foo bar")} is equivalent to our
578 original example.  You can impose a reasonable limit on the length of
579 the command line arguments.  For example, you could limit the arguments
580 to those that will fit in a single page (4 kB).  (There is an unrelated
581 limit of 128 bytes on command-line arguments that the @command{pintos}
582 utility can pass to the kernel.)
583
584 You can parse argument strings any way you like.  If you're lost,
585 look at @func{strtok_r}, prototyped in @file{lib/string.h} and
586 implemented with thorough comments in @file{lib/string.c}.  You can
587 find more about it by looking at the man page (run @code{man strtok_r}
588 at the prompt).
589
590 @xref{Program Startup Details}, for information on exactly how you
591 need to set up the stack.
592
593 @node System Calls
594 @subsection System Calls
595
596 Implement the system call handler in @file{userprog/syscall.c}.  The
597 skeleton implementation we provide ``handles'' system calls by
598 terminating the process.  It will need to retrieve the system call
599 number, then any system call arguments, and carry out appropriate actions.
600
601 Implement the following system calls.  The prototypes listed are those
602 seen by a user program that includes @file{lib/user/syscall.h}.  (This
603 header, and all others in @file{lib/user}, are for use by user
604 programs only.)  System call numbers for each system call are defined in
605 @file{lib/syscall-nr.h}:
606
607 @deftypefn {System Call} void halt (void)
608 Terminates Pintos by calling @func{power_off} (declared in
609 @file{threads/init.h}).  This should be seldom used, because you lose
610 some information about possible deadlock situations, etc.
611 @end deftypefn
612
613 @deftypefn {System Call} void exit (int @var{status})
614 Terminates the current user program, returning @var{status} to the
615 kernel.  If the process's parent @code{wait}s for it (see below), this
616 is the status
617 that will be returned.  Conventionally, a @var{status} of 0 indicates
618 success and nonzero values indicate errors.
619 @end deftypefn
620
621 @deftypefn {System Call} pid_t exec (const char *@var{cmd_line})
622 Runs the executable whose name is given in @var{cmd_line}, passing any
623 given arguments, and returns the new process's program id (pid).  Must
624 return pid -1, which otherwise should not be a valid pid, if
625 the program cannot load or run for any reason.
626 @end deftypefn
627
628 @deftypefn {System Call} int wait (pid_t @var{pid})
629 Waits for process @var{pid} to die and returns the status it passed to
630 @code{exit}.  Returns -1 if @var{pid}
631 was terminated by the kernel (e.g.@: killed due to an exception).  If
632 @var{pid} is does not refer to a child of the
633 calling thread, or if @code{wait} has already been successfully
634 called for the given @var{pid}, returns -1 immediately, without
635 waiting.
636
637 You must ensure that Pintos does not terminate until the initial
638 process exits.  The supplied Pintos code tries to do this by calling
639 @func{process_wait} (in @file{userprog/process.c}) from @func{main}
640 (in @file{threads/init.c}).  We suggest that you implement
641 @func{process_wait} according to the comment at the top of the
642 function and then implement the @code{wait} system call in terms of
643 @func{process_wait}.
644
645 All of a process's resources, including its @struct{thread}, must be
646 freed whether its parent ever waits for it or not, and regardless of
647 whether the child exits before or after its parent.
648
649 Children are not inherited: if @var{A} has child @var{B} and
650 @var{B} has child @var{C}, then @code{wait(C)} always returns immediately
651 when called from @var{A}, even if @var{B} is dead.
652
653 Consider all the ways a wait can occur: nested waits (@var{A} waits
654 for @var{B}, then @var{B} waits for @var{C}), multiple waits (@var{A}
655 waits for @var{B}, then @var{A} waits for @var{C}), and so on.
656
657 Implementing this system call requires considerably more work than any
658 of the rest.
659 @end deftypefn
660
661 @deftypefn {System Call} bool create (const char *@var{file}, unsigned @var{initial_size})
662 Creates a new file called @var{file} initially @var{initial_size} bytes
663 in size.  Returns true if successful, false otherwise.
664 @end deftypefn
665
666 @deftypefn {System Call} bool remove (const char *@var{file})
667 Deletes the file called @var{file}.  Returns true if successful, false
668 otherwise.
669 @end deftypefn
670
671 @deftypefn {System Call} int open (const char *@var{file})
672 Opens the file called @var{file}.  Returns a nonnegative integer handle
673 called a ``file descriptor'' (fd), or -1 if the file could not be
674 opened.  
675
676 File descriptors numbered 0 and 1 are reserved for the console: fd 0
677 (@code{STDIN_FILENO}) is standard input, fd 1 (@code{STDOUT_FILENO}) is
678 standard output.  The @code{open} system call will never return either
679 of these file descriptors, which are valid as system call arguments only
680 as explicitly described below.
681
682 Each process has an independent set of file descriptors.  File
683 descriptors are not inherited by child processes.
684 @end deftypefn
685
686 @deftypefn {System Call} int filesize (int @var{fd})
687 Returns the size, in bytes, of the file open as @var{fd}.
688 @end deftypefn
689
690 @deftypefn {System Call} int read (int @var{fd}, void *@var{buffer}, unsigned @var{size})
691 Reads @var{size} bytes from the file open as @var{fd} into
692 @var{buffer}.  Returns the number of bytes actually read (0 at end of
693 file), or -1 if the file could not be read (due to a condition other
694 than end of file).  Fd 0 reads from the keyboard using
695 @func{kbd_getc}.  (Keyboard input will not work if you pass the
696 @option{-v} option to @command{pintos}.)
697 @end deftypefn
698
699 @deftypefn {System Call} int write (int @var{fd}, const void *@var{buffer}, unsigned @var{size})
700 Writes @var{size} bytes from @var{buffer} to the open file @var{fd}.
701 Returns the number of bytes actually written, or -1 if the file could
702 not be written.
703
704 Writing past end-of-file would normally extend the file, but file growth
705 is not implemented by the basic file system.  The expected behavior is
706 to write as many bytes as possible up to end-of-file and return the
707 actual number written, or -1 if no bytes could be written at all.
708
709 Fd 1 writes to the console.  Your code to write to the console should
710 write all of @var{buffer} in one call to @func{putbuf}, at least as
711 long as @var{size} is not bigger than a few hundred bytes.  (It is
712 reasonable to break up larger buffers.)  Otherwise,
713 lines of text output by different processes may end up interleaved on
714 the console, confusing both human readers and our grading scripts.
715 @end deftypefn
716
717 @deftypefn {System Call} void seek (int @var{fd}, unsigned @var{position})
718 Changes the next byte to be read or written in open file @var{fd} to
719 @var{position}, expressed in bytes from the beginning of the file.
720 (Thus, a @var{position} of 0 is the file's start.)
721
722 A seek past the current end of a file is not an error.  A later read
723 obtains 0 bytes, indicating end of file.  A later write extends the
724 file, filling any unwritten gap with zeros.  (However, in Pintos files
725 have a fixed length until project 4 is complete, so writes past end of
726 file will return an error.)  These semantics are implemented in the
727 file system and do not require any special effort in system call
728 implementation.
729 @end deftypefn
730
731 @deftypefn {System Call} unsigned tell (int @var{fd})
732 Returns the position of the next byte to be read or written in open
733 file @var{fd}, expressed in bytes from the beginning of the file.
734 @end deftypefn
735
736 @deftypefn {System Call} void close (int @var{fd})
737 Closes file descriptor @var{fd}.  
738 Exiting or terminating a process implicitly closes all its open file
739 descriptors, as if by calling this function for each one.
740 @end deftypefn
741
742 The file defines other syscalls.  Ignore them for now.  You will
743 implement some of them in project 3 and the rest in project 4, so be
744 sure to design your system with extensibility in mind.
745
746 To implement syscalls, you need to provide ways to read and write data
747 in user virtual address space.
748 You need this ability before you can
749 even obtain the system call number, because the system call number is
750 on the user's stack in the user's virtual address space.
751 This can be a bit tricky: what if the user provides an invalid
752 pointer, a pointer into kernel memory, or a block
753 partially in one of those regions?  You should handle these cases by
754 terminating the user process.  We recommend
755 writing and testing this code before implementing any other system
756 call functionality.  @xref{Accessing User Memory}, for more information.
757
758 You must synchronize system calls so that
759 any number of user processes can make them at once.  In particular, it
760 is not safe to call into the file system code provided in the
761 @file{filesys} directory from multiple threads at once.  Your system
762 call implementation must treat the file system code as a critical
763 section.  Don't forget
764 that @func{process_execute} also accesses files.  For now, we
765 recommend against modifying code in the @file{filesys} directory.
766
767 We have provided you a user-level function for each system call in
768 @file{lib/user/syscall.c}.  These provide a way for user processes to
769 invoke each system call from a C program.  Each uses a little inline
770 assembly code to invoke the system call and (if appropriate) returns the
771 system call's return value.
772
773 When you're done with this part, and forevermore, Pintos should be
774 bulletproof.  Nothing that a user program can do should ever cause the
775 OS to crash, panic, fail an assertion, or otherwise malfunction.  It is
776 important to emphasize this point: our tests will try to break your
777 system calls in many, many ways.  You need to think of all the corner
778 cases and handle them.  The sole way a user program should be able to
779 cause the OS to halt is by invoking the @code{halt} system call.
780
781 If a system call is passed an invalid argument, acceptable options
782 include returning an error value (for those calls that return a
783 value), returning an undefined value, or terminating the process.
784
785 @xref{System Call Details}, for details on how system calls work.
786
787 @node Denying Writes to Executables
788 @subsection Denying Writes to Executables
789
790 Add code to deny writes to files in use as executables.  Many OSes do
791 this because of the unpredictable results if a process tried to run code
792 that was in the midst of being changed on disk.  This is especially
793 important once virtual memory is implemented in project 3, but it can't
794 hurt even now.
795
796 You can use @func{file_deny_write} to prevent writes to an open file.
797 Calling @func{file_allow_write} on the file will re-enable them (unless
798 the file is denied writes by another opener).  Closing a file will also
799 re-enable writes.  Thus, to deny writes to a process's executable, you
800 must keep it open as long as the process is still running.
801
802 @node Project 2 FAQ
803 @section FAQ
804
805 @table @asis
806 @item How much code will I need to write?
807
808 Here's a summary of our reference solution, produced by the
809 @command{diffstat} program.  The final row gives total lines inserted
810 and deleted; a changed line counts as both an insertion and a deletion.
811
812 The reference solution represents just one possible solution.  Many
813 other solutions are also possible and many of those differ greatly from
814 the reference solution.  Some excellent solutions may not modify all the
815 files modified by the reference solution, and some may modify files not
816 modified by the reference solution.
817
818 @verbatim
819  threads/thread.c     |   13 
820  threads/thread.h     |   26 +
821  userprog/exception.c |    8 
822  userprog/process.c   |  247 ++++++++++++++--
823  userprog/syscall.c   |  468 ++++++++++++++++++++++++++++++-
824  userprog/syscall.h   |    1 
825  6 files changed, 725 insertions(+), 38 deletions(-)
826 @end verbatim
827
828 @item The kernel always panics when I run @code{pintos -p @var{file} -- -q}.
829
830 Did you format the disk (with @samp{pintos -f})?
831
832 Is your file name too long?  The file system limits file names to 14
833 characters.  A command like @samp{pintos -p ../../examples/echo -- -q}
834 will exceed the limit.  Use @samp{pintos -p ../../examples/echo -a echo
835 -- -q} to put the file under the name @file{echo} instead.
836
837 Is the file system full?
838
839 Does the file system already contain 16 files?  The base Pintos file
840 system has a 16-file limit.
841
842 The file system may be so fragmented that there's not enough contiguous
843 space for your file.
844
845 @item When I run @code{pintos -p ../file --}, @file{file} isn't copied.
846
847 Files are written under the name you refer to them, by default, so in
848 this case the file copied in would be named @file{../file}.  You
849 probably want to run @code{pintos -p ../file -a file --} instead.
850
851 @item All my user programs die with page faults.
852
853 This will happen if you haven't implemented argument passing
854 (or haven't done so correctly).  The basic C library for user programs tries
855 to read @var{argc} and @var{argv} off the stack.  If the stack
856 isn't properly set up, this causes a page fault.
857
858 @item All my user programs die with @code{system call!}
859
860 You'll have to implement system calls before you see anything else.
861 Every reasonable program tries to make at least one system call
862 (@func{exit}) and most programs make more than that.  Notably,
863 @func{printf} invokes the @code{write} system call.  The default system
864 call handler just prints @samp{system call!} and terminates the program.
865 Until then, you can use @func{hex_dump} to convince yourself that
866 argument passing is implemented correctly (@pxref{Program Startup Details}).
867
868 @item How can I can disassemble user programs?
869
870 The @command{objdump} (80@var{x}86) or @command{i386-elf-objdump}
871 (SPARC) utility can disassemble entire user
872 programs or object files.  Invoke it as @code{objdump -d
873 @var{file}}.  You can use GDB's
874 @code{disassemble} command to disassemble individual functions
875 (@pxref{GDB}).
876
877 @item Why do many C include files not work in Pintos programs?
878 @itemx Can I use lib@var{foo} in my Pintos programs?
879
880 The C library we provide is very limited.  It does not include many of
881 the features that are expected of a real operating system's C library.
882 The C library must be built specifically for the operating system (and
883 architecture), since it must make system calls for I/O and memory
884 allocation.  (Not all functions do, of course, but usually the library
885 is compiled as a unit.)
886
887 The chances are good that the library you want uses parts of the C library
888 that Pintos doesn't implement.  It will probably take at least some
889 porting effort to make it work under Pintos.  Notably, the Pintos
890 user program C library does not have a @func{malloc} implementation.
891
892 @item How do I compile new user programs?
893
894 Modify @file{src/examples/Makefile}, then run @command{make}.
895
896 @item Can I run user programs under a debugger?
897
898 Yes, with some limitations.  @xref{Debugging User Programs}.
899
900 @item What's the difference between @code{tid_t} and @code{pid_t}?
901
902 A @code{tid_t} identifies a kernel thread, which may have a user
903 process running in it (if created with @func{process_execute}) or not
904 (if created with @func{thread_create}).  It is a data type used only
905 in the kernel.
906
907 A @code{pid_t} identifies a user process.  It is used by user
908 processes and the kernel in the @code{exec} and @code{wait} system
909 calls.
910
911 You can choose whatever suitable types you like for @code{tid_t} and
912 @code{pid_t}.  By default, they're both @code{int}.  You can make them
913 a one-to-one mapping, so that the same values in both identify the
914 same process, or you can use a more complex mapping.  It's up to you.
915
916 @item Keyboard input doesn't work.
917
918 You are probably passing @option{-v} to @command{pintos}, but
919 serial input isn't implemented.  Don't use @option{-v} if you
920 want to use the shell or otherwise need keyboard input.
921 @end table
922
923 @menu
924 * Argument Passing FAQ::        
925 * System Calls FAQ::            
926 @end menu
927
928 @node Argument Passing FAQ
929 @subsection Argument Passing FAQ
930
931 @table @asis
932 @item Isn't the top of stack in kernel virtual memory?
933
934 The top of stack is at @code{PHYS_BASE}, typically @t{0xc0000000}, which
935 is also where kernel virtual memory starts.
936 But before the processor pushes data on the stack, it decrements the stack
937 pointer.  Thus, the first (4-byte) value pushed on the stack
938 will be at address @t{0xbffffffc}.
939
940 @item Is @code{PHYS_BASE} fixed?
941
942 No.  You should be able to support @code{PHYS_BASE} values that are
943 any multiple of @t{0x10000000} from @t{0x80000000} to @t{0xf0000000},
944 simply via recompilation.
945 @end table
946
947 @node System Calls FAQ
948 @subsection System Calls FAQ
949
950 @table @asis
951 @item Can I just cast a @code{struct file *} to get a file descriptor?
952 @itemx Can I just cast a @code{struct thread *} to a @code{pid_t}?
953
954 You will have to make these design decisions yourself.
955 Most operating systems do distinguish between file
956 descriptors (or pids) and the addresses of their kernel data
957 structures.  You might want to give some thought as to why they do so
958 before committing yourself.
959
960 @item Can I set a maximum number of open files per process?
961
962 It is better not to set an arbitrary limit.  You may impose a limit of
963 128 open files per process, if necessary.
964
965 @item What happens when an open file is removed?
966 @anchor{Removing an Open File}
967
968 You should implement the standard Unix semantics for files.  That is, when
969 a file is removed any process which has a file descriptor for that file
970 may continue to use that descriptor.  This means that
971 they can read and write from the file.  The file will not have a name,
972 and no other processes will be able to open it, but it will continue
973 to exist until all file descriptors referring to the file are closed
974 or the machine shuts down.
975
976 @item How can I run user programs that need more than 4 kB stack space?
977
978 You may modify the stack setup code to allocate more than one page of
979 stack space for each process.  In the next project, you will implement a
980 better solution.
981 @end table
982
983 @node 80x86 Calling Convention
984 @section 80@var{x}86 Calling Convention
985
986 This section summarizes important points of the convention used for
987 normal function calls on 32-bit 80@var{x}86 implementations of Unix.
988 Some details are omitted for brevity.  If you do want all the details,
989 refer to @bibref{SysV-i386}.
990
991 The calling convention works like this:
992
993 @enumerate 1
994 @item
995 The caller pushes each of the function's arguments on the stack one by
996 one, normally using the @code{PUSH} assembly language instruction.
997 Arguments are pushed in right-to-left order.
998
999 The stack grows downward: each push decrements the stack pointer, then
1000 stores into the location it now points to, like the C expression
1001 @samp{*--sp = @var{value}}.
1002
1003 @item
1004 The caller pushes the address of its next instruction (the @dfn{return
1005 address}) on the stack and jumps to the first instruction of the callee.
1006 A single 80@var{x}86 instruction, @code{CALL}, does both.
1007
1008 @item
1009 The callee executes.  When it takes control, the stack pointer points to
1010 the return address, the first argument is just above it, the second
1011 argument is just above the first argument, and so on.
1012
1013 @item
1014 If the callee has a return value, it stores it into register @code{EAX}.
1015
1016 @item
1017 The callee returns by popping the return address from the stack and
1018 jumping to the location it specifies, using the 80@var{x}86 @code{RET}
1019 instruction.
1020
1021 @item
1022 The caller pops the arguments off the stack.
1023 @end enumerate
1024
1025 Consider a function @func{f} that takes three @code{int} arguments.
1026 This diagram shows a sample stack frame as seen by the callee at the
1027 beginning of step 3 above, supposing that @func{f} is invoked as
1028 @code{f(1, 2, 3)}.  The initial stack address is arbitrary:
1029
1030 @html
1031 <CENTER>
1032 @end html
1033 @example
1034                              +----------------+
1035                   0xbffffe7c |        3       |
1036                   0xbffffe78 |        2       |
1037                   0xbffffe74 |        1       |
1038 stack pointer --> 0xbffffe70 | return address |
1039                              +----------------+
1040 @end example
1041 @html
1042 </CENTER>
1043 @end html
1044
1045 @menu
1046 * Program Startup Details::     
1047 * System Call Details::         
1048 @end menu
1049
1050 @node Program Startup Details
1051 @subsection Program Startup Details
1052
1053 The Pintos C library for user programs designates @func{_start}, in
1054 @file{lib/user/entry.c}, as the entry point for user programs.  This
1055 function is a wrapper around @func{main} that calls @func{exit} if
1056 @func{main} returns:
1057
1058 @example
1059 void
1060 _start (int argc, char *argv[]) 
1061 @{
1062   exit (main (argc, argv));
1063 @}
1064 @end example
1065
1066 The kernel must put the arguments for the initial function on the stack
1067 before it allows the user program to begin executing.  The arguments are
1068 passed in the same way as the normal calling convention (@pxref{80x86
1069 Calling Convention}).
1070
1071 Consider how to handle arguments for the following example command:
1072 @samp{/bin/ls -l foo bar}.
1073 First, break the command into words: @samp{/bin/ls},
1074 @samp{-l}, @samp{foo}, @samp{bar}.  Place the words at the top of the
1075 stack.  Order doesn't matter, because they will be referenced through
1076 pointers.
1077
1078 Then, push the address of each string plus a null pointer sentinel, on
1079 the stack, in right-to-left order.  These are the elements of
1080 @code{argv}.  The order ensure that @code{argv[0]} is at the lowest
1081 virtual address.  Word-aligned accesses are faster than unaligned
1082 accesses, so for best performance round the stack pointer down to a
1083 multiple of 4 before the first push.
1084
1085 Then, push @code{argv} (the address of @code{argv[0]}) and @code{argc},
1086 in that order.  Finally, push a fake ``return address'': although the
1087 entry function will never return, its stack frame must have the same
1088 structure as any other.
1089
1090 The table below show the state of the stack and the relevant registers
1091 right before the beginning of the user program, assuming
1092 @code{PHYS_BASE} is @t{0xc0000000}:
1093
1094 @html
1095 <CENTER>
1096 @end html
1097 @multitable {@t{0xbfffffff}} {return address} {@t{/bin/ls\0}} {@code{void (*) ()}}
1098 @item Address @tab Name @tab Data @tab Type
1099 @item @t{0xbffffffc} @tab @code{argv[3][@dots{}]} @tab @samp{bar\0} @tab @code{char[4]}
1100 @item @t{0xbffffff8} @tab @code{argv[2][@dots{}]} @tab @samp{foo\0} @tab @code{char[4]}
1101 @item @t{0xbffffff5} @tab @code{argv[1][@dots{}]} @tab @samp{-l\0} @tab @code{char[3]}
1102 @item @t{0xbfffffed} @tab @code{argv[0][@dots{}]} @tab @samp{/bin/ls\0} @tab @code{char[8]}
1103 @item @t{0xbfffffec} @tab word-align @tab 0 @tab @code{uint8_t}
1104 @item @t{0xbfffffe8} @tab @code{argv[4]} @tab @t{0} @tab @code{char *}
1105 @item @t{0xbfffffe4} @tab @code{argv[3]} @tab @t{0xbffffffc} @tab @code{char *}
1106 @item @t{0xbfffffe0} @tab @code{argv[2]} @tab @t{0xbffffff8} @tab @code{char *}
1107 @item @t{0xbfffffdc} @tab @code{argv[1]} @tab @t{0xbffffff5} @tab @code{char *}
1108 @item @t{0xbfffffd8} @tab @code{argv[0]} @tab @t{0xbfffffed} @tab @code{char *}
1109 @item @t{0xbfffffd4} @tab @code{argv} @tab @t{0xbfffffd8} @tab @code{char **}
1110 @item @t{0xbfffffd0} @tab @code{argc} @tab 4 @tab @code{int}
1111 @item @t{0xbfffffcc} @tab return address @tab 0 @tab @code{void (*) ()}
1112 @end multitable
1113 @html
1114 </CENTER>
1115 @end html
1116
1117 In this example, the stack pointer would be initialized to
1118 @t{0xbfffffcc}.
1119
1120 As shown above, your code should start the stack at the very top of
1121 the user virtual address space, in the page just below virtual address
1122 @code{PHYS_BASE} (defined in @file{threads/vaddr.h}).
1123
1124 You may find the non-standard @func{hex_dump} function, declared in
1125 @file{<stdio.h>}, useful for debugging your argument passing code.
1126 Here's what it would show in the above example:
1127
1128 @verbatim
1129 bfffffc0                                      00 00 00 00 |            ....|
1130 bfffffd0  04 00 00 00 d8 ff ff bf-ed ff ff bf f5 ff ff bf |................|
1131 bfffffe0  f8 ff ff bf fc ff ff bf-00 00 00 00 00 2f 62 69 |............./bi|
1132 bffffff0  6e 2f 6c 73 00 2d 6c 00-66 6f 6f 00 62 61 72 00 |n/ls.-l.foo.bar.|
1133 @end verbatim
1134
1135 @node System Call Details
1136 @subsection System Call Details
1137
1138 The first project already dealt with one way that the operating system
1139 can regain control from a user program: interrupts from timers and I/O
1140 devices.  These are ``external'' interrupts, because they are caused
1141 by entities outside the CPU (@pxref{External Interrupt Handling}).
1142
1143 The operating system also deals with software exceptions, which are
1144 events that occur in program code (@pxref{Internal Interrupt
1145 Handling}).  These can be errors such as a page fault or division by
1146 zero.  Exceptions are also the means by which a user program
1147 can request services (``system calls'') from the operating system.
1148
1149 In the 80@var{x}86 architecture, the @samp{int} instruction is the
1150 most commonly used means for invoking system calls.  This instruction
1151 is handled in the same way as other software exceptions.  In Pintos,
1152 user programs invoke @samp{int $0x30} to make a system call.  The
1153 system call number and any additional arguments are expected to be
1154 pushed on the stack in the normal fashion before invoking the
1155 interrupt (@pxref{80x86 Calling Convention}).
1156
1157 Thus, when the system call handler @func{syscall_handler} gets control,
1158 the system call number is in the 32-bit word at the caller's stack
1159 pointer, the first argument is in the 32-bit word at the next higher
1160 address, and so on.  The caller's stack pointer is accessible to
1161 @func{syscall_handler} as the @samp{esp} member of the
1162 @struct{intr_frame} passed to it.  (@struct{intr_frame} is on the kernel
1163 stack.)
1164
1165 The 80@var{x}86 convention for function return values is to place them
1166 in the @code{EAX} register.  System calls that return a value can do
1167 so by modifying the @samp{eax} member of @struct{intr_frame}.
1168
1169 You should try to avoid writing large amounts of repetitive code for
1170 implementing system calls.  Each system call argument, whether an
1171 integer or a pointer, takes up 4 bytes on the stack.  You should be able
1172 to take advantage of this to avoid writing much near-identical code for
1173 retrieving each system call's arguments from the stack.