Wordsmithing.
[pintos-anon] / doc / reference.texi
1 @node Reference Guide
2 @appendix Reference Guide
3
4 This chapter is a reference for the Pintos code.  It covers the
5 entire code base, but you'll only be using Pintos one part at a time,
6 so you may find that you want to read each part as you work on the
7 project where it becomes important.
8
9 (Actually, the reference guide is currently incomplete.)
10
11 We recommend using ``tags'' to follow along with references to function
12 and variable names (@pxref{Tags}).
13
14 @menu
15 * Pintos Loading::              
16 * Threads::                     
17 * Synchronization::             
18 * Interrupt Handling::          
19 * Memory Allocation::           
20 * Virtual Addresses::           
21 * Page Table::                  
22 * Hash Table::                  
23 @end menu
24
25 @node Pintos Loading
26 @section Loading
27
28 This section covers the Pintos loader and basic kernel
29 initialization.
30
31 @menu
32 * Pintos Loader::               
33 * Kernel Initialization::       
34 @end menu
35
36 @node Pintos Loader
37 @subsection The Loader
38
39 The first part of Pintos that runs is the loader, in
40 @file{threads/loader.S}.  The PC BIOS loads the loader into memory.
41 The loader, in turn, is responsible for initializing the CPU, loading
42 the rest of Pintos into memory, and then jumping to its start.  It's
43 not important to understand exactly what the loader does, but if
44 you're interested, read on.  You should probably read along with the
45 loader's source.  You should also understand the basics of the
46 80@var{x}86 architecture as described by chapter 3, ``Basic Execution
47 Environment,'' of @bibref{IA32-v1}.
48
49 Because the PC BIOS loads the loader, the loader has to play by the
50 BIOS's rules.  In particular, the BIOS only loads 512 bytes (one disk
51 sector) into memory.  This is a severe restriction and it means that,
52 practically speaking, the loader has to be written in assembly
53 language.
54
55 The Pintos loader first initializes the CPU.  The first important part of
56 this is to enable the A20 line, that is, the CPU's address line
57 numbered 20.  For historical reasons, PCs boot with this address
58 line fixed at 0, which means that attempts to access memory beyond the
59 first 1 MB (2 raised to the 20th power) will fail.  Pintos wants to
60 access more memory than this, so we have to enable it.
61
62 Next, the loader asks the BIOS for the PC's memory size.  Again for
63 historical reasons, the function that we call in the BIOS to do this
64 can only detect up to 64 MB of RAM, so that's the practical limit that
65 Pintos can support.  The memory size is stashed away in a location in
66 the loader that the kernel can read after it boots.
67
68 Third, the loader creates a basic page table.  This page table maps
69 the 64 MB at the base of virtual memory (starting at virtual address
70 0) directly to the identical physical addresses.  It also maps the
71 same physical memory starting at virtual address
72 @code{LOADER_PHYS_BASE}, which defaults to @t{0xc0000000} (3 GB).  The
73 Pintos kernel only wants the latter mapping, but there's a
74 chicken-and-egg problem if we don't include the former: our current
75 virtual address is roughly @t{0x7c00}, the location where the BIOS
76 loaded us, and we can't jump to @t{0xc0007c00} until we turn on the
77 page table, but if we turn on the page table without jumping there,
78 then we've just pulled the rug out from under ourselves.
79
80 After the page table is initialized, we load the CPU's control
81 registers to turn on protected mode and paging, and then we set up the
82 segment registers.  We aren't yet equipped to handle interrupts in
83 protected mode, so we disable interrupts.
84
85 Finally it's time to load the kernel from disk.  We use a simple but
86 inflexible method to do this: we program the IDE disk
87 controller directly.  We assume that the kernel is stored starting
88 from the second sector of the first IDE disk (the first sector normally
89 contains the boot loader).  We also assume that the BIOS has
90 already set up the IDE controller for us.  We read
91 @code{KERNEL_LOAD_PAGES} pages of data (4 kB per page) from the disk directly
92 into virtual memory, starting @code{LOADER_KERN_BASE} bytes past
93 @code{LOADER_PHYS_BASE}, which by default means that we load the
94 kernel starting 1 MB into physical memory.
95
96 Then we jump to the start of the compiled kernel image.  Using the
97 ``linker script'' in @file{threads/kernel.lds.S}, the kernel has
98 arranged to begin with the assembly module
99 @file{threads/start.S}.  This assembly module just calls
100 @func{main}, which never returns.
101
102 There's one more trick: the Pintos kernel command line
103 is in stored the boot loader.  The @command{pintos} program actually
104 modifies a copy of the boot loader on disk each time it runs the kernel,
105 putting
106 in whatever command line arguments the user supplies to the kernel,
107 and then the kernel at boot time reads those arguments out of the boot
108 loader in memory.  This is not an elegant solution, but it is simple
109 and effective.
110
111 @node Kernel Initialization
112 @subsection Kernel Initialization
113
114 The kernel proper starts with the @func{main} function.  The
115 @func{main} function is written in C, as will be most of the code we
116 encounter in Pintos from here on out.
117
118 When @func{main} starts, the system is in a pretty raw state.  We're
119 in 32-bit protected mode with paging enabled, but hardly anything else is
120 ready.  Thus, the @func{main} function consists primarily of calls
121 into other Pintos modules' initialization functions.
122 These are usually named @func{@var{module}_init}, where
123 @var{module} is the module's name, @file{@var{module}.c} is the
124 module's source code, and @file{@var{module}.h} is the module's
125 header.
126
127 First we initialize kernel RAM in @func{ram_init}.  The first step
128 is to clear out the kernel's so-called ``BSS'' segment.  The BSS is a
129 segment that should be initialized to all zeros.  In most C
130 implementations, whenever you
131 declare a variable outside a function without providing an
132 initializer, that variable goes into the BSS.  Because it's all zeros, the
133 BSS isn't stored in the image that the loader brought into memory.  We
134 just use @func{memset} to zero it out.  The other task of
135 @func{ram_init} is to read out the machine's memory size from where
136 the loader stored it and put it into the @code{ram_pages} variable for
137 later use.
138
139 Next, @func{thread_init} initializes the thread system.  We will defer
140 full discussion to our discussion of Pintos threads below.  It is
141 called so early in initialization because the console, initialized
142 just afterward, tries to use locks, and locks in turn require there to be a
143 running thread.
144
145 Then we initialize the console so that @func{printf} will work.
146 @func{main} calls @func{vga_init}, which initializes the VGA text
147 display and clears the screen.  It also calls @func{serial_init_poll}
148 to initialize the first serial port in ``polling mode,'' that is,
149 where the kernel busy-waits for the port to be ready for each
150 character to be output.  (We use polling mode until we're ready to enable
151 interrupts, later.)  Finally we initialize the console device and
152 print a startup message to the console.
153
154 @func{main} calls @func{read_command_line} to break the kernel command
155 line into arguments, then @func{parse_options} to read any options at
156 the beginning of the command line.  (Actions specified on the
157 command line execute later.)
158
159 @func{main} calls @func{random_init} to initialize the kernel random
160 number generator.  If the user specified @option{-rs} on the
161 @command{pintos} command line, @func{parse_options} already did
162 this, but calling it a second time is harmless.
163
164 The next block of functions we call initialize the kernel's memory
165 system.  @func{palloc_init} sets up the kernel page allocator, which
166 doles out memory one or more pages at a time (@pxref{Page Allocator}).
167 @func{malloc_init} sets
168 up the allocator that handles allocations of arbitrary-size blocks of
169 memory (@pxref{Block Allocator}).
170 @func{paging_init} sets up a page table for the kernel (@pxref{Page
171 Table}).
172
173 In projects 2 and later, @func{main} also calls @func{tss_init} and
174 @func{gdt_init}.
175
176 The next set of calls initializes the interrupt system.
177 @func{intr_init} sets up the CPU's @dfn{interrupt descriptor table}
178 (IDT) to ready it for interrupt handling (@pxref{Interrupt
179 Infrastructure}), then @func{timer_init} and @func{kbd_init} prepare for
180 handling timer interrupts and keyboard interrupts, respectively.  In
181 projects 2 and later, we also prepare to handle interrupts caused by
182 user programs using @func{exception_init} and @func{syscall_init}.
183
184 Now that interrupts are set up, we can start the scheduler
185 with @func{thread_start}, which creates the idle thread and enables
186 interrupts.
187 With interrupts enabled, interrupt-driven serial port I/O becomes
188 possible, so we use
189 @func{serial_init_queue} to switch to that mode.  Finally,
190 @func{timer_calibrate} calibrates the timer for accurate short delays.
191
192 If the file system is compiled in, as it will starting in project 2, we
193 initialize the disks with @func{disk_init}, then the
194 file system with @func{filesys_init}.
195
196 Boot is complete, so we print a message.
197
198 Function @func{run_actions} now parses and executes actions specified on
199 the kernel command line, such as @command{run} to run a test (in project
200 1) or a user program (in later projects).
201
202 Finally, if @option{-q} was specified on the kernel command line, we
203 call @func{power_off} to terminate the machine simulator.  Otherwise,
204 @func{main} calls @func{thread_exit}, which allows any other running
205 threads to continue running.
206
207 @node Threads
208 @section Threads
209
210 @menu
211 * struct thread::               
212 * Thread Functions::            
213 * Thread Switching::            
214 @end menu
215
216 @node struct thread
217 @subsection @code{struct thread}
218
219 The main Pintos data structure for threads is @struct{thread},
220 declared in @file{threads/thread.h}.
221
222 @deftp {Structure} {struct thread}
223 Represents a thread or a user process.  In the projects, you will have
224 to add your own members to @struct{thread}.  You may also change or
225 delete the definitions of existing members.
226
227 Every @struct{thread} occupies the beginning of its own page of
228 memory.  The rest of the page is used for the thread's stack, which
229 grows downward from the end of the page.  It looks like this:
230
231 @example
232 @group
233                   4 kB +---------------------------------+
234                        |          kernel stack           |
235                        |                |                |
236                        |                |                |
237                        |                V                |
238                        |         grows downward          |
239                        |                                 |
240                        |                                 |
241                        |                                 |
242                        |                                 |
243                        |                                 |
244                        |                                 |
245                        |                                 |
246                        |                                 |
247 sizeof (struct thread) +---------------------------------+
248                        |              magic              |
249                        |                :                |
250                        |                :                |
251                        |              status             |
252                        |               tid               |
253                   0 kB +---------------------------------+
254 @end group
255 @end example
256
257 This has two consequences.  First, @struct{thread} must not be allowed
258 to grow too big.  If it does, then there will not be enough room for the
259 kernel stack.  The base @struct{thread} is only a few bytes in size.  It
260 probably should stay well under 1 kB.
261
262 Second, kernel stacks must not be allowed to grow too large.  If a stack
263 overflows, it will corrupt the thread state.  Thus, kernel functions
264 should not allocate large structures or arrays as non-static local
265 variables.  Use dynamic allocation with @func{malloc} or
266 @func{palloc_get_page} instead (@pxref{Memory Allocation}).
267 @end deftp
268
269 @deftypecv {Member} {@struct{thread}} {tid_t} tid
270 The thread's thread identifier or @dfn{tid}.  Every thread must have a
271 tid that is unique over the entire lifetime of the kernel.  By
272 default, @code{tid_t} is a @code{typedef} for @code{int} and each new
273 thread receives the numerically next higher tid, starting from 1 for
274 the initial process.  You can change the type and the numbering scheme
275 if you like.
276 @end deftypecv
277
278 @deftypecv {Member} {@struct{thread}} {enum thread_status} status
279 @anchor{Thread States}
280 The thread's state, one of the following:
281
282 @defvr {Thread State} @code{THREAD_RUNNING}
283 The thread is running.  Exactly one thread is running at a given time.
284 @func{thread_current} returns the running thread.
285 @end defvr
286
287 @defvr {Thread State} @code{THREAD_READY}
288 The thread is ready to run, but it's not running right now.  The
289 thread could be selected to run the next time the scheduler is
290 invoked.  Ready threads are kept in a doubly linked list called
291 @code{ready_list}.
292 @end defvr
293
294 @defvr {Thread State} @code{THREAD_BLOCKED}
295 The thread is waiting for something, e.g.@: a lock to become
296 available, an interrupt to be invoked.  The thread won't be scheduled
297 again until it transitions to the @code{THREAD_READY} state with a
298 call to @func{thread_unblock}.  This is most conveniently done
299 indirectly, using one of the Pintos synchronization primitives that
300 block and unblock threads automatically (@pxref{Synchronization}).
301
302 There is no @i{a priori} way to tell what a blocked thread is waiting
303 for, but a backtrace can help (@pxref{Backtraces}).
304 @end defvr
305
306 @defvr {Thread State} @code{THREAD_DYING}
307 The thread will be destroyed by the scheduler after switching to the
308 next thread.
309 @end defvr
310 @end deftypecv
311
312 @deftypecv {Member} {@struct{thread}} {char} name[16]
313 The thread's name as a string, or at least the first few characters of
314 it.
315 @end deftypecv
316
317 @deftypecv {Member} {@struct{thread}} {uint8_t *} stack
318 Every thread has its own stack to keep track of its state.  When the
319 thread is running, the CPU's stack pointer register tracks the top of
320 the stack and this member is unused.  But when the CPU switches to
321 another thread, this member saves the thread's stack pointer.  No
322 other members are needed to save the thread's registers, because the
323 other registers that must be saved are saved on the stack.
324
325 When an interrupt occurs, whether in the kernel or a user program, an
326 @struct{intr_frame} is pushed onto the stack.  When the interrupt occurs
327 in a user program, the @struct{intr_frame} is always at the very top of
328 the page.  @xref{Interrupt Handling}, for more information.
329 @end deftypecv
330
331 @deftypecv {Member} {@struct{thread}} {int} priority
332 A thread priority, ranging from @code{PRI_MIN} (0) to @code{PRI_MAX}
333 (63).  Lower numbers correspond to lower priorities, so that
334 priority 0 is the lowest priority and priority 63 is the highest.
335 Pintos as provided ignores thread priorities, but you will implement
336 priority scheduling in project 1 (@pxref{Priority Scheduling}).
337 @end deftypecv
338
339 @deftypecv {Member} {@struct{thread}} {@struct{list_elem}} elem
340 A ``list element'' used to put the thread into doubly linked lists,
341 either @code{ready_list} (the list of threads ready to run) or a list of
342 threads waiting on a semaphore in @func{sema_down}.  It can do double
343 duty because a thread waiting on a semaphore is not ready, and vice
344 versa.
345 @end deftypecv
346
347 @deftypecv {Member} {@struct{thread}} {uint32_t *} pagedir
348 Only present in project 2 and later.  @xref{Page Tables}.
349 @end deftypecv
350
351 @deftypecv {Member} {@struct{thread}} {unsigned} magic
352 Always set to @code{THREAD_MAGIC}, which is just an arbitrary number defined
353 in @file{threads/thread.c}, and used to detect stack overflow.
354 @func{thread_current} checks that the @code{magic} member of the running
355 thread's @struct{thread} is set to @code{THREAD_MAGIC}.  Stack overflow
356 tends to change this value, triggering the assertion.  For greatest
357 benefit, as you add members to @struct{thread}, leave @code{magic} at
358 the end.
359 @end deftypecv
360
361 @node Thread Functions
362 @subsection Thread Functions
363
364 @file{threads/thread.c} implements several public functions for thread
365 support.  Let's take a look at the most useful:
366
367 @deftypefun void thread_init (void)
368 Called by @func{main} to initialize the thread system.  Its main
369 purpose is to create a @struct{thread} for Pintos's initial thread.
370 This is possible because the Pintos loader puts the initial
371 thread's stack at the top of a page, in the same position as any other
372 Pintos thread.
373
374 Before @func{thread_init} runs,
375 @func{thread_current} will fail because the running thread's
376 @code{magic} value is incorrect.  Lots of functions call
377 @func{thread_current} directly or indirectly, including
378 @func{lock_acquire} for locking a lock, so @func{thread_init} is
379 called early in Pintos initialization.
380 @end deftypefun
381
382 @deftypefun void thread_start (void)
383 Called by @func{main} to start the scheduler.  Creates the idle
384 thread, that is, the thread that is scheduled when no other thread is
385 ready.  Then enables interrupts, which as a side effect enables the
386 scheduler because the scheduler runs on return from the timer interrupt, using
387 @func{intr_yield_on_return} (@pxref{External Interrupt Handling}).
388 @end deftypefun
389
390 @deftypefun void thread_tick (void)
391 Called by the timer interrupt at each timer tick.  It keeps track of
392 thread statistics and triggers the scheduler when a time slice expires.
393 @end deftypefun
394
395 @deftypefun void thread_print_stats (void)
396 Called during Pintos shutdown to print thread statistics.
397 @end deftypefun
398
399 @deftypefun tid_t thread_create (const char *@var{name}, int @var{priority}, thread_func *@var{func}, void *@var{aux})
400 Creates and starts a new thread named @var{name} with the given
401 @var{priority}, returning the new thread's tid.  The thread executes
402 @var{func}, passing @var{aux} as the function's single argument.
403
404 @func{thread_create} allocates a page for the thread's
405 @struct{thread} and stack and initializes its members, then it sets
406 up a set of fake stack frames for it (@pxref{Thread Switching}).  The
407 thread is initialized in the blocked state, then unblocked just before
408 returning, which allows the new thread to
409 be scheduled (@pxref{Thread States}).
410
411 @deftp {Type} {void thread_func (void *@var{aux})}
412 This is the type of the function passed to @func{thread_create}, whose
413 @var{aux} argument is passed along as the function's argument.
414 @end deftp
415 @end deftypefun
416
417 @deftypefun void thread_block (void)
418 Transitions the running thread from the running state to the blocked
419 state (@pxref{Thread States}).  The thread will not run again until
420 @func{thread_unblock} is
421 called on it, so you'd better have some way arranged for that to happen.
422 Because @func{thread_block} is so low-level, you should prefer to use
423 one of the synchronization primitives instead (@pxref{Synchronization}).
424 @end deftypefun
425
426 @deftypefun void thread_unblock (struct thread *@var{thread})
427 Transitions @var{thread}, which must be in the blocked state, to the
428 ready state, allowing it to resume running (@pxref{Thread States}).
429 This is called when the event that the thread is waiting for occurs,
430 e.g.@: when the lock that 
431 the thread is waiting on becomes available.
432 @end deftypefun
433
434 @deftypefun {struct thread *} thread_current (void)
435 Returns the running thread.
436 @end deftypefun
437
438 @deftypefun {tid_t} thread_tid (void)
439 Returns the running thread's thread id.  Equivalent to
440 @code{thread_current ()->tid}.
441 @end deftypefun
442
443 @deftypefun {const char *} thread_name (void)
444 Returns the running thread's name.  Equivalent to @code{thread_current
445 ()->name}.
446 @end deftypefun
447
448 @deftypefun void thread_exit (void) @code{NO_RETURN}
449 Causes the current thread to exit.  Never returns, hence
450 @code{NO_RETURN} (@pxref{Function and Parameter Attributes}).
451 @end deftypefun
452
453 @deftypefun void thread_yield (void)
454 Yields the CPU to the scheduler, which picks a new thread to run.  The
455 new thread might be the current thread, so you can't depend on this
456 function to keep this thread from running for any particular length of
457 time.
458 @end deftypefun
459
460 @deftypefun int thread_get_priority (void)
461 @deftypefunx void thread_set_priority (int @var{new_priority})
462 Stub to set and get thread priority.  @xref{Priority Scheduling}.
463 @end deftypefun
464
465 @deftypefun int thread_get_nice (void)
466 @deftypefunx void thread_set_nice (int @var{new_nice})
467 @deftypefunx int thread_get_recent_cpu (void)
468 @deftypefunx int thread_get_load_avg (void)
469 Stubs for the advanced scheduler.  @xref{4.4BSD Scheduler}.
470 @end deftypefun
471
472 @node Thread Switching
473 @subsection Thread Switching
474
475 @func{schedule} is responsible for switching threads.  It
476 is internal to @file{threads/thread.c} and called only by the three
477 public thread functions that need to switch threads:
478 @func{thread_block}, @func{thread_exit}, and @func{thread_yield}.
479 Before any of these functions call @func{schedule}, they disable
480 interrupts (or ensure that they are already disabled) and then change
481 the running thread's state to something other than running.
482
483 @func{schedule} is short but tricky.  It records the
484 current thread in local variable @var{cur}, determines the next thread
485 to run as local variable @var{next} (by calling
486 @func{next_thread_to_run}), and then calls @func{switch_threads} to do
487 the actual thread switch.  The thread we switched to was also running
488 inside @func{switch_threads}, as are all the threads not currently
489 running, so the new thread now returns out of
490 @func{switch_threads}, returning the previously running thread.
491
492 @func{switch_threads} is an assembly language routine in
493 @file{threads/switch.S}.  It saves registers on the stack, saves the
494 CPU's current stack pointer in the current @struct{thread}'s @code{stack}
495 member, restores the new thread's @code{stack} into the CPU's stack
496 pointer, restores registers from the stack, and returns.
497
498 The rest of the scheduler is implemented in @func{schedule_tail}.  It
499 marks the new thread as running.  If the thread we just switched from
500 is in the dying state, then it also frees the page that contained the
501 dying thread's @struct{thread} and stack.  These couldn't be freed
502 prior to the thread switch because the switch needed to use it.
503
504 Running a thread for the first time is a special case.  When
505 @func{thread_create} creates a new thread, it goes through a fair
506 amount of trouble to get it started properly.  In particular, the new
507 thread hasn't started running yet, so there's no way for it to be
508 running inside @func{switch_threads} as the scheduler expects.  To
509 solve the problem, @func{thread_create} creates some fake stack frames
510 in the new thread's stack:
511
512 @itemize @bullet
513 @item
514 The topmost fake stack frame is for @func{switch_threads}, represented
515 by @struct{switch_threads_frame}.  The important part of this frame is
516 its @code{eip} member, the return address.  We point @code{eip} to
517 @func{switch_entry}, indicating it to be the function that called
518 @func{switch_entry}.
519
520 @item
521 The next fake stack frame is for @func{switch_entry}, an assembly
522 language routine in @file{threads/switch.S} that adjusts the stack
523 pointer,@footnote{This is because @func{switch_threads} takes
524 arguments on the stack and the 80@var{x}86 SVR4 calling convention
525 requires the caller, not the called function, to remove them when the
526 call is complete.  See @bibref{SysV-i386} chapter 3 for details.}
527 calls @func{schedule_tail} (this special case is why
528 @func{schedule_tail} is separate from @func{schedule}), and returns.
529 We fill in its stack frame so that it returns into
530 @func{kernel_thread}, a function in @file{threads/thread.c}.
531
532 @item
533 The final stack frame is for @func{kernel_thread}, which enables
534 interrupts and calls the thread's function (the function passed to
535 @func{thread_create}).  If the thread's function returns, it calls
536 @func{thread_exit} to terminate the thread.
537 @end itemize
538
539 @node Synchronization
540 @section Synchronization
541
542 If sharing of resources between threads is not handled in a careful,
543 controlled fashion, the result is usually a big mess.
544 This is especially the case in operating system kernels, where
545 faulty sharing can crash the entire machine.  Pintos provides several
546 synchronization primitives to help out.
547
548 @menu
549 * Disabling Interrupts::        
550 * Semaphores::                  
551 * Locks::                       
552 * Monitors::                    
553 * Memory Barriers::             
554 @end menu
555
556 @node Disabling Interrupts
557 @subsection Disabling Interrupts
558
559 The crudest way to do synchronization is to disable interrupts, that
560 is, to temporarily prevent the CPU from responding to interrupts.  If
561 interrupts are off, no other thread will preempt the running thread,
562 because thread preemption is driven by the timer interrupt.  If
563 interrupts are on, as they normally are, then the running thread may
564 be preempted by another at any time, whether between two C statements
565 or even within the execution of one.
566
567 Incidentally, this means that Pintos is a ``preemptible kernel,'' that
568 is, kernel threads can be preempted at any time.  Traditional Unix
569 systems are ``nonpreemptible,'' that is, kernel threads can only be
570 preempted at points where they explicitly call into the scheduler.
571 (User programs can be preempted at any time in both models.)  As you
572 might imagine, preemptible kernels require more explicit
573 synchronization.
574
575 You should have little need to set the interrupt state directly.  Most
576 of the time you should use the other synchronization primitives
577 described in the following sections.  The main reason to disable
578 interrupts is to synchronize kernel threads with external interrupt
579 handlers, which cannot sleep and thus cannot use most other forms of
580 synchronization (@pxref{External Interrupt Handling}).
581
582 Some external interrupts cannot be postponed, even by disabling
583 interrupts.  These interrupts, called @dfn{non-maskable interrupts}
584 (NMIs), are supposed to be used only in emergencies, e.g.@: when the
585 computer is on fire.  Pintos does not handle non-maskable interrupts.
586
587 Types and functions for disabling and enabling interrupts are in
588 @file{threads/interrupt.h}.
589
590 @deftp Type {enum intr_level}
591 One of @code{INTR_OFF} or @code{INTR_ON}, denoting that interrupts are
592 disabled or enabled, respectively.
593 @end deftp
594
595 @deftypefun {enum intr_level} intr_get_level (void)
596 Returns the current interrupt state.
597 @end deftypefun
598
599 @deftypefun {enum intr_level} intr_set_level (enum intr_level @var{level})
600 Turns interrupts on or off according to @var{level}.  Returns the
601 previous interrupt state.
602 @end deftypefun
603
604 @deftypefun {enum intr_level} intr_enable (void)
605 Turns interrupts on.  Returns the previous interrupt state.
606 @end deftypefun
607
608 @deftypefun {enum intr_level} intr_disable (void)
609 Turns interrupts off.  Returns the previous interrupt state.
610 @end deftypefun
611
612 @node Semaphores
613 @subsection Semaphores
614
615 A @dfn{semaphore} is a nonnegative integer together with two operators
616 that manipulate it atomically, which are:
617
618 @itemize @bullet
619 @item
620 ``Down'' or ``P'': wait for the value to become positive, then
621 decrement it.
622
623 @item
624 ``Up'' or ``V'': increment the value (and wake up one waiting thread,
625 if any).
626 @end itemize
627
628 A semaphore initialized to 0 may be used to wait for an event
629 that will happen exactly once.  For example, suppose thread @var{A}
630 starts another thread @var{B} and wants to wait for @var{B} to signal
631 that some activity is complete.  @var{A} can create a semaphore
632 initialized to 0, pass it to @var{B} as it starts it, and then
633 ``down'' the semaphore.  When @var{B} finishes its activity, it
634 ``ups'' the semaphore.  This works regardless of whether @var{A}
635 ``downs'' the semaphore or @var{B} ``ups'' it first.
636
637 A semaphore initialized to 1 is typically used for controlling access
638 to a resource.  Before a block of code starts using the resource, it
639 ``downs'' the semaphore, then after it is done with the resource it
640 ``ups'' the resource.  In such a case a lock, described below, may be
641 more appropriate.
642
643 Semaphores can also be initialized to values larger than 1.  These are
644 rarely used.
645
646 Semaphores were invented by Edsger Dijkstra and first used in the THE
647 operating system (@bibref{THE}).
648
649 Pintos' semaphore type and operations are declared in
650 @file{threads/synch.h}.  
651
652 @deftp {Type} {struct semaphore}
653 Represents a semaphore.
654 @end deftp
655
656 @deftypefun void sema_init (struct semaphore *@var{sema}, unsigned @var{value})
657 Initializes @var{sema} as a new semaphore with the given initial
658 @var{value}.
659 @end deftypefun
660
661 @deftypefun void sema_down (struct semaphore *@var{sema})
662 Executes the ``down'' or ``P'' operation on @var{sema}, waiting for
663 its value to become positive and then decrementing it by one.
664 @end deftypefun
665
666 @deftypefun bool sema_try_down (struct semaphore *@var{sema})
667 Tries to execute the ``down'' or ``P'' operation on @var{sema},
668 without waiting.  Returns true if @var{sema}
669 was successfully decremented, or false if it was already
670 zero and thus could not be decremented without waiting.  Calling this
671 function in a
672 tight loop wastes CPU time, so use @func{sema_down} or find a
673 different approach instead.
674 @end deftypefun
675
676 @deftypefun void sema_up (struct semaphore *@var{sema})
677 Executes the ``up'' or ``V'' operation on @var{sema},
678 incrementing its value.  If any threads are waiting on
679 @var{sema}, wakes one of them up.
680
681 Unlike most synchronization primitives, @func{sema_up} may be called
682 inside an external interrupt handler (@pxref{External Interrupt
683 Handling}).
684 @end deftypefun
685
686 Semaphores are internally built out of disabling interrupt
687 (@pxref{Disabling Interrupts}) and thread blocking and unblocking
688 (@func{thread_block} and @func{thread_unblock}).  Each semaphore maintains
689 a list of waiting threads, using the linked list
690 implementation in @file{lib/kernel/list.c}.
691
692 @node Locks
693 @subsection Locks
694
695 A @dfn{lock} is like a semaphore with an initial value of 1
696 (@pxref{Semaphores}).  A lock's equivalent of ``up'' is called
697 ``acquire'', and the ``down'' operation is called ``release''.
698
699 Compared to a semaphore, a lock has one added restriction: only the
700 thread that acquires a lock, called the lock's ``owner'', is allowed to
701 release it.  If this restriction is a problem, it's a good sign that a
702 semaphore should be used, instead of a lock.
703
704 Locks in Pintos are not ``recursive,'' that is, it is an error for the
705 thread currently holding a lock to try to acquire that lock.
706
707 Lock types and functions are declared in @file{threads/synch.h}.
708
709 @deftp {Type} {struct lock}
710 Represents a lock.
711 @end deftp
712
713 @deftypefun void lock_init (struct lock *@var{lock})
714 Initializes @var{lock} as a new lock.
715 The lock is not initially owned by any thread.
716 @end deftypefun
717
718 @deftypefun void lock_acquire (struct lock *@var{lock})
719 Acquires @var{lock} for the current thread, first waiting for
720 any current owner to release it if necessary.
721 @end deftypefun
722
723 @deftypefun bool lock_try_acquire (struct lock *@var{lock})
724 Tries to acquire @var{lock} for use by the current thread, without
725 waiting.  Returns true if successful, false if the lock is already
726 owned.  Calling this function in a tight loop is a bad idea because it
727 wastes CPU time, so use @func{lock_acquire} instead.
728 @end deftypefun
729
730 @deftypefun void lock_release (struct lock *@var{lock})
731 Releases @var{lock}, which the current thread must own.
732 @end deftypefun
733
734 @deftypefun bool lock_held_by_current_thread (const struct lock *@var{lock})
735 Returns true if the running thread owns @var{lock},
736 false otherwise.
737 There is no function to test whether an arbitrary thread owns a lock,
738 because the answer could change before the caller could act on it.
739 @end deftypefun
740
741 @node Monitors
742 @subsection Monitors
743
744 A @dfn{monitor} is a higher-level form of synchronization than a
745 semaphore or a lock.  A monitor consists of data being synchronized,
746 plus a lock, called the @dfn{monitor lock}, and one or more
747 @dfn{condition variables}.  Before it accesses the protected data, a
748 thread first acquires the monitor lock.  It is then said to be ``in the
749 monitor''.  While in the monitor, the thread has control over all the
750 protected data, which it may freely examine or modify.  When access to
751 the protected data is complete, it releases the monitor lock.
752
753 Condition variables allow code in the monitor to wait for a condition to
754 become true.  Each condition variable is associated with an abstract
755 condition, e.g.@: ``some data has arrived for processing'' or ``over 10
756 seconds has passed since the user's last keystroke''.  When code in the
757 monitor needs to wait for a condition to become true, it ``waits'' on
758 the associated condition variable, which releases the lock and waits for
759 the condition to be signaled.  If, on the other hand, it has caused one
760 of these conditions to become true, it ``signals'' the condition to wake
761 up one waiter, or ``broadcasts'' the condition to wake all of them.
762
763 The theoretical framework for monitors was laid out by C.@: A.@: R.@:
764 Hoare (@bibref{Hoare}).  Their practical usage was later elaborated in a
765 paper on the Mesa operating system (@bibref{Mesa}).
766
767 Condition variable types and functions are declared in
768 @file{threads/synch.h}.
769
770 @deftp {Type} {struct condition}
771 Represents a condition variable.
772 @end deftp
773
774 @deftypefun void cond_init (struct condition *@var{cond})
775 Initializes @var{cond} as a new condition variable.
776 @end deftypefun
777
778 @deftypefun void cond_wait (struct condition *@var{cond}, struct lock *@var{lock})
779 Atomically releases @var{lock} (the monitor lock) and waits for
780 @var{cond} to be signaled by some other piece of code.  After
781 @var{cond} is signaled, reacquires @var{lock} before returning.
782 @var{lock} must be held before calling this function.
783
784 Sending a signal and waking up from a wait are not an atomic operation.
785 Thus, typically @func{cond_wait}'s caller must recheck the condition
786 after the wait completes and, if necessary, wait again.  See the next
787 section for an example.
788 @end deftypefun
789
790 @deftypefun void cond_signal (struct condition *@var{cond}, struct lock *@var{lock})
791 If any threads are waiting on @var{cond} (protected by monitor lock
792 @var{lock}), then this function wakes up one of them.  If no threads are
793 waiting, returns without performing any action.
794 @var{lock} must be held before calling this function.
795 @end deftypefun
796
797 @deftypefun void cond_broadcast (struct condition *@var{cond}, struct lock *@var{lock})
798 Wakes up all threads, if any, waiting on @var{cond} (protected by
799 monitor lock @var{lock}).  @var{lock} must be held before calling this
800 function.
801 @end deftypefun
802
803 @subsubsection Monitor Example
804
805 The classical example of a monitor is handling a buffer into which one
806 or more
807 ``producer'' threads write characters and out of which one or more
808 ``consumer'' threads read characters.  To implement this we need,
809 besides the monitor lock, two condition variables which we will call
810 @var{not_full} and @var{not_empty}:
811
812 @example
813 char buf[BUF_SIZE];     /* @r{Buffer.} */
814 size_t n = 0;           /* @r{0 <= n <= @var{BUF_SIZE}: # of characters in buffer.} */
815 size_t head = 0;        /* @r{@var{buf} index of next char to write (mod @var{BUF_SIZE}).} */
816 size_t tail = 0;        /* @r{@var{buf} index of next char to read (mod @var{BUF_SIZE}).} */
817 struct lock lock;       /* @r{Monitor lock.} */
818 struct condition not_empty; /* @r{Signaled when the buffer is not empty.} */
819 struct condition not_full; /* @r{Signaled when the buffer is not full.} */
820
821 @dots{}@r{initialize the locks and condition variables}@dots{}
822
823 void put (char ch) @{
824   lock_acquire (&lock);
825   while (n == BUF_SIZE)            /* @r{Can't add to @var{buf} as long as it's full.} */
826     cond_wait (&not_full, &lock);
827   buf[head++ % BUF_SIZE] = ch;     /* @r{Add @var{ch} to @var{buf}.} */
828   n++;
829   cond_signal (&not_empty, &lock); /* @r{@var{buf} can't be empty anymore.} */
830   lock_release (&lock);
831 @}
832
833 char get (void) @{
834   char ch;
835   lock_acquire (&lock);
836   while (n == 0)                  /* @r{Can't read @var{buf} as long as it's empty.} */
837     cond_wait (&not_empty, &lock);
838   ch = buf[tail++ % BUF_SIZE];    /* @r{Get @var{ch} from @var{buf}.} */
839   n--;
840   cond_signal (&not_full, &lock); /* @r{@var{buf} can't be full anymore.} */
841   lock_release (&lock);
842 @}
843 @end example
844
845 @node Memory Barriers
846 @subsection Memory Barriers
847
848 @c We should try to come up with a better example.
849 @c Perhaps something with a linked list?
850
851 Suppose we add a ``feature'' that, whenever a timer interrupt
852 occurs, the character in global variable @code{timer_put_char} is
853 printed on the console, but only if global Boolean variable
854 @code{timer_do_put} is true.
855
856 If interrupts are enabled, this code for setting up @samp{x} to be
857 printed is clearly incorrect, because the timer interrupt could intervene
858 between the two assignments:
859
860 @example
861 timer_do_put = true;            /* INCORRECT CODE */
862 timer_put_char = 'x';
863 @end example
864
865 It might not be as obvious that the following code is just as
866 incorrect:
867
868 @example
869 timer_put_char = 'x';           /* INCORRECT CODE */
870 timer_do_put = true;
871 @end example
872
873 The reason this second example might be a problem is that the compiler
874 is, in general, free to reorder operations when it doesn't have a
875 visible reason to keep them in the same order.  In this case, the
876 compiler doesn't know that the order of assignments is important, so its
877 optimization pass is permitted to exchange their order.
878 There's no telling whether it will actually do this, and it is possible
879 that passing the compiler different optimization flags or changing
880 compiler versions will produce different behavior.
881
882 The following is @emph{not} a solution, because locks neither prevent
883 interrupts nor prevent the compiler from reordering the code within the
884 region where the lock is held:
885
886 @example
887 lock_acquire (&timer_lock);     /* INCORRECT CODE */
888 timer_put_char = 'x';
889 timer_do_put = true;
890 lock_release (&timer_lock);
891 @end example
892
893 Fortunately, real solutions do exist.  One possibility is to
894 disable interrupts around the assignments.  This does not prevent
895 reordering, but it makes the assignments atomic as observed by the
896 interrupt handler.  It also has the extra runtime cost of disabling and
897 re-enabling interrupts:
898
899 @example
900 enum intr_level old_level = intr_disable ();
901 timer_put_char = 'x';
902 timer_do_put = true;
903 intr_set_level (old_level);
904 @end example
905
906 A second possibility is to mark the declarations of
907 @code{timer_put_char} and @code{timer_do_put} as @samp{volatile}.  This
908 keyword tells the compiler that the variables are externally observable
909 and restricts its latitude for optimization.  However, the semantics of
910 @samp{volatile} are not well-defined, so it is not a good general
911 solution.
912
913 Usually, the best solution is to use a compiler feature called a
914 @dfn{memory barrier}, a special statement that prevents the compiler
915 from reordering memory operations across the barrier.  In Pintos,
916 @file{threads/synch.h} defines the @code{barrier()} macro as a memory
917 barrier.  Here's how we would use a memory barrier to fix this code:
918
919 @example
920 timer_put_char = 'x';
921 barrier ();
922 timer_do_put = true;
923 @end example
924
925 The compiler also treats invocation of any function defined externally,
926 that is, in another source file, as a limited form of a memory barrier.
927 Specifically, the compiler assumes that any externally defined function
928 may access any statically or dynamically allocated data and any local
929 variable whose address is taken.  This often means that explicit
930 barriers can be omitted, and, indeed, this is why the base Pintos code
931 does not need any barriers.
932
933 A function defined in the same source file, or in a header included by
934 the source file, cannot be relied upon as a memory barrier.
935 This applies even to invocation of a function before its
936 definition, because the compiler may read and parse the entire source
937 file before performing optimization.
938
939 @node Interrupt Handling
940 @section Interrupt Handling
941
942 An @dfn{interrupt} notifies the CPU of some event.  Much of the work
943 of an operating system relates to interrupts in one way or another.
944 For our purposes, we classify interrupts into two broad categories:
945
946 @itemize @bullet
947 @item
948 @dfn{Internal interrupts}, that is, interrupts caused directly by CPU
949 instructions.  System calls, attempts at invalid memory access
950 (@dfn{page faults}), and attempts to divide by zero are some activities
951 that cause internal interrupts.  Because they are caused by CPU
952 instructions, internal interrupts are @dfn{synchronous} or synchronized
953 with CPU instructions.  @func{intr_disable} does not disable internal
954 interrupts.
955
956 @item
957 @dfn{External interrupts}, that is, interrupts originating outside the
958 CPU.  These interrupts come from hardware devices such as the system
959 timer, keyboard, serial ports, and disks.  External interrupts are
960 @dfn{asynchronous}, meaning that their delivery is not
961 synchronized with instruction execution.  Handling of external interrupts
962 can be postponed with @func{intr_disable} and related functions
963 (@pxref{Disabling Interrupts}).
964 @end itemize
965
966 The CPU treats both classes of interrupts largely the same way,
967 so Pintos has common infrastructure to handle both classes.
968 The following section describes this
969 common infrastructure.  The sections after that give the specifics of
970 external and internal interrupts.
971
972 If you haven't already read chapter 3, ``Basic Execution Environment,''
973 in @bibref{IA32-v1}, it is recommended that you do so now.  You might
974 also want to skim chapter 5, ``Interrupt and Exception Handling,'' in
975 @bibref{IA32-v3a}.
976
977 @menu
978 * Interrupt Infrastructure::    
979 * Internal Interrupt Handling::  
980 * External Interrupt Handling::  
981 @end menu
982
983 @node Interrupt Infrastructure
984 @subsection Interrupt Infrastructure
985
986 When an interrupt occurs, the CPU saves
987 its most essential state on a stack and jumps to an interrupt
988 handler routine.  The 80@var{x}86 architecture supports 256
989 interrupts, numbered 0 through 255, each with an independent
990 handler defined in an array called the @dfn{interrupt
991 descriptor table} or IDT.
992
993 In Pintos, @func{intr_init} in @file{threads/interrupt.c} sets up the
994 IDT so that each entry points to a unique entry point in
995 @file{threads/intr-stubs.S} named @func{intr@var{NN}_stub}, where
996 @var{NN} is the interrupt number in
997 hexadecimal.  Because the CPU doesn't give
998 us any other way to find out the interrupt number, this entry point
999 pushes the interrupt number on the stack.  Then it jumps to
1000 @func{intr_entry}, which pushes all the registers that the processor
1001 didn't already push for us, and then calls @func{intr_handler}, which
1002 brings us back into C in @file{threads/interrupt.c}.
1003
1004 The main job of @func{intr_handler} is to call the function
1005 registered for handling the particular interrupt.  (If no
1006 function is registered, it dumps some information to the console and
1007 panics.)  It also does some extra processing for external
1008 interrupts (@pxref{External Interrupt Handling}).
1009
1010 When @func{intr_handler} returns, the assembly code in
1011 @file{threads/intr-stubs.S} restores all the CPU registers saved
1012 earlier and directs the CPU to return from the interrupt.
1013
1014 The following types and functions are common to all
1015 interrupts.
1016
1017 @deftp {Type} {void intr_handler_func (struct intr_frame *@var{frame})}
1018 This is how an interrupt handler function must be declared.  Its @var{frame}
1019 argument (see below) allows it to determine the cause of the interrupt
1020 and the state of the thread that was interrupted.
1021 @end deftp
1022
1023 @deftp {Type} {struct intr_frame}
1024 The stack frame of an interrupt handler, as saved by the CPU, the interrupt
1025 stubs, and @func{intr_entry}.  Its most interesting members are described
1026 below.
1027 @end deftp
1028
1029 @deftypecv {Member} {@struct{intr_frame}} uint32_t edi
1030 @deftypecvx {Member} {@struct{intr_frame}} uint32_t esi
1031 @deftypecvx {Member} {@struct{intr_frame}} uint32_t ebp
1032 @deftypecvx {Member} {@struct{intr_frame}} uint32_t esp_dummy
1033 @deftypecvx {Member} {@struct{intr_frame}} uint32_t ebx
1034 @deftypecvx {Member} {@struct{intr_frame}} uint32_t edx
1035 @deftypecvx {Member} {@struct{intr_frame}} uint32_t ecx
1036 @deftypecvx {Member} {@struct{intr_frame}} uint32_t eax
1037 @deftypecvx {Member} {@struct{intr_frame}} uint16_t es
1038 @deftypecvx {Member} {@struct{intr_frame}} uint16_t ds
1039 Register values in the interrupted thread, pushed by @func{intr_entry}.
1040 The @code{esp_dummy} value isn't actually used (refer to the
1041 description of @code{PUSHA} in @bibref{IA32-v2b} for details).
1042 @end deftypecv
1043
1044 @deftypecv {Member} {@struct{intr_frame}} uint32_t vec_no
1045 The interrupt vector number, ranging from 0 to 255.
1046 @end deftypecv
1047
1048 @deftypecv {Member} {@struct{intr_frame}} uint32_t error_code
1049 The ``error code'' pushed on the stack by the CPU for some internal
1050 interrupts.
1051 @end deftypecv
1052
1053 @deftypecv {Member} {@struct{intr_frame}} void (*eip) (void)
1054 The address of the next instruction to be executed by the interrupted
1055 thread.
1056 @end deftypecv
1057
1058 @deftypecv {Member} {@struct{intr_frame}} {void *} esp
1059 The interrupted thread's stack pointer.
1060 @end deftypecv
1061
1062 @deftypefun {const char *} intr_name (uint8_t @var{vec})
1063 Returns the name of the interrupt numbered @var{vec}, or
1064 @code{"unknown"} if the interrupt has no registered name.
1065 @end deftypefun
1066
1067 @node Internal Interrupt Handling
1068 @subsection Internal Interrupt Handling
1069
1070 Internal interrupts are caused directly by CPU instructions executed by
1071 the running kernel thread or user process (from project 2 onward).  An
1072 internal interrupt is therefore said to arise in a ``process context.''
1073
1074 In an internal interrupt's handler, it can make sense to examine the
1075 @struct{intr_frame} passed to the interrupt handler, or even to modify
1076 it.  When the interrupt returns, modifications in @struct{intr_frame}
1077 become changes to the calling thread or process's state.  For example,
1078 the Pintos system call handler returns a value to the user program by
1079 modifying the saved EAX register (@pxref{System Call Details}).
1080
1081 There are no special restrictions on what an internal interrupt
1082 handler can or can't do.  Generally they should run with interrupts
1083 enabled, just like other code, and so they can be preempted by other
1084 kernel threads.  Thus, they do need to synchronize with other threads
1085 on shared data and other resources (@pxref{Synchronization}).
1086
1087 Internal interrupt handlers can be invoked recursively.  For example,
1088 the system call handler might cause a page fault while attempting to
1089 read user memory.  Deep recursion would risk overflowing the limited
1090 kernel stack (@pxref{struct thread}), but should be unnecessary.
1091
1092 @deftypefun void intr_register_int (uint8_t @var{vec}, int @var{dpl}, enum intr_level @var{level}, intr_handler_func *@var{handler}, const char *@var{name})
1093 Registers @var{handler} to be called when internal interrupt numbered
1094 @var{vec} is triggered.  Names the interrupt @var{name} for debugging
1095 purposes.
1096
1097 If @var{level} is @code{INTR_ON}, external interrupts will be processed
1098 normally during the interrupt handler's execution, which is normally
1099 desirable.  Specifying @code{INTR_OFF} will cause the CPU to disable
1100 external interrupts when it invokes the interrupt handler.  The effect
1101 is slightly different from calling @func{intr_disable} inside the
1102 handler, because that leaves a window of one or more CPU instructions in
1103 which external interrupts are still enabled.  This is important for the
1104 page fault handler; refer to the comments in @file{userprog/exception.c}
1105 for details.
1106
1107 @var{dpl} determines how the interrupt can be invoked.  If @var{dpl} is
1108 0, then the interrupt can be invoked only by kernel threads.  Otherwise
1109 @var{dpl} should be 3, which allows user processes to invoke the
1110 interrupt with an explicit INT instruction.  The value of @var{dpl}
1111 doesn't affect user processes' ability to invoke the interrupt
1112 indirectly, e.g.@: an invalid memory reference will cause a page fault
1113 regardless of @var{dpl}.
1114 @end deftypefun
1115
1116 @node External Interrupt Handling
1117 @subsection External Interrupt Handling
1118
1119 External interrupts are caused by events outside the CPU.
1120 They are asynchronous, so they can be invoked at any time that
1121 interrupts have not been disabled.  We say that an external interrupt
1122 runs in an ``interrupt context.''
1123
1124 In an external interrupt, the @struct{intr_frame} passed to the
1125 handler is not very meaningful.  It describes the state of the thread
1126 or process that was interrupted, but there is no way to predict which
1127 one that is.  It is possible, although rarely useful, to examine it, but
1128 modifying it is a recipe for disaster.
1129
1130 Only one external interrupt may be processed at a time.  Neither
1131 internal nor external interrupt may nest within an external interrupt
1132 handler.  Thus, an external interrupt's handler must run with interrupts
1133 disabled (@pxref{Disabling Interrupts}).
1134
1135 An external interrupt handler must not sleep or yield, which rules out
1136 calling @func{lock_acquire}, @func{thread_yield}, and many other
1137 functions.  Sleeping in interrupt context would effectively put the
1138 interrupted thread to sleep, too, until the interrupt handler was again
1139 scheduled and returned.  This would be unfair to the unlucky thread, and
1140 it would deadlock if the handler were waiting for the sleeping thread
1141 to, e.g., release a lock.
1142
1143 An external interrupt handler
1144 effectively monopolizes the machine and delays all other activities.
1145 Therefore, external interrupt handlers should complete as quickly as
1146 they can.  Anything that require much CPU time should instead run in a
1147 kernel thread, possibly one that the interrupt triggers using a
1148 synchronization primitive.
1149
1150 External interrupts are controlled by a
1151 pair of devices outside the CPU called @dfn{programmable interrupt
1152 controllers}, @dfn{PICs} for short.  When @func{intr_init} sets up the
1153 CPU's IDT, it also initializes the PICs for interrupt handling.  The
1154 PICs also must be ``acknowledged'' at the end of processing for each
1155 external interrupt.  @func{intr_handler} takes care of that by calling
1156 @func{pic_end_of_interrupt}, which properly signals the PICs.
1157
1158 The following functions relate to external
1159 interrupts.
1160
1161 @deftypefun void intr_register_ext (uint8_t @var{vec}, intr_handler_func *@var{handler}, const char *@var{name})
1162 Registers @var{handler} to be called when external interrupt numbered
1163 @var{vec} is triggered.  Names the interrupt @var{name} for debugging
1164 purposes.  The handler will run with interrupts disabled.
1165 @end deftypefun
1166
1167 @deftypefun bool intr_context (void)
1168 Returns true if we are running in an interrupt context, otherwise
1169 false.  Mainly used in functions that might sleep
1170 or that otherwise should not be called from interrupt context, in this
1171 form:
1172 @example
1173 ASSERT (!intr_context ());
1174 @end example
1175 @end deftypefun
1176
1177 @deftypefun void intr_yield_on_return (void)
1178 When called in an interrupt context, causes @func{thread_yield} to be
1179 called just before the interrupt returns.  Used
1180 in the timer interrupt handler when a thread's time slice expires, to
1181 cause a new thread to be scheduled.
1182 @end deftypefun
1183
1184 @node Memory Allocation
1185 @section Memory Allocation
1186
1187 Pintos contains two memory allocators, one that allocates memory in
1188 units of a page, and one that can allocate blocks of any size.
1189
1190 @menu
1191 * Page Allocator::              
1192 * Block Allocator::             
1193 @end menu
1194
1195 @node Page Allocator
1196 @subsection Page Allocator
1197
1198 The page allocator declared in @file{threads/palloc.h} allocates
1199 memory in units of a page.  It is most often used to allocate memory
1200 one page at a time, but it can also allocate multiple contiguous pages
1201 at once.
1202
1203 The page allocator divides the memory it allocates into two pools,
1204 called the kernel and user pools.  By default, each pool gets half of
1205 system memory, but this can be changed with a kernel command line
1206 option (@pxref{Why PAL_USER?}).  An allocation request draws from one
1207 pool or the other.  If one pool becomes empty, the other may still
1208 have free pages.  The user pool should be used for allocating memory
1209 for user processes and the kernel pool for all other allocations.
1210 This will only become important starting with project 3.  Until then,
1211 all allocations should be made from the kernel pool.
1212
1213 Each pool's usage is tracked with a bitmap, one bit per page in
1214 the pool.  A request to allocate @var{n} pages scans the bitmap
1215 for @var{n} consecutive bits set to
1216 false, indicating that those pages are free, and then sets those bits
1217 to true to mark them as used.  This is a ``first fit'' allocation
1218 strategy.
1219
1220 The page allocator is subject to fragmentation.  That is, it may not
1221 be possible to allocate @var{n} contiguous pages even though @var{n}
1222 or more pages are free, because the free pages are separated by used
1223 pages.  In fact, in pathological cases it may be impossible to
1224 allocate 2 contiguous pages even though @var{n} / 2 pages are free!
1225 Single-page requests can't fail due to fragmentation, so
1226 it is best to limit, as much as possible, the need for multiple
1227 contiguous pages.
1228
1229 Pages may not be allocated from interrupt context, but they may be
1230 freed.
1231
1232 When a page is freed, all of its bytes are cleared to @t{0xcc}, as
1233 a debugging aid (@pxref{Debugging Tips}).
1234
1235 Page allocator types and functions are described below.
1236
1237 @deftp {Type} {enum palloc_flags}
1238 A set of flags that describe how to allocate pages.  These flags may
1239 be combined in any combination.
1240 @end deftp
1241
1242 @defvr {Page Allocator Flag} @code{PAL_ASSERT}
1243 If the pages cannot be allocated, panic the kernel.  This is only
1244 appropriate during kernel initialization.  User processes
1245 should never be permitted to panic the kernel.
1246 @end defvr
1247
1248 @defvr {Page Allocator Flag} @code{PAL_ZERO}
1249 Zero all the bytes in the allocated pages before returning them.  If not
1250 set, the contents of newly allocated pages are unpredictable.
1251 @end defvr
1252
1253 @defvr {Page Allocator Flag} @code{PAL_USER}
1254 Obtain the pages from the user pool.  If not set, pages are allocated
1255 from the kernel pool.
1256 @end defvr
1257
1258 @deftypefun {void *} palloc_get_page (enum palloc_flags @var{flags})
1259 Obtains and returns a single page, allocating it in the manner specified by
1260 @var{flags}.  Returns a null pointer if no pages are
1261 free.
1262 @end deftypefun
1263
1264 @deftypefun {void *} palloc_get_multiple (enum palloc_flags @var{flags}, size_t @var{page_cnt})
1265 Obtains @var{page_cnt} contiguous free pages, allocating them in the
1266 manner specified by @var{flags}, and returns them.  Returns a null
1267 pointer if no pages are free.
1268 @end deftypefun
1269
1270 @deftypefun void palloc_free_page (void *@var{page})
1271 Frees @var{page}, which must have been obtained using
1272 @func{palloc_get_page} or @func{palloc_get_multiple}.
1273 @end deftypefun
1274
1275 @deftypefun void palloc_free_multiple (void *@var{pages}, size_t @var{page_cnt})
1276 Frees the @var{page_cnt} contiguous pages starting at @var{pages}.
1277 All of the pages must have been obtained using @func{palloc_get_page}
1278 or @func{palloc_get_multiple}.
1279 @end deftypefun
1280
1281 @node Block Allocator
1282 @subsection Block Allocator
1283
1284 The block allocator, declared in @file{threads/malloc.h}, can allocate
1285 blocks of any size.  It is layered on top of the page allocator
1286 described in the previous section.  Blocks returned by the block
1287 allocator are obtained from the kernel pool.
1288
1289 The block allocator uses two different strategies for allocating
1290 memory.  The first of these applies to ``small'' blocks, those 1 kB or
1291 smaller (one
1292 fourth of the page size).  These allocations are rounded up to the
1293 nearest power of 2, or 16 bytes, whichever is larger.  Then they are
1294 grouped into a page used only for allocations of the smae
1295 size.
1296
1297 The second strategy applies to allocating ``large'' blocks, those larger
1298 than 1 kB.
1299 These allocations (plus a small amount of overhead) are rounded up to
1300 the nearest page in size, and then the block allocator requests that
1301 number of contiguous pages from the page allocator.
1302
1303 In either case, the difference between the allocation requested size
1304 and the actual block size is wasted.  A real operating system would
1305 carefully tune its allocator to minimize this waste, but this is
1306 unimportant in an instructional system like Pintos.
1307
1308 As long as a page can be obtained from the page allocator, small
1309 allocations always succeed.  Most small allocations will not require a
1310 new page from the page allocator at all.  However, large allocations
1311 always require calling into the page allocator, and any allocation
1312 that needs more than one contiguous page can fail due to fragmentation,
1313 as already discussed in the previous section.  Thus, you should
1314 minimize the number of large allocations in your code, especially
1315 those over approximately 4 kB each.
1316
1317 The interface to the block allocator is through the standard C library
1318 functions @func{malloc}, @func{calloc}, and @func{free}.
1319
1320 When a block is freed, all of its bytes are cleared to @t{0xcc}, as
1321 a debugging aid (@pxref{Debugging Tips}).
1322
1323 The block allocator may not be called from interrupt context.
1324
1325 @node Virtual Addresses
1326 @section Virtual Addresses
1327
1328 A 32-bit virtual address can be divided into a 20-bit @dfn{page number}
1329 and a 12-bit @dfn{page offset} (or just @dfn{offset}), like this:
1330
1331 @example
1332 @group
1333                31               12 11        0
1334               +-------------------+-----------+
1335               |    Page Number    |   Offset  |
1336               +-------------------+-----------+
1337                        Virtual Address
1338 @end group
1339 @end example
1340
1341 Header @file{threads/vaddr.h} defines these functions and macros for
1342 working with virtual addresses:
1343
1344 @defmac PGSHIFT
1345 @defmacx PGBITS
1346 The bit index (0) and number of bits (12) in the offset part of a
1347 virtual address, respectively.
1348 @end defmac
1349
1350 @defmac PGMASK
1351 A bit mask with value @t{0xfff}, so that the bits in the page offset are
1352 set to 1 and other bits set to 0.
1353 @end defmac
1354
1355 @defmac PGSIZE
1356 The page size in bytes (4096).
1357 @end defmac
1358
1359 @deftypefun unsigned pg_ofs (const void *@var{va})
1360 Extracts and returns the page offset in virtual address @var{va}.
1361 @end deftypefun
1362
1363 @deftypefun uintptr_t pg_no (const void *@var{va})
1364 Extracts and returns the page number in virtual address @var{va}.
1365 @end deftypefun
1366
1367 @deftypefun {void *} pg_round_down (const void *@var{va})
1368 Returns the start of the virtual page that @var{va} points within, that
1369 is, @var{va} with the page offset set to 0.
1370 @end deftypefun
1371
1372 @deftypefun {void *} pg_round_up (const void *@var{va})
1373 Returns @var{va} rounded up to the nearest page boundary.
1374 @end deftypefun
1375
1376 Virtual memory in Pintos is divided into two regions: user virtual
1377 memory and kernel virtual memory.  The boundary between them is
1378 @code{PHYS_BASE}:
1379
1380 @defmac PHYS_BASE
1381 Base address of kernel virtual memory.  It defaults to @t{0xc0000000} (3
1382 GB), but it may be changed to any multiple of @t{0x10000000} from
1383 @t{0x80000000} to @t{0xf0000000}.
1384
1385 User virtual memory ranges from virtual address 0 up to
1386 @code{PHYS_BASE}.  Kernel virtual memory occupies the rest of the
1387 virtual address space, from @code{PHYS_BASE} up to 4 GB.
1388 @end defmac
1389
1390 @deftypefun {bool} is_user_vaddr (const void *@var{va})
1391 @deftypefunx {bool} is_kernel_vaddr (const void *@var{va})
1392 Returns true if @var{va} is a user or kernel virtual address,
1393 respectively, false otherwise.
1394 @end deftypefun
1395
1396 The 80@var{x}86 doesn't provide any way to directly access memory given
1397 a physical address.  This ability is often necessary in an operating
1398 system kernel, so Pintos works around it by mapping kernel virtual
1399 memory one-to-one to physical memory.  That is, virtual address
1400 @code{PHYS_BASE} accesses physical address 0, virtual address
1401 @code{PHYS_BASE} + @t{0x1234} accesses physical address @t{0x1234}, and
1402 so on up to the size of the machine's physical memory.  Thus, adding
1403 @code{PHYS_BASE} to a physical address obtains a kernel virtual address
1404 that accesses that address; conversely, subtracting @code{PHYS_BASE}
1405 from a kernel virtual address obtains the corresponding physical
1406 address.  Header @file{threads/vaddr.h} provides a pair of functions to
1407 do these translations:
1408
1409 @deftypefun {void *} ptov (uintptr_t @var{pa})
1410 Returns the kernel virtual address corresponding to physical address
1411 @var{pa}, which should be between 0 and the number of bytes of physical
1412 memory.
1413 @end deftypefun
1414
1415 @deftypefun {uintptr_t} vtop (void *@var{va})
1416 Returns the physical address corresponding to @var{va}, which must be a
1417 kernel virtual address.
1418 @end deftypefun
1419
1420 @node Page Table
1421 @section Page Table
1422
1423 The code in @file{pagedir.c} is an abstract interface to the 80@var{x}86
1424 hardware page table, also called a ``page directory'' by Intel processor
1425 documentation.  The page table interface uses a @code{uint32_t *} to
1426 represent a page table because this is convenient for accessing their
1427 internal structure.
1428
1429 The sections below describe the page table interface and internals.
1430
1431 @menu
1432 * Page Table Creation Destruction Activation::  
1433 * Page Tables Inspection and Updates::  
1434 * Page Table Accessed and Dirty Bits::  
1435 * Page Table Details::          
1436 @end menu
1437
1438 @node Page Table Creation Destruction Activation
1439 @subsection Creation, Destruction, and Activation
1440
1441 These functions create, destroy, and activate page tables.  The base
1442 Pintos code already calls these functions where necessary, so it should
1443 not be necessary to call them yourself.
1444
1445 @deftypefun {uint32_t *} pagedir_create (void)
1446 Creates and returns a new page table.  The new page table contains
1447 Pintos's normal kernel virtual page mappings, but no user virtual
1448 mappings.
1449
1450 Returns a null pointer if memory cannot be obtained.
1451 @end deftypefun
1452
1453 @deftypefun void pagedir_destroy (uint32_t *@var{pd})
1454 Frees all of the resources held by @var{pd}, including the page table
1455 itself and the frames that it maps.
1456 @end deftypefun
1457
1458 @deftypefun void pagedir_activate (uint32_t *@var{pd})
1459 Activates @var{pd}.  The active page table is the one used by the CPU to
1460 translate memory references.
1461 @end deftypefun
1462
1463 @node Page Tables Inspection and Updates
1464 @subsection Inspection and Updates
1465
1466 These functions examine or update the mappings from pages to frames
1467 encapsulated by a page table.  They work on both active and inactive
1468 page tables (that is, those for running and suspended processes),
1469 flushing the TLB as necessary.
1470
1471 User page parameters (@var{upage})to these functions should be user
1472 virtual addresses.  Kernel page parameters (@var{kpage}) should be
1473 kernel virtual addresses and should have been obtained from the user
1474 pool with @code{palloc_get_page(PAL_USER)} (@pxref{Why PAL_USER?}).
1475
1476 @deftypefun bool pagedir_set_page (uint32_t *@var{pd}, void *@var{upage}, void *@var{kpage}, bool @var{writable})
1477 Adds to @var{pd} a mapping from page @var{upage} to the frame identified
1478 by kernel virtual address @var{kpage}.  If @var{writable} is true, the
1479 page is mapped read/write; otherwise, it is mapped read-only.
1480
1481 Page @var{upage} must not already be mapped.  If it is, the kernel
1482 panics.
1483
1484 Returns true if successful, false on failure.  Failure will occur if
1485 additional memory required for the page table cannot be obtained.
1486 @end deftypefun
1487
1488 @deftypefun {void *} pagedir_get_page (uint32_t *@var{pd}, const void *@var{uaddr})
1489 Looks up the frame mapped to @var{upage} in @var{pd}.  Returns the
1490 kernel virtual address for that frame, if @var{upage} is mapped, or a
1491 null pointer if it is not.
1492 @end deftypefun
1493
1494 @deftypefun void pagedir_clear_page (uint32_t *@var{pd}, void *@var{upage})
1495 Marks page @var{upage} ``not present'' in @var{pd}.  Later accesses to
1496 the page will fault.
1497
1498 Other bits in the page table for @var{upage} are preserved, permitting
1499 the accessed and dirty bits (see the next section) to be checked.
1500
1501 If @var{upage} is not mapped, this function has no effect.
1502 @end deftypefun
1503
1504 @node Page Table Accessed and Dirty Bits
1505 @subsection Accessed and Dirty Bits
1506
1507 80@var{x}86 hardware provides some assistance for implementing page
1508 replacement algorithms, through a pair of bits in the page table entry
1509 (PTE) for each page.  On any read or write to a page, the CPU sets the
1510 @dfn{accessed bit} to 1 in the page's PTE, and on any write, the CPU
1511 sets the @dfn{dirty bit} to 1.  The CPU never resets these bits to 0,
1512 but the OS may do so.
1513
1514 Proper interpretation of these bits requires understanding of
1515 @dfn{aliases}, that is, two (or more) pages that refer to the same
1516 frame.  When an aliased frame is accessed, the accessed and dirty bits
1517 are updated in only one page table entry (the one for the page used for
1518 access).  The accessed and dirty bits for the other aliases are not
1519 updated.
1520
1521 @xref{Accessed and Dirty Bits}, on applying these bits in implementing
1522 page replacement algorithms.
1523
1524 @deftypefun bool pagedir_is_dirty (uint32_t *@var{pd}, const void *@var{page})
1525 @deftypefunx bool pagedir_is_accessed (uint32_t *@var{pd}, const void *@var{page})
1526 Returns true if page directory @var{pd} contains a page table entry for
1527 @var{page} that is marked dirty (or accessed).  Otherwise,
1528 returns false.
1529 @end deftypefun
1530
1531 @deftypefun void pagedir_set_dirty (uint32_t *@var{pd}, const void *@var{page}, bool @var{value})
1532 @deftypefunx void pagedir_set_accessed (uint32_t *@var{pd}, const void *@var{page}, bool @var{value})
1533 If page directory @var{pd} has a page table entry for @var{page}, then
1534 its dirty (or accessed) bit is set to @var{value}.
1535 @end deftypefun
1536
1537 @node Page Table Details
1538 @subsection Page Table Details
1539
1540 The functions provided with Pintos are sufficient to implement the
1541 projects.  However, you may still find it worthwhile to understand the
1542 hardware page table format, so we'll go into a little detail in this
1543 section.
1544
1545 @menu
1546 * Page Table Structure::        
1547 * Page Table Entry Format::     
1548 * Page Directory Entry Format::  
1549 @end menu
1550
1551 @node Page Table Structure
1552 @subsubsection Structure
1553
1554 The top-level paging data structure is a page called the ``page
1555 directory'' (PD) arranged as an array of 1,024 32-bit page directory
1556 entries (PDEs), each of which represents 4 MB of virtual memory.  Each
1557 PDE may point to the physical address of another page called a
1558 ``page table'' (PT) arranged, similarly, as an array of 1,024
1559 32-bit page table entries (PTEs), each of which translates a single 4
1560 kB virtual page to a physical page.
1561
1562 Translation of a virtual address into a physical address follows
1563 the three-step process illustrated in the diagram
1564 below:@footnote{Actually, virtual to physical translation on the
1565 80@var{x}86 architecture occurs via an intermediate ``linear
1566 address,'' but Pintos (and most modern 80@var{x}86 OSes) set up the CPU
1567 so that linear and virtual addresses are one and the same.  Thus, you
1568 can effectively ignore this CPU feature.}
1569
1570 @enumerate 1
1571 @item
1572 The most-significant 10 bits of the virtual address (bits 22@dots{}31)
1573 index the page directory.  If the PDE is marked ``present,'' the
1574 physical address of a page table is read from the PDE thus obtained.
1575 If the PDE is marked ``not present'' then a page fault occurs.
1576
1577 @item
1578 The next 10 bits of the virtual address (bits 12@dots{}21) index
1579 the page table.  If the PTE is marked ``present,'' the physical
1580 address of a data page is read from the PTE thus obtained.  If the PTE
1581 is marked ``not present'' then a page fault occurs.
1582
1583 @item
1584 The least-significant 12 bits of the virtual address (bits 0@dots{}11)
1585 are added to the data page's physical base address, yielding the final
1586 physical address.
1587 @end enumerate
1588
1589 @example
1590 @group
1591  31                  22 21                  12 11                   0
1592 +----------------------+----------------------+----------------------+
1593 | Page Directory Index |   Page Table Index   |    Page Offset       |
1594 +----------------------+----------------------+----------------------+
1595              |                    |                     |
1596      _______/             _______/                _____/
1597     /                    /                       /
1598    /    Page Directory  /      Page Table       /    Data Page
1599   /     .____________. /     .____________.    /   .____________.
1600   |1,023|____________| |1,023|____________|    |   |____________|
1601   |1,022|____________| |1,022|____________|    |   |____________|
1602   |1,021|____________| |1,021|____________|    \__\|____________|
1603   |1,020|____________| |1,020|____________|       /|____________|
1604   |     |            | |     |            |        |            |
1605   |     |            | \____\|            |_       |            |
1606   |     |      .     |      /|      .     | \      |      .     |
1607   \____\|      .     |_      |      .     |  |     |      .     |
1608        /|      .     | \     |      .     |  |     |      .     |
1609         |      .     |  |    |      .     |  |     |      .     |
1610         |            |  |    |            |  |     |            |
1611         |____________|  |    |____________|  |     |____________|
1612        4|____________|  |   4|____________|  |     |____________|
1613        3|____________|  |   3|____________|  |     |____________|
1614        2|____________|  |   2|____________|  |     |____________|
1615        1|____________|  |   1|____________|  |     |____________|
1616        0|____________|  \__\0|____________|  \____\|____________|
1617                            /                      /
1618 @end group
1619 @end example
1620
1621 Pintos provides some macros and functions that are useful for working
1622 with raw page tables:
1623
1624 @defmac PTSHIFT
1625 @defmacx PTBITS
1626 The bit index (12) and number of bits (10), respectively, in a page table
1627 index within a virtual address.
1628 @end defmac
1629
1630 @defmac PTMASK
1631 A bit mask with the bits in the page table index set to 1 and other bits
1632 set to 0.
1633 @end defmac
1634
1635 @defmac PTSPAN
1636 The number of bytes of virtual address space that a single page table
1637 page covers (4,194,304 bytes, or 4 MB).
1638 @end defmac
1639
1640 @defmac PDSHIFT
1641 @defmacx PDBITS
1642 The bit index (22) and number of bits (10), respectively, in a page
1643 directory index within a virtual address.
1644 @end defmac
1645
1646 @defmac PDMASK
1647 A bit mask with the bits in the page directory index set to 1 and other
1648 bits set to 0.
1649 @end defmac
1650
1651 @deftypefun uintptr_t pd_no (const void *@var{va})
1652 @deftypefunx uintptr_t pt_no (const void *@var{va})
1653 Returns the page directory index or page table index, respectively, for
1654 virtual address @var{va}.  These functions are defined in
1655 @file{threads/pte.h}.
1656 @end deftypefun
1657
1658 @deftypefun unsigned pg_ofs (const void *@var{va})
1659 Returns the page offset for virtual address @var{va}.  This function is
1660 defined in @file{threads/vaddr.h}.
1661 @end deftypefun
1662
1663 @node Page Table Entry Format
1664 @subsubsection Page Table Entry Format
1665
1666 You do not need to understand the PTE format to do the Pintos
1667 projects, unless you wish to incorporate the page table into your
1668 supplemental page table (@pxref{Managing the Supplemental Page Table}).
1669
1670 The actual format of a page table entry is summarized below.  For
1671 complete information, refer to section 3.7, ``Page Translation Using
1672 32-Bit Physical Addressing,'' in @bibref{IA32-v3a}.
1673
1674 @example
1675 @group
1676  31                                   12 11 9      6 5     2 1 0
1677 +---------------------------------------+----+----+-+-+---+-+-+-+
1678 |           Physical Address            | AVL|    |D|A|   |U|W|P|
1679 +---------------------------------------+----+----+-+-+---+-+-+-+
1680 @end group
1681 @end example
1682
1683 Some more information on each bit is given below.  The names are
1684 @file{threads/pte.h} macros that represent the bits' values:
1685
1686 @defmac PTE_P
1687 Bit 0, the ``present'' bit.  When this bit is 1, the
1688 other bits are interpreted as described below.  When this bit is 0, any
1689 attempt to access the page will page fault.  The remaining bits are then
1690 not used by the CPU and may be used by the OS for any purpose.
1691 @end defmac
1692
1693 @defmac PTE_W
1694 Bit 1, the ``read/write'' bit.  When it is 1, the page
1695 is writable.  When it is 0, write attempts will page fault.
1696 @end defmac
1697
1698 @defmac PTE_U
1699 Bit 2, the ``user/supervisor'' bit.  When it is 1, user
1700 processes may access the page.  When it is 0, only the kernel may access
1701 the page (user accesses will page fault).
1702
1703 Pintos clears this bit in PTEs for kernel virtual memory, to prevent
1704 user processes from accessing them.
1705 @end defmac
1706  
1707 @defmac PTE_A
1708 Bit 5, the ``accessed'' bit.  @xref{Page Table Accessed
1709 and Dirty Bits}.
1710 @end defmac
1711
1712 @defmac PTE_D
1713 Bit 6, the ``dirty'' bit.  @xref{Page Table Accessed and
1714 Dirty Bits}.
1715 @end defmac
1716
1717 @defmac PTE_AVL
1718 Bits 9@dots{}11, available for operating system use.
1719 Pintos, as provided, does not use them and sets them to 0.
1720 @end defmac
1721
1722 @defmac PTE_ADDR
1723 Bits 12@dots{}31, the top 20 bits of the physical address of a frame.
1724 The low 12 bits of the frame's address are always 0.
1725 @end defmac
1726
1727 Other bits are either reserved or uninteresting in a Pintos context and
1728 should be set to@tie{}0.
1729
1730 Header @file{threads/pte.h} defines three functions for working with
1731 page table entries:
1732
1733 @deftypefun uint32_t pte_create_kernel (uint32_t *@var{page}, bool @var{writable})
1734 Returns a page table entry that points to @var{page}, which should be a
1735 kernel virtual address.  The PTE's present bit will be set.  It will be
1736 marked for kernel-only access.  If @var{writable} is true, the PTE will
1737 also be marked read/write; otherwise, it will be read-only.
1738 @end deftypefun
1739
1740 @deftypefun uint32_t pte_create_user (uint32_t *@var{page}, bool @var{writable})
1741 Returns a page table entry that points to @var{page}, which should be
1742 the kernel virtual address of a frame in the user pool (@pxref{Why
1743 PAL_USER?}).  The PTE's present bit will be set and it will be marked to
1744 allow user-mode access.  If @var{writable} is true, the PTE will also be
1745 marked read/write; otherwise, it will be read-only.
1746 @end deftypefun
1747
1748 @deftypefun {void *} pte_get_page (uint32_t @var{pte})
1749 Returns the kernel virtual address for the frame that @var{pte} points
1750 to.  The @var{pte} may be present or not-present; if it is not-present
1751 then the pointer return is only meaningful if the proper bits in the PTE
1752 actually represent a physical address.
1753 @end deftypefun
1754
1755 @node Page Directory Entry Format
1756 @subsubsection Page Directory Entry Format
1757
1758 Page directory entries have the same format as PTEs, except that the
1759 physical address points to a page table page instead of a frame.  Header
1760 @file{threads/pte.h} defines two functions for working with page
1761 directory entries:
1762
1763 @deftypefun uint32_t pde_create (uint32_t *@var{pt})
1764 Returns a page directory that points to @var{page}, which should be the
1765 kernel virtual address of a page table page.  The PDE's present bit will
1766 be set, it will be marked to allow user-mode access, and it will be
1767 marked read/write.
1768 @end deftypefun
1769
1770 @deftypefun {uint32_t *} pde_get_pt (uint32_t @var{pde})
1771 Returns the kernel virtual address for the page table page that
1772 @var{pde} points to.  The @var{pde} must be marked present.
1773 @end deftypefun
1774
1775 @node Hash Table
1776 @section Hash Table
1777
1778 Pintos provides a hash table data structure in @file{lib/kernel/hash.c}.
1779 To use it you will need to manually include its header file,
1780 @file{lib/kernel/hash.h}, with @code{#include <hash.h>}.  Intentionally,
1781 no code provided with Pintos uses the hash table, which means that you
1782 are free to use it as is, modify its implementation for your own
1783 purposes, or ignore it, as you wish.
1784
1785 Most implementations of the virtual memory project use a hash table to
1786 translate pages to frames.  You may find other uses for hash tables as
1787 well.
1788
1789 @menu
1790 * Hash Data Types::             
1791 * Basic Hash Functions::        
1792 * Hash Search Functions::       
1793 * Hash Iteration Functions::    
1794 * Hash Table Example::          
1795 * Hash Auxiliary Data::         
1796 * Hash Synchronization::        
1797 @end menu
1798
1799 @node Hash Data Types
1800 @subsection Data Types
1801
1802 A hash table is represented by @struct{hash}.
1803
1804 @deftp {Type} {struct hash}
1805 Represents an entire hash table.  The actual members of @struct{hash}
1806 are ``opaque.''  That is, code that uses a hash table should not access
1807 @struct{hash} members directly, nor should it need to.  Instead, use
1808 hash table functions and macros.
1809 @end deftp
1810
1811 The hash table operates on elements of type @struct{hash_elem}.
1812
1813 @deftp {Type} {struct hash_elem}
1814 Embed a @struct{hash_elem} member in the structure you want to include
1815 in a hash table.  Like @struct{hash}, @struct{hash_elem} is opaque.
1816 All functions for operating on hash table elements actually take and
1817 return pointers to @struct{hash_elem}, not pointers to your hash table's
1818 real element type.
1819 @end deftp
1820
1821 You will often need to obtain a @struct{hash_elem}
1822 given a real element of the hash table, and vice versa.  Given
1823 a real element of the hash table, obtaining a pointer to its
1824 @struct{hash_elem} is trivial: take the address of the
1825 @struct{hash_elem} member.  Use the @code{hash_entry()} macro to go the
1826 other direction.
1827
1828 @deftypefn {Macro} {@var{type} *} hash_entry (struct hash_elem *@var{elem}, @var{type}, @var{member})
1829 Returns a pointer to the structure that @var{elem}, a pointer to a
1830 @struct{hash_elem}, is embedded within.  You must provide @var{type},
1831 the name of the structure that @var{elem} is inside, and @var{member},
1832 the name of the member in @var{type} that @var{elem} points to.
1833
1834 For example, suppose @code{h} is a @code{struct hash_elem *} variable
1835 that points to a @struct{thread} member (of type @struct{hash_elem})
1836 named @code{h_elem}.  Then, @code{hash_entry (h, struct thread, h_elem)}
1837 yields the address of the @struct{thread} that @code{h} points within.
1838 @end deftypefn
1839
1840 Each hash table element must contain a key, that is, data that
1841 identifies and distinguishes elements in the hash table.  Every element
1842 in a hash table at a given time must have a unique key.  (Elements may
1843 also contain non-key data that need not be unique.)  While an element is
1844 in a hash table, its key data must not be changed.  For each hash table,
1845 you must write two functions that act on keys: a hash function and a
1846 comparison function.  These functions must match the following
1847 prototypes:
1848
1849 @deftp {Type} {unsigned hash_hash_func (const struct hash_elem *@var{element}, void *@var{aux})}
1850 Returns a hash of @var{element}'s data, as a value anywhere in the range
1851 of @code{unsigned int}.  The hash of an element should be a
1852 pseudo-random function of the element's key.  It must not depend on
1853 non-key data in the element or on any non-constant data other than the
1854 key.  Pintos provides the following functions as a suitable basis for
1855 hash functions.
1856
1857 @deftypefun unsigned hash_bytes (const void *@var{buf}, size_t *@var{size})
1858 Returns a hash of the @var{size} bytes starting at @var{buf}.  The
1859 implementation is the general-purpose
1860 @uref{http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash, Fowler-Noll-Vo
1861 hash} for 32-bit words.
1862 @end deftypefun
1863
1864 @deftypefun unsigned hash_string (const char *@var{s})
1865 Returns a hash of null-terminated string @var{s}.
1866 @end deftypefun
1867
1868 @deftypefun unsigned hash_int (int @var{i})
1869 Returns a hash of integer @var{i}.
1870 @end deftypefun
1871
1872 If your key is a single piece of data of an appropriate type, it is
1873 sensible for your hash function to directly return the output of one of
1874 these functions.  For multiple pieces of data, you may wish to combine
1875 the output of more than one call to them using, e.g., the @samp{^}
1876 (exclusive or)
1877 operator.  Finally, you may entirely ignore these functions and write
1878 your own hash function from scratch, but remember that your goal is to
1879 build an operating system kernel, not to design a hash function.
1880
1881 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}.
1882 @end deftp
1883
1884 @deftp {Type} {bool hash_less_func (const struct hash_elem *@var{a}, const struct hash_elem *@var{b}, void *@var{aux})}
1885 Compares the keys stored in elements @var{a} and @var{b}.  Returns
1886 true if @var{a} is less than @var{b}, false if @var{a} is greater than
1887 or equal to @var{b}.
1888
1889 If two elements compare equal, then they must hash to equal values.
1890
1891 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}.
1892 @end deftp
1893
1894 A few functions that act on hashes accept a pointer to a third kind of
1895 function as an argument:
1896
1897 @deftp {Type} {void hash_action_func (struct hash_elem *@var{element}, void *@var{aux})}
1898 Performs some kind of action, chosen by the caller, on @var{element}.
1899
1900 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}.
1901 @end deftp
1902
1903 @node Basic Hash Functions
1904 @subsection Basic Functions
1905
1906 These functions create and destroy hash tables and obtain basic
1907 information about their contents.
1908
1909 @deftypefun bool hash_init (struct hash *@var{hash}, hash_hash_func *@var{hash_func}, hash_less_func *@var{less_func}, void *@var{aux})
1910 Initializes @var{hash} as a hash table using @var{hash_func} as hash
1911 function, @var{less_func} as comparison function, and @var{aux} as
1912 auxiliary data.
1913 Returns true if successful, false on failure.  @func{hash_init} calls
1914 @func{malloc} and fails if memory cannot be allocated.
1915
1916 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}, which is
1917 most often a null pointer.
1918 @end deftypefun
1919
1920 @deftypefun void hash_clear (struct hash *@var{hash}, hash_action_func *@var{action})
1921 Removes all the elements from @var{hash}, which must have been
1922 previously initialized with @func{hash_init}.
1923
1924 If @var{action} is non-null, then it is called once for each element in
1925 the hash table, which gives the caller an opportunity to deallocate any
1926 memory or other resources used by the element.  For example, if the hash
1927 table elements are dynamically allocated using @func{malloc}, then
1928 @var{action} could @func{free} the element.  This is safe because
1929 @func{hash_clear} will not access the memory in a given hash element
1930 after calling @var{action} on it.  However, @var{action} must not call
1931 any function that may modify the hash table, such as @func{hash_insert}
1932 or @func{hash_delete}.
1933 @end deftypefun
1934
1935 @deftypefun void hash_destroy (struct hash *@var{hash}, hash_action_func *@var{action})
1936 If @var{action} is non-null, calls it for each element in the hash, with
1937 the same semantics as a call to @func{hash_clear}.  Then, frees the
1938 memory held by @var{hash}.  Afterward, @var{hash} must not be passed to
1939 any hash table function, absent an intervening call to @func{hash_init}.
1940 @end deftypefun
1941
1942 @deftypefun size_t hash_size (struct hash *@var{hash})
1943 Returns the number of elements currently stored in @var{hash}.
1944 @end deftypefun
1945
1946 @deftypefun bool hash_empty (struct hash *@var{hash})
1947 Returns true if @var{hash} currently contains no elements,
1948 false if @var{hash} contains at least one element.
1949 @end deftypefun
1950
1951 @node Hash Search Functions
1952 @subsection Search Functions
1953
1954 Each of these functions searches a hash table for an element that
1955 compares equal to one provided.  Based on the success of the search,
1956 they perform some action, such as inserting a new element into the hash
1957 table, or simply return the result of the search.
1958
1959 @deftypefun {struct hash_elem *} hash_insert (struct hash *@var{hash}, struct hash_elem *@var{element})
1960 Searches @var{hash} for an element equal to @var{element}.  If none is
1961 found, inserts @var{element} into @var{hash} and returns a null pointer.
1962 If the table already contains an element equal to @var{element}, returns
1963 the existing element without modifying @var{hash}.
1964 @end deftypefun
1965
1966 @deftypefun {struct hash_elem *} hash_replace (struct hash *@var{hash}, struct hash_elem *@var{element})
1967 Inserts @var{element} into @var{hash}.  Any element equal to
1968 @var{element} already in @var{hash} is removed.  Returns the element
1969 removed, or a null pointer if @var{hash} did not contain an element
1970 equal to @var{element}.
1971
1972 The caller is responsible for deallocating any resources associated with
1973 the element returned, as appropriate.  For example, if the hash table
1974 elements are dynamically allocated using @func{malloc}, then the caller
1975 must @func{free} the element after it is no longer needed.
1976 @end deftypefun
1977
1978 The element passed to the following functions is only used for hashing
1979 and comparison purposes.  It is never actually inserted into the hash
1980 table.  Thus, only the key data in the element need be initialized, and
1981 other data in the element will not be used.  It often makes sense to
1982 declare an instance of the element type as a local variable, initialize
1983 the key data, and then pass the address of its @struct{hash_elem} to
1984 @func{hash_find} or @func{hash_delete}.  @xref{Hash Table Example}, for
1985 an example.  (Large structures should not be
1986 allocated as local variables.  @xref{struct thread}, for more
1987 information.)
1988
1989 @deftypefun {struct hash_elem *} hash_find (struct hash *@var{hash}, struct hash_elem *@var{element})
1990 Searches @var{hash} for an element equal to @var{element}.  Returns the
1991 element found, if any, or a null pointer otherwise.
1992 @end deftypefun
1993
1994 @deftypefun {struct hash_elem *} hash_delete (struct hash *@var{hash}, struct hash_elem *@var{element})
1995 Searches @var{hash} for an element equal to @var{element}.  If one is
1996 found, it is removed from @var{hash} and returned.  Otherwise, a null
1997 pointer is returned and @var{hash} is unchanged.
1998
1999 The caller is responsible for deallocating any resources associated with
2000 the element returned, as appropriate.  For example, if the hash table
2001 elements are dynamically allocated using @func{malloc}, then the caller
2002 must @func{free} the element after it is no longer needed.
2003 @end deftypefun
2004
2005 @node Hash Iteration Functions
2006 @subsection Iteration Functions
2007
2008 These functions allow iterating through the elements in a hash table.
2009 Two interfaces are supplied.  The first requires writing and supplying a
2010 @var{hash_action_func} to act on each element (@pxref{Hash Data Types}).
2011
2012 @deftypefun void hash_apply (struct hash *@var{hash}, hash_action_func *@var{action})
2013 Calls @var{action} once for each element in @var{hash}, in arbitrary
2014 order.  @var{action} must not call any function that may modify the hash
2015 table, such as @func{hash_insert} or @func{hash_delete}.  @var{action}
2016 must not modify key data in elements, although it may modify any other
2017 data.
2018 @end deftypefun
2019
2020 The second interface is based on an ``iterator'' data type.
2021 Idiomatically, iterators are used as follows:
2022
2023 @example
2024 struct hash_iterator i;
2025
2026 hash_first (&i, h);
2027 while (hash_next (&i))
2028   @{
2029     struct foo *f = hash_entry (hash_cur (&i), struct foo, elem);
2030     @r{@dots{}do something with @i{f}@dots{}}
2031   @}
2032 @end example
2033
2034 @deftp {Type} {struct hash_iterator}
2035 Represents a position within a hash table.  Calling any function that
2036 may modify a hash table, such as @func{hash_insert} or
2037 @func{hash_delete}, invalidates all iterators within that hash table.
2038
2039 Like @struct{hash} and @struct{hash_elem}, @struct{hash_elem} is opaque.
2040 @end deftp
2041
2042 @deftypefun void hash_first (struct hash_iterator *@var{iterator}, struct hash *@var{hash})
2043 Initializes @var{iterator} to just before the first element in
2044 @var{hash}.
2045 @end deftypefun
2046
2047 @deftypefun {struct hash_elem *} hash_next (struct hash_iterator *@var{iterator})
2048 Advances @var{iterator} to the next element in @var{hash}, and returns
2049 that element.  Returns a null pointer if no elements remain.  After
2050 @func{hash_next} returns null for @var{iterator}, calling it again
2051 yields undefined behavior.
2052 @end deftypefun
2053
2054 @deftypefun {struct hash_elem *} hash_cur (struct hash_iterator *@var{iterator})
2055 Returns the value most recently returned by @func{hash_next} for
2056 @var{iterator}.  Yields undefined behavior after @func{hash_first} has
2057 been called on @var{iterator} but before @func{hash_next} has been
2058 called for the first time.
2059 @end deftypefun
2060
2061 @node Hash Table Example
2062 @subsection Hash Table Example
2063
2064 Suppose you have a structure, called @struct{page}, that you
2065 want to put into a hash table.  First, define @struct{page} to include a
2066 @struct{hash_elem} member:
2067
2068 @example
2069 struct page
2070   @{
2071     struct hash_elem hash_elem; /* @r{Hash table element.} */
2072     void *addr;                 /* @r{Virtual address.} */
2073     /* @r{@dots{}other members@dots{}} */
2074   @};
2075 @end example
2076
2077 We write a hash function and a comparison function using @var{addr} as
2078 the key.  A pointer can be hashed based on its bytes, and the @samp{<}
2079 operator works fine for comparing pointers:
2080
2081 @example
2082 /* @r{Returns a hash value for page @var{p}.} */
2083 unsigned
2084 page_hash (const struct hash_elem *p_, void *aux UNUSED)
2085 @{
2086   const struct page *p = hash_entry (p_, struct page, hash_elem);
2087   return hash_bytes (&p->addr, sizeof p->addr);
2088 @}
2089
2090 /* @r{Returns true if page @var{a} precedes page @var{b}.} */
2091 bool
2092 page_less (const struct hash_elem *a_, const struct hash_elem *b_,
2093            void *aux UNUSED)
2094 @{
2095   const struct page *a = hash_entry (a_, struct page, hash_elem);
2096   const struct page *b = hash_entry (b_, struct page, hash_elem);
2097
2098   return a->addr < b->addr;
2099 @}
2100 @end example
2101
2102 @noindent
2103 (The use of @code{UNUSED} in these functions' prototypes suppresses a
2104 warning that @var{aux} is unused.  @xref{Function and Parameter
2105 Attributes}, for information about @code{UNUSED}.  @xref{Hash Auxiliary
2106 Data}, for an explanation of @var{aux}.)
2107
2108 Then, we can create a hash table like this:
2109
2110 @example
2111 struct hash pages;
2112
2113 hash_init (&pages, page_hash, page_less, NULL);
2114 @end example
2115
2116 Now we can manipulate the hash table we've created.  If @code{@var{p}}
2117 is a pointer to a @struct{page}, we can insert it into the hash table
2118 with:
2119
2120 @example
2121 hash_insert (&pages, &p->hash_elem);
2122 @end example
2123
2124 @noindent If there's a chance that @var{pages} might already contain a
2125 page with the same @var{addr}, then we should check @func{hash_insert}'s
2126 return value.
2127
2128 To search for an element in the hash table, use @func{hash_find}.  This
2129 takes a little setup, because @func{hash_find} takes an element to
2130 compare against.  Here's a function that will find and return a page
2131 based on a virtual address, assuming that @var{pages} is defined at file
2132 scope:
2133
2134 @example
2135 /* @r{Returns the page containing the given virtual @var{address},
2136    or a null pointer if no such page exists.} */
2137 struct page *
2138 page_lookup (const void *address)
2139 @{
2140   struct page p;
2141   struct hash_elem *e;
2142
2143   p.addr = address;
2144   e = hash_find (&pages, &p.hash_elem);
2145   return e != NULL ? hash_entry (e, struct page, hash_elem) : NULL;
2146 @}
2147 @end example
2148
2149 @noindent
2150 @struct{page} is allocated as a local variable here on the assumption
2151 that it is fairly small.  Large structures should not be allocated as
2152 local variables.  @xref{struct thread}, for more information.
2153
2154 A similar function could delete a page by address using
2155 @func{hash_delete}.
2156
2157 @node Hash Auxiliary Data
2158 @subsection Auxiliary Data
2159
2160 In simple cases like the example above, there's no need for the
2161 @var{aux} parameters.  In these cases, just pass a null pointer to
2162 @func{hash_init} for @var{aux} and ignore the values passed to the hash
2163 function and comparison functions.  (You'll get a compiler warning if
2164 you don't use the @var{aux} parameter, but you can turn that off with
2165 the @code{UNUSED} macro, as shown in the example, or you can just ignore
2166 it.)
2167
2168 @var{aux} is useful when you have some property of the data in the
2169 hash table that's both constant and needed for hashing or comparisons,
2170 but which is not stored in the data items themselves.  For example, if
2171 the items in a hash table contain fixed-length strings, but the items
2172 themselves don't indicate what that fixed length is, you could pass
2173 the length as an @var{aux} parameter.
2174
2175 @node Hash Synchronization
2176 @subsection Synchronization
2177
2178 The hash table does not do any internal synchronization.  It is the
2179 caller's responsibility to synchronize calls to hash table functions.
2180 In general, any number of functions that examine but do not modify the
2181 hash table, such as @func{hash_find} or @func{hash_next}, may execute
2182 simultaneously.  However, these function cannot safely execute at the
2183 same time as any function that may modify a given hash table, such as
2184 @func{hash_insert} or @func{hash_delete}, nor may more than one function
2185 that can modify a given hash table execute safely at once.
2186
2187 It is also the caller's responsibility to synchronize access to data in
2188 hash table elements.  How to synchronize access to this data depends on
2189 how it is designed and organized, as with any other data structure.
2190