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