2 @appendix Reference Guide
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.
9 (Actually, the reference guide is currently incomplete.)
11 We recommend using ``tags'' to follow along with references to function
12 and variable names (@pxref{Tags}).
18 * Interrupt Handling::
28 This section covers the Pintos loader and basic kernel
33 * Kernel Initialization::
37 @subsection The Loader
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}.
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
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.
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.
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.
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.
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.
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.
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,
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
111 @node Kernel Initialization
112 @subsection Kernel Initialization
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.
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
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
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
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.
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.)
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.
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 (@xpref{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
173 In projects 2 and later, @func{main} also calls @func{tss_init} and
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}.
184 Now that interrupts are set up, we can start the scheduler
185 with @func{thread_start}, which creates the idle thread and enables
187 With interrupts enabled, interrupt-driven serial port I/O becomes
189 @func{serial_init_queue} to switch to that mode. Finally,
190 @func{timer_calibrate} calibrates the timer for accurate short delays.
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}.
196 Boot is complete, so we print a message.
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).
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.
217 @subsection @code{struct thread}
219 The main Pintos data structure for threads is @struct{thread},
220 declared in @file{threads/thread.h}.
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.
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:
233 4 kB +---------------------------------+
247 +---------------------------------+
253 0 kB +---------------------------------+
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.
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}).
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
278 @deftypecv {Member} {@struct{thread}} {enum thread_status} status
279 The thread's state, one of the following:
281 @defvr {Thread State} @code{THREAD_RUNNING}
282 The thread is running. Exactly one thread is running at a given time.
283 @func{thread_current} returns the running thread.
286 @defvr {Thread State} @code{THREAD_READY}
287 The thread is ready to run, but it's not running right now. The
288 thread could be selected to run the next time the scheduler is
289 invoked. Ready threads are kept in a doubly linked list called
293 @defvr {Thread State} @code{THREAD_BLOCKED}
294 The thread is waiting for something, e.g.@: a lock to become
295 available, an interrupt to be invoked. The thread won't be scheduled
296 again until it transitions to the @code{THREAD_READY} state with a
297 call to @func{thread_unblock}.
300 @defvr {Thread State} @code{THREAD_DYING}
301 The thread will be destroyed by the scheduler after switching to the
306 @deftypecv {Member} {@struct{thread}} {char} name[16]
307 The thread's name as a string, or at least the first few characters of
311 @deftypecv {Member} {@struct{thread}} {uint8_t *} stack
312 Every thread has its own stack to keep track of its state. When the
313 thread is running, the CPU's stack pointer register tracks the top of
314 the stack and this member is unused. But when the CPU switches to
315 another thread, this member saves the thread's stack pointer. No
316 other members are needed to save the thread's registers, because the
317 other registers that must be saved are saved on the stack.
319 When an interrupt occurs, whether in the kernel or a user program, an
320 @struct{intr_frame} is pushed onto the stack. When the interrupt occurs
321 in a user program, the @struct{intr_frame} is always at the very top of
322 the page. @xref{Interrupt Handling}, for more information.
325 @deftypecv {Member} {@struct{thread}} {int} priority
326 A thread priority, ranging from @code{PRI_MIN} (0) to @code{PRI_MAX}
327 (63). Lower numbers correspond to lower priorities, so that
328 priority 0 is the lowest priority and priority 63 is the highest.
329 Pintos as provided ignores thread priorities, but you will implement
330 priority scheduling in project 1 (@pxref{Priority Scheduling}).
333 @deftypecv {Member} {@struct{thread}} {@struct{list_elem}} elem
334 A ``list element'' used to put the thread into doubly linked lists,
335 either the list of threads ready to run or a list of threads waiting
336 on a semaphore. Take a look at @file{lib/kernel/list.h} for
337 information on how to use Pintos doubly linked lists.
340 @deftypecv {Member} {@struct{thread}} {uint32_t *} pagedir
341 Only present in project 2 and later.
344 @deftypecv {Member} {@struct{thread}} {unsigned} magic
345 Always set to @code{THREAD_MAGIC}, which is just a random number defined
346 in @file{threads/thread.c}, and used to detect stack overflow.
347 @func{thread_current} checks that the @code{magic} member of the running
348 thread's @struct{thread} is set to @code{THREAD_MAGIC}. Stack overflow
349 will normally change this value, triggering the assertion. For greatest
350 benefit, as you add members to @struct{thread}, leave @code{magic} as
354 @node Thread Functions
355 @subsection Thread Functions
357 @file{threads/thread.c} implements several public functions for thread
358 support. Let's take a look at the most useful:
360 @deftypefun void thread_init (void)
361 Called by @func{main} to initialize the thread system. Its main
362 purpose is to create a @struct{thread} for Pintos's initial thread.
363 This is possible because the Pintos loader puts the initial
364 thread's stack at the top of a page, in the same position as any other
367 Before @func{thread_init} runs,
368 @func{thread_current} will fail because the running thread's
369 @code{magic} value is incorrect. Lots of functions call
370 @func{thread_current} directly or indirectly, including
371 @func{lock_acquire} for locking a lock, so @func{thread_init} is
372 called early in Pintos initialization.
375 @deftypefun void thread_start (void)
376 Called by @func{main} to start the scheduler. Creates the idle
377 thread, that is, the thread that is scheduled when no other thread is
378 ready. Then enables interrupts, which as a side effect enables the
379 scheduler because the scheduler runs on return from the timer interrupt, using
380 @func{intr_yield_on_return} (@pxref{External Interrupt Handling}).
383 @deftypefun void thread_tick (void)
384 Called by the timer interrupt at each timer tick. It keeps track of
385 thread statistics and triggers the scheduler when a time slice expires.
388 @deftypefun void thread_print_stats (void)
389 Called during Pintos shutdown to print thread statistics.
392 @deftypefun tid_t thread_create (const char *@var{name}, int @var{priority}, thread_func *@var{func}, void *@var{aux})
393 Creates and starts a new thread named @var{name} with the given
394 @var{priority}, returning the new thread's tid. The thread executes
395 @var{func}, passing @var{aux} as the function's single argument.
397 @func{thread_create} allocates a page for the thread's
398 @struct{thread} and stack and initializes its members, then it sets
399 up a set of fake stack frames for it (more about this
400 later). The thread is initialized in the blocked state, so the final
401 action before returning is to unblock it, which allows the new thread to
405 @deftp {Type} {void thread_func (void *@var{aux})}
406 This is the type of a thread function. Its @var{aux} argument is the
407 value passed to @func{thread_create}.
410 @deftypefun void thread_block (void)
411 Transitions the running thread from the running state to the blocked
412 state. The thread will not run again until @func{thread_unblock} is
413 called on it, so you'd better have some way arranged for that to happen.
414 Because @func{thread_block} is so low-level, you should prefer to use
415 one of the synchronization primitives instead (@pxref{Synchronization}).
418 @deftypefun void thread_unblock (struct thread *@var{thread})
419 Transitions @var{thread}, which must be in the blocked state, to the
420 ready state, allowing it to resume running. This is called when the
421 event that the thread is waiting for occurs, e.g.@: when the lock that
422 the thread is waiting on becomes available.
425 @deftypefun {struct thread *} thread_current (void)
426 Returns the running thread.
429 @deftypefun {tid_t} thread_tid (void)
430 Returns the running thread's thread id. Equivalent to
431 @code{thread_current ()->tid}.
434 @deftypefun {const char *} thread_name (void)
435 Returns the running thread's name. Equivalent to @code{thread_current
439 @deftypefun void thread_exit (void) @code{NO_RETURN}
440 Causes the current thread to exit. Never returns, hence
441 @code{NO_RETURN} (@pxref{Function and Parameter Attributes}).
444 @deftypefun void thread_yield (void)
445 Yields the CPU to the scheduler, which picks a new thread to run. The
446 new thread might be the current thread, so you can't depend on this
447 function to keep this thread from running for any particular length of
451 @deftypefun int thread_get_priority (void)
452 @deftypefunx void thread_set_priority (int @var{new_priority})
453 Skeleton to set and get thread priority. @xref{Priority Scheduling}.
456 @deftypefun int thread_get_nice (void)
457 @deftypefunx void thread_set_nice (int @var{new_nice})
458 @deftypefunx int thread_get_recent_cpu (void)
459 @deftypefunx int thread_get_load_avg (void)
460 Skeletons for the advanced scheduler. @xref{4.4BSD Scheduler}.
463 @node Thread Switching
464 @subsection Thread Switching
466 @func{schedule} is the function responsible for switching threads. It
467 is internal to @file{threads/thread.c} and called only by the three
468 public thread functions that need to switch threads:
469 @func{thread_block}, @func{thread_exit}, and @func{thread_yield}.
470 Before any of these functions call @func{schedule}, they disable
471 interrupts (or ensure that they are already disabled) and then change
472 the running thread's state to something other than running.
474 @func{schedule} is simple but tricky. It records the
475 current thread in local variable @var{cur}, determines the next thread
476 to run as local variable @var{next} (by calling
477 @func{next_thread_to_run}), and then calls @func{switch_threads} to do
478 the actual thread switch. The thread we switched to was also running
479 inside @func{switch_threads}, as are all the threads not currently
480 running, so the new thread now returns out of
481 @func{switch_threads}, returning the previously running thread.
483 @func{switch_threads} is an assembly language routine in
484 @file{threads/switch.S}. It saves registers on the stack, saves the
485 CPU's current stack pointer in the current @struct{thread}'s @code{stack}
486 member, restores the new thread's @code{stack} into the CPU's stack
487 pointer, restores registers from the stack, and returns.
489 The rest of the scheduler is implemented as @func{schedule_tail}. It
490 marks the new thread as running. If the thread we just switched from
491 is in the dying state, then it also frees the page that contained the
492 dying thread's @struct{thread} and stack. These couldn't be freed
493 prior to the thread switch because the switch needed to use it.
495 Running a thread for the first time is a special case. When
496 @func{thread_create} creates a new thread, it goes through a fair
497 amount of trouble to get it started properly. In particular, a new
498 thread hasn't started running yet, so there's no way for it to be
499 running inside @func{switch_threads} as the scheduler expects. To
500 solve the problem, @func{thread_create} creates some fake stack frames
501 in the new thread's stack:
505 The topmost fake stack frame is for @func{switch_threads}, represented
506 by @struct{switch_threads_frame}. The important part of this frame is
507 its @code{eip} member, the return address. We point @code{eip} to
508 @func{switch_entry}, indicating it to be the function that called
512 The next fake stack frame is for @func{switch_entry}, an assembly
513 language routine in @file{threads/switch.S} that adjusts the stack
514 pointer,@footnote{This is because @func{switch_threads} takes
515 arguments on the stack and the 80@var{x}86 SVR4 calling convention
516 requires the caller, not the called function, to remove them when the
517 call is complete. See @bibref{SysV-i386} chapter 3 for details.}
518 calls @func{schedule_tail} (this special case is why
519 @func{schedule_tail} is separate from @func{schedule}), and returns.
520 We fill in its stack frame so that it returns into
521 @func{kernel_thread}, a function in @file{threads/thread.c}.
524 The final stack frame is for @func{kernel_thread}, which enables
525 interrupts and calls the thread's function (the function passed to
526 @func{thread_create}). If the thread's function returns, it calls
527 @func{thread_exit} to terminate the thread.
530 @node Synchronization
531 @section Synchronization
533 If sharing of resources between threads is not handled in a careful,
534 controlled fashion, then the result is usually a big mess.
535 This is especially the case in operating system kernels, where
536 faulty sharing can crash the entire machine. Pintos provides several
537 synchronization primitives to help out.
540 * Disabling Interrupts::
543 * Condition Variables::
547 @node Disabling Interrupts
548 @subsection Disabling Interrupts
550 The crudest way to do synchronization is to disable interrupts, that
551 is, to temporarily prevent the CPU from responding to interrupts. If
552 interrupts are off, no other thread will preempt the running thread,
553 because thread preemption is driven by the timer interrupt. If
554 interrupts are on, as they normally are, then the running thread may
555 be preempted by another at any time, whether between two C statements
556 or even within the execution of one.
558 Incidentally, this means that Pintos is a ``preemptible kernel,'' that
559 is, kernel threads can be preempted at any time. Traditional Unix
560 systems are ``nonpreemptible,'' that is, kernel threads can only be
561 preempted at points where they explicitly call into the scheduler.
562 (User programs can be preempted at any time in both models.) As you
563 might imagine, preemptible kernels require more explicit
566 You should have little need to set the interrupt state directly. Most
567 of the time you should use the other synchronization primitives
568 described in the following sections. The main reason to disable
569 interrupts is to synchronize kernel threads with external interrupt
570 handlers, which cannot sleep and thus cannot use most other forms of
571 synchronization (@pxref{External Interrupt Handling}).
573 Types and functions for disabling and enabling interrupts are in
574 @file{threads/interrupt.h}.
576 @deftp Type {enum intr_level}
577 One of @code{INTR_OFF} or @code{INTR_ON}, denoting that interrupts are
578 disabled or enabled, respectively.
581 @deftypefun {enum intr_level} intr_get_level (void)
582 Returns the current interrupt state.
585 @deftypefun {enum intr_level} intr_set_level (enum intr_level @var{level})
586 Turns interrupts on or off according to @var{level}. Returns the
587 previous interrupt state.
590 @deftypefun {enum intr_level} intr_enable (void)
591 Turns interrupts on. Returns the previous interrupt state.
594 @deftypefun {enum intr_level} intr_disable (void)
595 Turns interrupts off. Returns the previous interrupt state.
599 @subsection Semaphores
601 Pintos' semaphore type and operations are declared in
602 @file{threads/synch.h}.
604 @deftp {Type} {struct semaphore}
605 Represents a @dfn{semaphore}, a nonnegative integer together with two
606 operators that manipulate it atomically, which are:
610 ``Down'' or ``P'': wait for the value to become positive, then
614 ``Up'' or ``V'': increment the value (and wake up one waiting thread,
618 A semaphore initialized to 0 may be used to wait for an event
619 that will happen exactly once. For example, suppose thread @var{A}
620 starts another thread @var{B} and wants to wait for @var{B} to signal
621 that some activity is complete. @var{A} can create a semaphore
622 initialized to 0, pass it to @var{B} as it starts it, and then
623 ``down'' the semaphore. When @var{B} finishes its activity, it
624 ``ups'' the semaphore. This works regardless of whether @var{A}
625 ``downs'' the semaphore or @var{B} ``ups'' it first.
627 A semaphore initialized to 1 is typically used for controlling access
628 to a resource. Before a block of code starts using the resource, it
629 ``downs'' the semaphore, then after it is done with the resource it
630 ``ups'' the resource. In such a case a lock, described below, may be
633 Semaphores can also be initialized to values larger than 1. These are
637 @deftypefun void sema_init (struct semaphore *@var{sema}, unsigned @var{value})
638 Initializes @var{sema} as a new semaphore with the given initial
642 @deftypefun void sema_down (struct semaphore *@var{sema})
643 Executes the ``down'' or ``P'' operation on @var{sema}, waiting for
644 its value to become positive and then decrementing it by one.
647 @deftypefun bool sema_try_down (struct semaphore *@var{sema})
648 Tries to execute the ``down'' or ``P'' operation on @var{sema},
649 without waiting. Returns true if @var{sema} had a positive value
650 that was successfully decremented, or false if it was already
651 zero and thus could not be decremented. Calling this function in a
652 tight loop wastes CPU time (use @func{sema_down} instead, or find a
656 @deftypefun void sema_up (struct semaphore *@var{sema})
657 Executes the ``up'' or ``V'' operation on @var{sema},
658 incrementing its value. If any threads are waiting on
659 @var{sema}, wakes one of them up.
662 Semaphores are internally built out of disabling interrupt
663 (@pxref{Disabling Interrupts}) and thread blocking and unblocking
664 (@func{thread_block} and @func{thread_unblock}). Each semaphore maintains
665 a list of waiting threads, using the linked list
666 implementation in @file{lib/kernel/list.c}.
671 Lock types and functions are declared in @file{threads/synch.h}.
673 @deftp {Type} {struct lock}
674 Represents a @dfn{lock}, a specialized semaphore with an initial value
675 of 1 (@pxref{Semaphores}). The difference between a lock and such a
676 semaphore is twofold. First, a semaphore does not have an owner,
677 meaning that one thread can ``down'' the semaphore and then another one
678 ``up'' it, but a single thread must both acquire and release a lock.
679 Second, a semaphore can have a value greater than 1, but a lock can only
680 be owned by a single thread at a time. If these restrictions prove
681 onerous, it's a good sign that a semaphore should be used, instead of a
684 Locks in Pintos are not ``recursive,'' that is, it is an error for the
685 thread currently holding a lock to try to acquire that lock.
688 @deftypefun void lock_init (struct lock *@var{lock})
689 Initializes @var{lock} as a new lock.
692 @deftypefun void lock_acquire (struct lock *@var{lock})
693 Acquires @var{lock} for use by the current thread, first waiting for
694 any current owner to release it if necessary.
697 @deftypefun bool lock_try_acquire (struct lock *@var{lock})
698 Tries to acquire @var{lock} for use by the current thread, without
699 waiting. Returns true if successful, false if the lock is already
700 owned. Calling this function in a tight loop is a bad idea because it
701 wastes CPU time (use @func{lock_acquire} instead).
704 @deftypefun void lock_release (struct lock *@var{lock})
705 Releases @var{lock}, which the current thread must own.
708 @deftypefun bool lock_held_by_current_thread (const struct lock *@var{lock})
709 Returns true if the running thread owns @var{lock},
713 @node Condition Variables
714 @subsection Condition Variables
716 Condition variable types and functions are declared in
717 @file{threads/synch.h}.
719 @deftp {Type} {struct condition}
720 Represents a condition variable, which allows one piece of code to
722 and cooperating code to receive the signal and act upon it. Each
723 condition variable is associated with a lock. A given condition
724 variable is associated with only a single lock, but one lock may be
725 associated with any number of condition variables. A set of condition
726 variables taken together with their lock is called a ``monitor.''
728 A thread that owns the monitor lock is said to be ``in the monitor.''
729 The thread in the monitor has control over all the data protected by
730 the lock. It may freely examine or modify this data. If it discovers
731 that it needs to wait for some condition to become true, then it
732 ``waits'' on the associated condition, which releases the lock and
733 waits for the condition to be signaled. If, on the other hand, it has
734 caused one of these conditions to become true, it ``signals'' the
735 condition to wake up one waiter, or ``broadcasts'' the condition to
738 Pintos monitors are ``Mesa'' style, not
739 ``Hoare'' style. That is, sending and receiving a signal are not an
740 atomic operation. Thus, typically the caller must recheck the
741 condition after the wait completes and, if necessary, wait again.
744 @deftypefun void cond_init (struct condition *@var{cond})
745 Initializes @var{cond} as a new condition variable.
748 @deftypefun void cond_wait (struct condition *@var{cond}, struct lock *@var{lock})
749 Atomically releases @var{lock} (the monitor lock) and waits for
750 @var{cond} to be signaled by some other piece of code. After
751 @var{cond} is signaled, reacquires @var{lock} before returning.
752 @var{lock} must be held before calling this function.
755 @deftypefun void cond_signal (struct condition *@var{cond}, struct lock *@var{lock})
756 If any threads are waiting on @var{cond} (protected by monitor lock
757 @var{lock}), then this function wakes up one of them. If no threads are
758 waiting, returns without performing any action.
759 @var{lock} must be held before calling this function.
762 @deftypefun void cond_broadcast (struct condition *@var{cond}, struct lock *@var{lock})
763 Wakes up all threads, if any, waiting on @var{cond} (protected by
764 monitor lock @var{lock}). @var{lock} must be held before calling this
768 @subsubsection Monitor Example
770 The classical example of a monitor is handling a buffer into which one
771 ``producer'' thread writes characters and out of which a second
772 ``consumer'' thread reads characters. To implement this case we need,
773 besides the monitor lock, two condition variables which we will call
774 @var{not_full} and @var{not_empty}:
777 char buf[BUF_SIZE]; /* @r{Buffer.} */
778 size_t n = 0; /* @r{0 <= n <= @var{BUF_SIZE}: # of characters in buffer.} */
779 size_t head = 0; /* @r{@var{buf} index of next char to write (mod @var{BUF_SIZE}).} */
780 size_t tail = 0; /* @r{@var{buf} index of next char to read (mod @var{BUF_SIZE}).} */
781 struct lock lock; /* @r{Monitor lock.} */
782 struct condition not_empty; /* @r{Signaled when the buffer is not empty.} */
783 struct condition not_full; /* @r{Signaled when the buffer is not full.} */
785 @dots{}@r{initialize the locks and condition variables}@dots{}
787 void put (char ch) @{
788 lock_acquire (&lock);
789 while (n == BUF_SIZE) /* @r{Can't add to @var{buf} as long as it's full.} */
790 cond_wait (¬_full, &lock);
791 buf[head++ % BUF_SIZE] = ch; /* @r{Add @var{ch} to @var{buf}.} */
793 cond_signal (¬_empty, &lock); /* @r{@var{buf} can't be empty anymore.} */
794 lock_release (&lock);
799 lock_acquire (&lock);
800 while (n == 0) /* @r{Can't read @var{buf} as long as it's empty.} */
801 cond_wait (¬_empty, &lock);
802 ch = buf[tail++ % BUF_SIZE]; /* @r{Get @var{ch} from @var{buf}.} */
804 cond_signal (¬_full, &lock); /* @r{@var{buf} can't be full anymore.} */
805 lock_release (&lock);
809 @node Memory Barriers
810 @subsection Memory Barriers
812 Suppose we add a ``feature'' that, whenever a timer interrupt
813 occurs, the character in global variable @code{timer_put_char} is
814 printed on the console, but only if global Boolean variable
815 @code{timer_do_put} is true.
817 If interrupts are enabled, this code for setting up @samp{x} to be
818 printed is clearly incorrect, because the timer interrupt could intervene
819 between the two assignments:
822 timer_do_put = true; /* INCORRECT CODE */
823 timer_put_char = 'x';
826 It might not be as obvious that the following code is just as
830 timer_put_char = 'x'; /* INCORRECT CODE */
834 The reason this second example might be a problem is that the compiler
835 is, in general, free to reorder operations when it doesn't have a
836 visible reason to keep them in the same order. In this case, the
837 compiler doesn't know that the order of assignments is important, so its
838 optimization pass is permitted to exchange their order.
839 There's no telling whether it will actually do this, and it is possible
840 that passing the compiler different optimization flags or changing
841 compiler versions will produce different behavior.
843 The following is @emph{not} a solution, because locks neither prevent
844 interrupts nor prevent the compiler from reordering the code within the
845 region where the lock is held:
848 lock_acquire (&timer_lock); /* INCORRECT CODE */
849 timer_put_char = 'x';
851 lock_release (&timer_lock);
854 Fortunately, real solutions do exist. One possibility is to
855 disable interrupts around the assignments. This does not prevent
856 reordering, but it makes the assignments atomic as observed by the
857 interrupt handler. It also has the extra runtime cost of disabling and
858 re-enabling interrupts:
861 enum intr_level old_level = intr_disable ();
862 timer_put_char = 'x';
864 intr_set_level (old_level);
867 A second possibility is to mark the declarations of
868 @code{timer_put_char} and @code{timer_do_put} as @samp{volatile}. This
869 keyword tells the compiler that the variables are externally observable
870 and restricts its latitude for optimization. However, the semantics of
871 @samp{volatile} are not well-defined, so it is not a good general
874 Usually, the best solution is to use a compiler feature called a
875 @dfn{memory barrier}, a special statement that prevents the compiler
876 from reordering memory operations across the barrier. In Pintos,
877 @file{threads/synch.h} defines the @code{barrier()} macro as a memory
878 barrier. Here's how we would use a memory barrier to fix this code:
881 timer_put_char = 'x';
886 The compiler also treats invocation of any function defined externally,
887 that is, in another source file, as a limited form of a memory barrier.
888 Specifically, the compiler assumes that any externally defined function
889 may access any statically or dynamically allocated data and any local
890 variable whose address is taken. This often means that explicit
891 barriers can be omitted, and, indeed, this is why the base Pintos code
892 does not need any barriers.
894 A function defined in the same source file, or in a header included by
895 the source file, cannot be relied upon as a memory barrier.
896 This applies even to invocation of a function before its
897 definition, because the compiler may read and parse the entire source
898 file before performing optimization.
900 @node Interrupt Handling
901 @section Interrupt Handling
903 An @dfn{interrupt} notifies the CPU of some event. Much of the work
904 of an operating system relates to interrupts in one way or another.
905 For our purposes, we classify interrupts into two broad categories:
909 @dfn{External interrupts}, that is, interrupts originating outside the
910 CPU. These interrupts come from hardware devices such as the system
911 timer, keyboard, serial ports, and disks. External interrupts are
912 @dfn{asynchronous}, meaning that their delivery is not
913 synchronized with normal CPU activities. External interrupts
914 are what @func{intr_disable} and related functions
915 postpone (@pxref{Disabling Interrupts}).
918 @dfn{Internal interrupts}, that is, interrupts caused by something
919 executing on the CPU. These interrupts are caused by something
920 unusual happening during instruction execution: accessing invalid
921 memory (a @dfn{page fault}), executing invalid instructions, and
922 various other disallowed activities. Because they are caused by CPU
923 instructions, internal interrupts are @dfn{synchronous} or
924 synchronized with CPU instructions. @func{intr_disable} does not
925 disable internal interrupts.
928 Because the CPU treats all interrupts largely the same way, regardless
929 of source, Pintos uses the same infrastructure for both internal and
930 external interrupts, to a point. The following section describes this
931 common infrastructure, and sections after that give the specifics of
932 external and internal interrupts.
934 If you haven't already read chapter 3, ``Basic Execution Environment,''
935 in @bibref{IA32-v1}, it is recommended that you do so now. You might
936 also want to skim chapter 5, ``Interrupt and Exception Handling,'' in
940 * Interrupt Infrastructure::
941 * Internal Interrupt Handling::
942 * External Interrupt Handling::
945 @node Interrupt Infrastructure
946 @subsection Interrupt Infrastructure
948 When an interrupt occurs while the kernel is running, the CPU saves
949 its most essential state on the stack and jumps to an interrupt
950 handler routine. The 80@var{x}86 architecture allows for 256 possible
951 interrupts, each of which can have its own handler. The handler for
952 each interrupt is defined in an array called the @dfn{interrupt
953 descriptor table} or IDT.
955 In Pintos, @func{intr_init} in @file{threads/interrupt.c} sets up the
956 IDT so that each entry points to a unique entry point in
957 @file{threads/intr-stubs.S} named @func{intr@var{NN}_stub}, where
958 @var{NN} is the interrupt number in
959 hexadecimal. Because the CPU doesn't give
960 us any other way to find out the interrupt number, this entry point
961 pushes the interrupt number on the stack. Then it jumps to
962 @func{intr_entry}, which pushes all the registers that the processor
963 didn't already save for us, and then calls @func{intr_handler}, which
964 brings us back into C in @file{threads/interrupt.c}.
966 The main job of @func{intr_handler} is to call any function that has
967 been registered for handling the particular interrupt. (If no
968 function is registered, it dumps some information to the console and
969 panics.) It does some extra processing for external
970 interrupts that we'll discuss later.
972 When @func{intr_handler} returns, the assembly code in
973 @file{threads/intr-stubs.S} restores all the CPU registers saved
974 earlier and directs the CPU to return from the interrupt.
976 A few types and functions apply to both internal and external
979 @deftp {Type} {void intr_handler_func (struct intr_frame *@var{frame})}
980 This is how an interrupt handler function must be declared. Its @var{frame}
981 argument (see below) allows it to determine the cause of the interrupt
982 and the state of the thread that was interrupted.
985 @deftp {Type} {struct intr_frame}
986 The stack frame of an interrupt handler, as saved by CPU, the interrupt
987 stubs, and @func{intr_entry}. Its most interesting members are described
991 @deftypecv {Member} {@struct{intr_frame}} uint32_t edi
992 @deftypecvx {Member} {@struct{intr_frame}} uint32_t esi
993 @deftypecvx {Member} {@struct{intr_frame}} uint32_t ebp
994 @deftypecvx {Member} {@struct{intr_frame}} uint32_t esp_dummy
995 @deftypecvx {Member} {@struct{intr_frame}} uint32_t ebx
996 @deftypecvx {Member} {@struct{intr_frame}} uint32_t edx
997 @deftypecvx {Member} {@struct{intr_frame}} uint32_t ecx
998 @deftypecvx {Member} {@struct{intr_frame}} uint32_t eax
999 @deftypecvx {Member} {@struct{intr_frame}} uint16_t es
1000 @deftypecvx {Member} {@struct{intr_frame}} uint16_t ds
1001 Register values in the interrupted thread saved by @func{intr_entry}.
1002 The @code{esp_dummy} value isn't actually used (refer to the
1003 description of @code{PUSHA} in @bibref{IA32-v2b} for details).
1006 @deftypecv {Member} {@struct{intr_frame}} uint32_t vec_no
1007 The interrupt vector number, ranging from 0 to 255.
1010 @deftypecv {Member} {@struct{intr_frame}} uint32_t error_code
1011 The ``error code'' pushed on the stack by the CPU for some internal
1015 @deftypecv {Member} {@struct{intr_frame}} void (*eip) (void)
1016 The address of the next instruction to be executed by the interrupted
1020 @deftypecv {Member} {@struct{intr_frame}} {void *} esp
1021 The interrupted thread's stack pointer.
1024 @deftypefun {const char *} intr_name (uint8_t @var{vec})
1025 Returns the name of the interrupt numbered @var{vec}, or
1026 @code{"unknown"} if the interrupt has no registered name.
1029 @node Internal Interrupt Handling
1030 @subsection Internal Interrupt Handling
1032 When an internal interrupt occurs, it is because the running kernel
1033 thread (or, starting from project 2, the running user process) has
1034 caused it. Thus, because it is related to a thread (or process), an
1035 internal interrupt is said to happen in a ``process context.''
1037 In an internal interrupt, it can make sense to examine the
1038 @struct{intr_frame} passed to the interrupt handler, or even to modify
1039 it. When the interrupt returns, modified members
1040 in @struct{intr_frame} become changes to the thread's registers.
1041 We'll use this in project 2 to return values from system call
1044 There are no special restrictions on what an internal interrupt
1045 handler can or can't do. Generally they should run with interrupts
1046 enabled, just like other code, and so they can be preempted by other
1047 kernel threads. Thus, they do need to synchronize with other threads
1048 on shared data and other resources (@pxref{Synchronization}).
1050 @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})
1051 Registers @var{handler} to be called when internal interrupt numbered
1052 @var{vec} is triggered. Names the interrupt @var{name} for debugging
1055 If @var{level} is @code{INTR_OFF} then handling of further interrupts
1056 will be disabled while the interrupt is being processed. Interrupts
1057 should normally be turned on during the handling of an internal
1060 @var{dpl} determines how the interrupt can be
1061 invoked. If @var{dpl} is 0, then the interrupt can be invoked only by
1062 kernel threads. Otherwise @var{dpl} should be 3, which allows user
1063 processes to invoke the interrupt as well (this is useful only
1064 starting with project 2).
1067 @node External Interrupt Handling
1068 @subsection External Interrupt Handling
1070 Whereas an internal interrupt runs in the context of the thread that
1071 caused it, external interrupts do not have any predictable context.
1072 They are asynchronous, so they can be invoked at any time that
1073 interrupts have not been disabled. We say that an external interrupt
1074 runs in an ``interrupt context.''
1076 In an external interrupt, the @struct{intr_frame} passed to the
1077 handler is not very meaningful. It describes the state of the thread
1078 or process that was interrupted, but there is no way to predict which
1079 one that is. It is possible, although rarely useful, to examine it, but
1080 modifying it is a recipe for disaster.
1082 The activities of an external interrupt handler are severely
1083 restricted. First, only one external interrupt may be processed at a
1084 time, that is, nested external interrupt handling is not supported.
1085 This means that external interrupts must be processed with interrupts
1086 disabled (@pxref{Disabling Interrupts}) and that interrupts may not be
1087 enabled at any point during their execution.
1089 Second, an interrupt handler must not call any function that can
1090 sleep, which rules out @func{thread_yield}, @func{lock_acquire}, and
1091 many others. This is because external interrupts use space on the
1092 stack of the kernel thread that was running at the time the interrupt
1093 occurred. If the interrupt handler slept, it would effectively put that
1094 thread to sleep too until the interrupt handler resumed control and
1097 Because an external interrupt runs with interrupts disabled, it
1098 effectively monopolizes the machine and delays all other activities.
1099 Therefore, external interrupt handlers should complete as quickly as
1100 they can. Any activities that require much CPU time should instead
1101 run in a kernel thread, possibly a thread whose activity is triggered
1102 by the interrupt using some synchronization primitive.
1104 External interrupts are also special because they are controlled by a
1105 pair of devices outside the CPU called @dfn{programmable interrupt
1106 controllers}, @dfn{PICs} for short. When @func{intr_init} sets up the
1107 CPU's IDT, it also initializes the PICs for interrupt handling. The
1108 PICs also must be ``acknowledged'' at the end of processing for each
1109 external interrupt. @func{intr_handler} takes care of that by calling
1110 @func{pic_end_of_interrupt}, which sends the proper signals to the
1113 The following additional functions are related to external
1116 @deftypefun void intr_register_ext (uint8_t @var{vec}, intr_handler_func *@var{handler}, const char *@var{name})
1117 Registers @var{handler} to be called when external interrupt numbered
1118 @var{vec} is triggered. Names the interrupt @var{name} for debugging
1119 purposes. The handler will run with interrupts disabled.
1122 @deftypefun bool intr_context (void)
1123 Returns true if we are running in an interrupt context, otherwise
1124 false. Mainly used at the beginning of functions that might sleep
1125 or that otherwise should not be called from interrupt context, in this
1128 ASSERT (!intr_context ());
1132 @deftypefun void intr_yield_on_return (void)
1133 When called in an interrupt context, causes @func{thread_yield} to be
1134 called just before the interrupt returns. This is used, for example,
1135 in the timer interrupt handler to cause a new thread to be scheduled
1136 when a thread's time slice expires.
1139 @node Memory Allocation
1140 @section Memory Allocation
1142 Pintos contains two memory allocators, one that allocates memory in
1143 units of a page, and one that can allocate blocks of any size.
1150 @node Page Allocator
1151 @subsection Page Allocator
1153 The page allocator declared in @file{threads/palloc.h} allocates
1154 memory in units of a page. It is most often used to allocate memory
1155 one page at a time, but it can also allocate multiple contiguous pages
1158 The page allocator divides the memory it allocates into two pools,
1159 called the kernel and user pools. By default, each pool gets half of
1160 system memory, but this can be changed with a kernel command line
1161 option (@pxref{Why PAL_USER?}). An allocation request draws from one
1162 pool or the other. If one pool becomes empty, the other may still
1163 have free pages. The user pool should be used for allocating memory
1164 for user processes and the kernel pool for all other allocations.
1165 This will only become important starting with project 3. Until then,
1166 all allocations should be made from the kernel pool.
1168 Each pool's usage is tracked with a bitmap, one bit per page in
1169 the pool. A request to allocate @var{n} pages scans the bitmap
1170 for @var{n} consecutive bits set to
1171 false, indicating that those pages are free, and then sets those bits
1172 to true to mark them as used. This is a ``first fit'' allocation
1175 The page allocator is subject to fragmentation. That is, it may not
1176 be possible to allocate @var{n} contiguous pages even though @var{n}
1177 or more pages are free, because the free pages are separated by used
1178 pages. In fact, in pathological cases it may be impossible to
1179 allocate 2 contiguous pages even though @var{n} / 2 pages are free!
1180 Single-page requests can't fail due to fragmentation, so
1181 it is best to limit, as much as possible, the need for multiple
1184 Pages may not be allocated from interrupt context, but they may be
1187 When a page is freed, all of its bytes are cleared to @t{0xcc}, as
1188 a debugging aid (@pxref{Debugging Tips}).
1190 Page allocator types and functions are described below.
1192 @deftp {Type} {enum palloc_flags}
1193 A set of flags that describe how to allocate pages. These flags may
1194 be combined in any combination.
1197 @defvr {Page Allocator Flag} @code{PAL_ASSERT}
1198 If the pages cannot be allocated, panic the kernel. This is only
1199 appropriate during kernel initialization. User processes
1200 should never be permitted to panic the kernel.
1203 @defvr {Page Allocator Flag} @code{PAL_ZERO}
1204 Zero all the bytes in the allocated pages before returning them. If not
1205 set, the contents of newly allocated pages are unpredictable.
1208 @defvr {Page Allocator Flag} @code{PAL_USER}
1209 Obtain the pages from the user pool. If not set, pages are allocated
1210 from the kernel pool.
1213 @deftypefun {void *} palloc_get_page (enum palloc_flags @var{flags})
1214 Obtains and returns a single page, allocating it in the manner specified by
1215 @var{flags}. Returns a null pointer if no pages are
1219 @deftypefun {void *} palloc_get_multiple (enum palloc_flags @var{flags}, size_t @var{page_cnt})
1220 Obtains @var{page_cnt} contiguous free pages, allocating them in the
1221 manner specified by @var{flags}, and returns them. Returns a null
1222 pointer if no pages are free.
1225 @deftypefun void palloc_free_page (void *@var{page})
1226 Frees @var{page}, which must have been obtained using
1227 @func{palloc_get_page} or @func{palloc_get_multiple}.
1230 @deftypefun void palloc_free_multiple (void *@var{pages}, size_t @var{page_cnt})
1231 Frees the @var{page_cnt} contiguous pages starting at @var{pages}.
1232 All of the pages must have been obtained using @func{palloc_get_page}
1233 or @func{palloc_get_multiple}.
1236 @node Block Allocator
1237 @subsection Block Allocator
1239 The block allocator, declared in @file{threads/malloc.h}, can allocate
1240 blocks of any size. It is layered on top of the page allocator
1241 described in the previous section. Blocks returned by the block
1242 allocator are obtained from the kernel pool.
1244 The block allocator uses two different strategies for allocating
1245 memory. The first of these applies to ``small'' blocks, those 1 kB or
1247 fourth of the page size). These allocations are rounded up to the
1248 nearest power of 2, or 16 bytes, whichever is larger. Then they are
1249 grouped into a page used only for allocations of the smae
1252 The second strategy applies to allocating ``large'' blocks, those larger
1254 These allocations (plus a small amount of overhead) are rounded up to
1255 the nearest page in size, and then the block allocator requests that
1256 number of contiguous pages from the page allocator.
1258 In either case, the difference between the allocation requested size
1259 and the actual block size is wasted. A real operating system would
1260 carefully tune its allocator to minimize this waste, but this is
1261 unimportant in an instructional system like Pintos.
1263 As long as a page can be obtained from the page allocator, small
1264 allocations always succeed. Most small allocations will not require a
1265 new page from the page allocator at all. However, large allocations
1266 always require calling into the page allocator, and any allocation
1267 that needs more than one contiguous page can fail due to fragmentation,
1268 as already discussed in the previous section. Thus, you should
1269 minimize the number of large allocations in your code, especially
1270 those over approximately 4 kB each.
1272 The interface to the block allocator is through the standard C library
1273 functions @func{malloc}, @func{calloc}, and @func{free}.
1275 When a block is freed, all of its bytes are cleared to @t{0xcc}, as
1276 a debugging aid (@pxref{Debugging Tips}).
1278 The block allocator may not be called from interrupt context.
1280 @node Virtual Addresses
1281 @section Virtual Addresses
1283 A 32-bit virtual address can be divided into a 20-bit @dfn{page number}
1284 and a 12-bit @dfn{page offset} (or just @dfn{offset}), like this:
1289 +-------------------+-----------+
1290 | Page Number | Offset |
1291 +-------------------+-----------+
1296 Header @file{threads/vaddr.h} defines these functions and macros for
1297 working with virtual addresses:
1301 The bit index (0) and number of bits (12) in the offset part of a
1302 virtual address, respectively.
1306 A bit mask with value @t{0xfff}, so that the bits in the page offset are
1307 set to 1 and other bits set to 0.
1311 The page size in bytes (4096).
1314 @deftypefun unsigned pg_ofs (const void *@var{va})
1315 Extracts and returns the page offset in virtual address @var{va}.
1318 @deftypefun uintptr_t pg_no (const void *@var{va})
1319 Extracts and returns the page number in virtual address @var{va}.
1322 @deftypefun {void *} pg_round_down (const void *@var{va})
1323 Returns the start of the virtual page that @var{va} points within, that
1324 is, @var{va} with the page offset set to 0.
1327 @deftypefun {void *} pg_round_up (const void *@var{va})
1328 Returns @var{va} rounded up to the nearest page boundary.
1331 Virtual memory in Pintos is divided into two regions: user virtual
1332 memory and kernel virtual memory. The boundary between them is
1336 Base address of kernel virtual memory. It defaults to @t{0xc0000000} (3
1337 GB), but it may be changed to any multiple of @t{0x10000000} from
1338 @t{0x80000000} to @t{0xf0000000}.
1340 User virtual memory ranges from virtual address 0 up to
1341 @code{PHYS_BASE}. Kernel virtual memory occupies the rest of the
1342 virtual address space, from @code{PHYS_BASE} up to 4 GB.
1345 @deftypefun {bool} is_user_vaddr (const void *@var{va})
1346 @deftypefunx {bool} is_kernel_vaddr (const void *@var{va})
1347 Returns true if @var{va} is a user or kernel virtual address,
1348 respectively, false otherwise.
1351 The 80@var{x}86 doesn't provide any way to directly access memory given
1352 a physical address. This ability is often necessary in an operating
1353 system kernel, so Pintos works around it by mapping kernel virtual
1354 memory one-to-one to physical memory. That is, virtual address
1355 @code{PHYS_BASE} accesses physical address 0, virtual address
1356 @code{PHYS_BASE} + @t{0x1234} accesses physical address @t{0x1234}, and
1357 so on up to the size of the machine's physical memory. Thus, adding
1358 @code{PHYS_BASE} to a physical address obtains a kernel virtual address
1359 that accesses that address; conversely, subtracting @code{PHYS_BASE}
1360 from a kernel virtual address obtains the corresponding physical
1361 address. Header @file{threads/vaddr.h} provides a pair of functions to
1362 do these translations:
1364 @deftypefun {void *} ptov (uintptr_t @var{pa})
1365 Returns the kernel virtual address corresponding to physical address
1366 @var{pa}, which should be between 0 and the number of bytes of physical
1370 @deftypefun {uintptr_t} vtop (void *@var{va})
1371 Returns the physical address corresponding to @var{va}, which must be a
1372 kernel virtual address.
1378 The code in @file{pagedir.c} is an abstract interface to the 80@var{x}86
1379 hardware page table, also called a ``page directory'' by Intel processor
1380 documentation. The page table interface uses a @code{uint32_t *} to
1381 represent a page table because this is convenient for accessing their
1384 The sections below describe the page table interface and internals.
1387 * Page Table Creation Destruction Activation::
1388 * Page Tables Inspection and Updates::
1389 * Page Table Accessed and Dirty Bits::
1390 * Page Table Details::
1393 @node Page Table Creation Destruction Activation
1394 @subsection Creation, Destruction, and Activation
1396 These functions create, destroy, and activate page tables. The base
1397 Pintos code already calls these functions where necessary, so it should
1398 not be necessary to call them yourself.
1400 @deftypefun {uint32_t *} pagedir_create (void)
1401 Creates and returns a new page table. The new page table contains
1402 Pintos's normal kernel virtual page mappings, but no user virtual
1405 Returns a null pointer if memory cannot be obtained.
1408 @deftypefun void pagedir_destroy (uint32_t *@var{pd})
1409 Frees all of the resources held by @var{pd}, including the page table
1410 itself and the frames that it maps.
1413 @deftypefun void pagedir_activate (uint32_t *@var{pd})
1414 Activates @var{pd}. The active page table is the one used by the CPU to
1415 translate memory references.
1418 @node Page Tables Inspection and Updates
1419 @subsection Inspection and Updates
1421 These functions examine or update the mappings from pages to frames
1422 encapsulated by a page table. They work on both active and inactive
1423 page tables (that is, those for running and suspended processes),
1424 flushing the TLB as necessary.
1426 User page parameters (@var{upage})to these functions should be user
1427 virtual addresses. Kernel page parameters (@var{kpage}) should be
1428 kernel virtual addresses and should have been obtained from the user
1429 pool with @code{palloc_get_page(PAL_USER)} (@pxref{Why PAL_USER?}).
1431 @deftypefun bool pagedir_set_page (uint32_t *@var{pd}, void *@var{upage}, void *@var{kpage}, bool @var{writable})
1432 Adds to @var{pd} a mapping from page @var{upage} to the frame identified
1433 by kernel virtual address @var{kpage}. If @var{writable} is true, the
1434 page is mapped read/write; otherwise, it is mapped read-only.
1436 Page @var{upage} must not already be mapped. If it is, the kernel
1439 Returns true if successful, false on failure. Failure will occur if
1440 additional memory required for the page table cannot be obtained.
1443 @deftypefun {void *} pagedir_get_page (uint32_t *@var{pd}, const void *@var{uaddr})
1444 Looks up the frame mapped to @var{upage} in @var{pd}. Returns the
1445 kernel virtual address for that frame, if @var{upage} is mapped, or a
1446 null pointer if it is not.
1449 @deftypefun void pagedir_clear_page (uint32_t *@var{pd}, void *@var{upage})
1450 Marks page @var{upage} ``not present'' in @var{pd}. Later accesses to
1451 the page will fault.
1453 Other bits in the page table for @var{upage} are preserved, permitting
1454 the accessed and dirty bits (see the next section) to be checked.
1456 If @var{upage} is not mapped, this function has no effect.
1459 @node Page Table Accessed and Dirty Bits
1460 @subsection Accessed and Dirty Bits
1462 80@var{x}86 hardware provides some assistance for implementing page
1463 replacement algorithms, through a pair of bits in the page table entry
1464 (PTE) for each page. On any read or write to a page, the CPU sets the
1465 @dfn{accessed bit} to 1 in the page's PTE, and on any write, the CPU
1466 sets the @dfn{dirty bit} to 1. The CPU never resets these bits to 0,
1467 but the OS may do so.
1469 Proper interpretation of these bits requires understanding of
1470 @dfn{aliases}, that is, two (or more) pages that refer to the same
1471 frame. When an aliased frame is accessed, the accessed and dirty bits
1472 are updated in only one page table entry (the one for the page used for
1473 access). The accessed and dirty bits for the other aliases are not
1476 @xref{Accessed and Dirty Bits}, on applying these bits in implementing
1477 page replacement algorithms.
1479 @deftypefun bool pagedir_is_dirty (uint32_t *@var{pd}, const void *@var{page})
1480 @deftypefunx bool pagedir_is_accessed (uint32_t *@var{pd}, const void *@var{page})
1481 Returns true if page directory @var{pd} contains a page table entry for
1482 @var{page} that is marked dirty (or accessed). Otherwise,
1486 @deftypefun void pagedir_set_dirty (uint32_t *@var{pd}, const void *@var{page}, bool @var{value})
1487 @deftypefunx void pagedir_set_accessed (uint32_t *@var{pd}, const void *@var{page}, bool @var{value})
1488 If page directory @var{pd} has a page table entry for @var{page}, then
1489 its dirty (or accessed) bit is set to @var{value}.
1492 @node Page Table Details
1493 @subsection Page Table Details
1495 The functions provided with Pintos are sufficient to implement the
1496 projects. However, you may still find it worthwhile to understand the
1497 hardware page table format, so we'll go into a little detail in this
1501 * Page Table Structure::
1502 * Page Table Entry Format::
1503 * Page Directory Entry Format::
1506 @node Page Table Structure
1507 @subsubsection Structure
1509 The top-level paging data structure is a page called the ``page
1510 directory'' (PD) arranged as an array of 1,024 32-bit page directory
1511 entries (PDEs), each of which represents 4 MB of virtual memory. Each
1512 PDE may point to the physical address of another page called a
1513 ``page table'' (PT) arranged, similarly, as an array of 1,024
1514 32-bit page table entries (PTEs), each of which translates a single 4
1515 kB virtual page to a physical page.
1517 Translation of a virtual address into a physical address follows
1518 the three-step process illustrated in the diagram
1519 below:@footnote{Actually, virtual to physical translation on the
1520 80@var{x}86 architecture occurs via an intermediate ``linear
1521 address,'' but Pintos (and most modern 80@var{x}86 OSes) set up the CPU
1522 so that linear and virtual addresses are one and the same. Thus, you
1523 can effectively ignore this CPU feature.}
1527 The most-significant 10 bits of the virtual address (bits 22@dots{}31)
1528 index the page directory. If the PDE is marked ``present,'' the
1529 physical address of a page table is read from the PDE thus obtained.
1530 If the PDE is marked ``not present'' then a page fault occurs.
1533 The next 10 bits of the virtual address (bits 12@dots{}21) index
1534 the page table. If the PTE is marked ``present,'' the physical
1535 address of a data page is read from the PTE thus obtained. If the PTE
1536 is marked ``not present'' then a page fault occurs.
1539 The least-significant 12 bits of the virtual address (bits 0@dots{}11)
1540 are added to the data page's physical base address, yielding the final
1547 +----------------------+----------------------+----------------------+
1548 | Page Directory Index | Page Table Index | Page Offset |
1549 +----------------------+----------------------+----------------------+
1551 _______/ _______/ _____/
1553 / Page Directory / Page Table / Data Page
1554 / .____________. / .____________. / .____________.
1555 |1,023|____________| |1,023|____________| | |____________|
1556 |1,022|____________| |1,022|____________| | |____________|
1557 |1,021|____________| |1,021|____________| \__\|____________|
1558 |1,020|____________| |1,020|____________| /|____________|
1560 | | | \____\| |_ | |
1561 | | . | /| . | \ | . |
1562 \____\| . |_ | . | | | . |
1563 /| . | \ | . | | | . |
1564 | . | | | . | | | . |
1566 |____________| | |____________| | |____________|
1567 4|____________| | 4|____________| | |____________|
1568 3|____________| | 3|____________| | |____________|
1569 2|____________| | 2|____________| | |____________|
1570 1|____________| | 1|____________| | |____________|
1571 0|____________| \__\0|____________| \____\|____________|
1576 Pintos provides some macros and functions that are useful for working
1577 with raw page tables:
1581 The bit index (12) and number of bits (10), respectively, in a page table
1582 index within a virtual address.
1586 A bit mask with the bits in the page table index set to 1 and other bits
1591 The number of bytes of virtual address space that a single page table
1592 page covers (4,194,304 bytes, or 4 MB).
1597 The bit index (22) and number of bits (10), respectively, in a page
1598 directory index within a virtual address.
1602 A bit mask with the bits in the page directory index set to 1 and other
1606 @deftypefun uintptr_t pd_no (const void *@var{va})
1607 @deftypefunx uintptr_t pt_no (const void *@var{va})
1608 Returns the page directory index or page table index, respectively, for
1609 virtual address @var{va}. These functions are defined in
1610 @file{threads/pte.h}.
1613 @deftypefun unsigned pg_ofs (const void *@var{va})
1614 Returns the page offset for virtual address @var{va}. This function is
1615 defined in @file{threads/vaddr.h}.
1618 @node Page Table Entry Format
1619 @subsubsection Page Table Entry Format
1621 You do not need to understand the PTE format to do the Pintos
1622 projects, unless you wish to incorporate the page table into your
1623 supplemental page table (@pxref{Managing the Supplemental Page Table}).
1625 The actual format of a page table entry is summarized below. For
1626 complete information, refer to section 3.7, ``Page Translation Using
1627 32-Bit Physical Addressing,'' in @bibref{IA32-v3a}.
1631 31 12 11 9 6 5 2 1 0
1632 +---------------------------------------+----+----+-+-+---+-+-+-+
1633 | Physical Address | AVL| |D|A| |U|W|P|
1634 +---------------------------------------+----+----+-+-+---+-+-+-+
1638 Some more information on each bit is given below. The names are
1639 @file{threads/pte.h} macros that represent the bits' values:
1642 Bit 0, the ``present'' bit. When this bit is 1, the
1643 other bits are interpreted as described below. When this bit is 0, any
1644 attempt to access the page will page fault. The remaining bits are then
1645 not used by the CPU and may be used by the OS for any purpose.
1649 Bit 1, the ``read/write'' bit. When it is 1, the page
1650 is writable. When it is 0, write attempts will page fault.
1654 Bit 2, the ``user/supervisor'' bit. When it is 1, user
1655 processes may access the page. When it is 0, only the kernel may access
1656 the page (user accesses will page fault).
1658 Pintos clears this bit in PTEs for kernel virtual memory, to prevent
1659 user processes from accessing them.
1663 Bit 5, the ``accessed'' bit. @xref{Page Table Accessed
1668 Bit 6, the ``dirty'' bit. @xref{Page Table Accessed and
1673 Bits 9@dots{}11, available for operating system use.
1674 Pintos, as provided, does not use them and sets them to 0.
1678 Bits 12@dots{}31, the top 20 bits of the physical address of a frame.
1679 The low 12 bits of the frame's address are always 0.
1682 Other bits are either reserved or uninteresting in a Pintos context and
1683 should be set to@tie{}0.
1685 Header @file{threads/pte.h} defines three functions for working with
1688 @deftypefun uint32_t pte_create_kernel (uint32_t *@var{page}, bool @var{writable})
1689 Returns a page table entry that points to @var{page}, which should be a
1690 kernel virtual address. The PTE's present bit will be set. It will be
1691 marked for kernel-only access. If @var{writable} is true, the PTE will
1692 also be marked read/write; otherwise, it will be read-only.
1695 @deftypefun uint32_t pte_create_user (uint32_t *@var{page}, bool @var{writable})
1696 Returns a page table entry that points to @var{page}, which should be
1697 the kernel virtual address of a frame in the user pool (@pxref{Why
1698 PAL_USER?}). The PTE's present bit will be set and it will be marked to
1699 allow user-mode access. If @var{writable} is true, the PTE will also be
1700 marked read/write; otherwise, it will be read-only.
1703 @deftypefun {void *} pte_get_page (uint32_t @var{pte})
1704 Returns the kernel virtual address for the frame that @var{pte} points
1705 to. The @var{pte} may be present or not-present; if it is not-present
1706 then the pointer return is only meaningful if the proper bits in the PTE
1707 actually represent a physical address.
1710 @node Page Directory Entry Format
1711 @subsubsection Page Directory Entry Format
1713 Page directory entries have the same format as PTEs, except that the
1714 physical address points to a page table page instead of a frame. Header
1715 @file{threads/pte.h} defines two functions for working with page
1718 @deftypefun uint32_t pde_create (uint32_t *@var{pt})
1719 Returns a page directory that points to @var{page}, which should be the
1720 kernel virtual address of a page table page. The PDE's present bit will
1721 be set, it will be marked to allow user-mode access, and it will be
1725 @deftypefun {uint32_t *} pde_get_pt (uint32_t @var{pde})
1726 Returns the kernel virtual address for the page table page that
1727 @var{pde} points to. The @var{pde} must be marked present.
1733 Pintos provides a hash table data structure in @file{lib/kernel/hash.c}.
1734 To use it you will need to manually include its header file,
1735 @file{lib/kernel/hash.h}, with @code{#include <hash.h>}. Intentionally,
1736 no code provided with Pintos uses the hash table, which means that you
1737 are free to use it as is, modify its implementation for your own
1738 purposes, or ignore it, as you wish.
1740 Most implementations of the virtual memory project use a hash table to
1741 translate pages to frames. You may find other uses for hash tables as
1746 * Basic Hash Functions::
1747 * Hash Search Functions::
1748 * Hash Iteration Functions::
1749 * Hash Table Example::
1750 * Hash Auxiliary Data::
1751 * Hash Synchronization::
1754 @node Hash Data Types
1755 @subsection Data Types
1757 A hash table is represented by @struct{hash}.
1759 @deftp {Type} {struct hash}
1760 Represents an entire hash table. The actual members of @struct{hash}
1761 are ``opaque.'' That is, code that uses a hash table should not access
1762 @struct{hash} members directly, nor should it need to. Instead, use
1763 hash table functions and macros.
1766 The hash table operates on elements of type @struct{hash_elem}.
1768 @deftp {Type} {struct hash_elem}
1769 Embed a @struct{hash_elem} member in the structure you want to include
1770 in a hash table. Like @struct{hash}, @struct{hash_elem} is opaque.
1771 All functions for operating on hash table elements actually take and
1772 return pointers to @struct{hash_elem}, not pointers to your hash table's
1776 You will often need to obtain a @struct{hash_elem}
1777 given a real element of the hash table, and vice versa. Given
1778 a real element of the hash table, obtaining a pointer to its
1779 @struct{hash_elem} is trivial: take the address of the
1780 @struct{hash_elem} member. Use the @code{hash_entry()} macro to go the
1783 @deftypefn {Macro} {@var{type} *} hash_entry (struct hash_elem *@var{elem}, @var{type}, @var{member})
1784 Returns a pointer to the structure that @var{elem}, a pointer to a
1785 @struct{hash_elem}, is embedded within. You must provide @var{type},
1786 the name of the structure that @var{elem} is inside, and @var{member},
1787 the name of the member in @var{type} that @var{elem} points to.
1789 For example, suppose @code{h} is a @code{struct hash_elem *} variable
1790 that points to a @struct{thread} member (of type @struct{hash_elem})
1791 named @code{h_elem}. Then, @code{hash_entry (h, struct thread, h_elem)}
1792 yields the address of the @struct{thread} that @code{h} points within.
1795 Each hash table element must contain a key, that is, data that
1796 identifies and distinguishes elements in the hash table. Every element
1797 in a hash table at a given time must have a unique key. (Elements may
1798 also contain non-key data that need not be unique.) While an element is
1799 in a hash table, its key data must not be changed. For each hash table,
1800 you must write two functions that act on keys: a hash function and a
1801 comparison function. These functions must match the following
1804 @deftp {Type} {unsigned hash_hash_func (const struct hash_elem *@var{element}, void *@var{aux})}
1805 Returns a hash of @var{element}'s data, as a value anywhere in the range
1806 of @code{unsigned int}. The hash of an element should be a
1807 pseudo-random function of the element's key. It must not depend on
1808 non-key data in the element or on any non-constant data other than the
1809 key. Pintos provides the following functions as a suitable basis for
1812 @deftypefun unsigned hash_bytes (const void *@var{buf}, size_t *@var{size})
1813 Returns a hash of the @var{size} bytes starting at @var{buf}. The
1814 implementation is the general-purpose
1815 @uref{http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash, Fowler-Noll-Vo
1816 hash} for 32-bit words.
1819 @deftypefun unsigned hash_string (const char *@var{s})
1820 Returns a hash of null-terminated string @var{s}.
1823 @deftypefun unsigned hash_int (int @var{i})
1824 Returns a hash of integer @var{i}.
1827 If your key is a single piece of data of an appropriate type, it is
1828 sensible for your hash function to directly return the output of one of
1829 these functions. For multiple pieces of data, you may wish to combine
1830 the output of more than one call to them using, e.g., the @samp{^}
1832 operator. Finally, you may entirely ignore these functions and write
1833 your own hash function from scratch, but remember that your goal is to
1834 build an operating system kernel, not to design a hash function.
1836 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}.
1839 @deftp {Type} {bool hash_less_func (const struct hash_elem *@var{a}, const struct hash_elem *@var{b}, void *@var{aux})}
1840 Compares the keys stored in elements @var{a} and @var{b}. Returns
1841 true if @var{a} is less than @var{b}, false if @var{a} is greater than
1842 or equal to @var{b}.
1844 If two elements compare equal, then they must hash to equal values.
1846 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}.
1849 A few functions that act on hashes accept a pointer to a third kind of
1850 function as an argument:
1852 @deftp {Type} {void hash_action_func (struct hash_elem *@var{element}, void *@var{aux})}
1853 Performs some kind of action, chosen by the caller, on @var{element}.
1855 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}.
1858 @node Basic Hash Functions
1859 @subsection Basic Functions
1861 These functions create and destroy hash tables and obtain basic
1862 information about their contents.
1864 @deftypefun bool hash_init (struct hash *@var{hash}, hash_hash_func *@var{hash_func}, hash_less_func *@var{less_func}, void *@var{aux})
1865 Initializes @var{hash} as a hash table using @var{hash_func} as hash
1866 function, @var{less_func} as comparison function, and @var{aux} as
1868 Returns true if successful, false on failure. @func{hash_init} calls
1869 @func{malloc} and fails if memory cannot be allocated.
1871 @xref{Hash Auxiliary Data}, for an explanation of @var{aux}, which is
1872 most often a null pointer.
1875 @deftypefun void hash_clear (struct hash *@var{hash}, hash_action_func *@var{action})
1876 Removes all the elements from @var{hash}, which must have been
1877 previously initialized with @func{hash_init}.
1879 If @var{action} is non-null, then it is called once for each element in
1880 the hash table, which gives the caller an opportunity to deallocate any
1881 memory or other resources used by the element. For example, if the hash
1882 table elements are dynamically allocated using @func{malloc}, then
1883 @var{action} could @func{free} the element. This is safe because
1884 @func{hash_clear} will not access the memory in a given hash element
1885 after calling @var{action} on it. However, @var{action} must not call
1886 any function that may modify the hash table, such as @func{hash_insert}
1887 or @func{hash_delete}.
1890 @deftypefun void hash_destroy (struct hash *@var{hash}, hash_action_func *@var{action})
1891 If @var{action} is non-null, calls it for each element in the hash, with
1892 the same semantics as a call to @func{hash_clear}. Then, frees the
1893 memory held by @var{hash}. Afterward, @var{hash} must not be passed to
1894 any hash table function, absent an intervening call to @func{hash_init}.
1897 @deftypefun size_t hash_size (struct hash *@var{hash})
1898 Returns the number of elements currently stored in @var{hash}.
1901 @deftypefun bool hash_empty (struct hash *@var{hash})
1902 Returns true if @var{hash} currently contains no elements,
1903 false if @var{hash} contains at least one element.
1906 @node Hash Search Functions
1907 @subsection Search Functions
1909 Each of these functions searches a hash table for an element that
1910 compares equal to one provided. Based on the success of the search,
1911 they perform some action, such as inserting a new element into the hash
1912 table, or simply return the result of the search.
1914 @deftypefun {struct hash_elem *} hash_insert (struct hash *@var{hash}, struct hash_elem *@var{element})
1915 Searches @var{hash} for an element equal to @var{element}. If none is
1916 found, inserts @var{element} into @var{hash} and returns a null pointer.
1917 If the table already contains an element equal to @var{element}, returns
1918 the existing element without modifying @var{hash}.
1921 @deftypefun {struct hash_elem *} hash_replace (struct hash *@var{hash}, struct hash_elem *@var{element})
1922 Inserts @var{element} into @var{hash}. Any element equal to
1923 @var{element} already in @var{hash} is removed. Returns the element
1924 removed, or a null pointer if @var{hash} did not contain an element
1925 equal to @var{element}.
1927 The caller is responsible for deallocating any resources associated with
1928 the element returned, as appropriate. For example, if the hash table
1929 elements are dynamically allocated using @func{malloc}, then the caller
1930 must @func{free} the element after it is no longer needed.
1933 The element passed to the following functions is only used for hashing
1934 and comparison purposes. It is never actually inserted into the hash
1935 table. Thus, only the key data in the element need be initialized, and
1936 other data in the element will not be used. It often makes sense to
1937 declare an instance of the element type as a local variable, initialize
1938 the key data, and then pass the address of its @struct{hash_elem} to
1939 @func{hash_find} or @func{hash_delete}. @xref{Hash Table Example}, for
1940 an example. (Large structures should not be
1941 allocated as local variables. @xref{struct thread}, for more
1944 @deftypefun {struct hash_elem *} hash_find (struct hash *@var{hash}, struct hash_elem *@var{element})
1945 Searches @var{hash} for an element equal to @var{element}. Returns the
1946 element found, if any, or a null pointer otherwise.
1949 @deftypefun {struct hash_elem *} hash_delete (struct hash *@var{hash}, struct hash_elem *@var{element})
1950 Searches @var{hash} for an element equal to @var{element}. If one is
1951 found, it is removed from @var{hash} and returned. Otherwise, a null
1952 pointer is returned and @var{hash} is unchanged.
1954 The caller is responsible for deallocating any resources associated with
1955 the element returned, as appropriate. For example, if the hash table
1956 elements are dynamically allocated using @func{malloc}, then the caller
1957 must @func{free} the element after it is no longer needed.
1960 @node Hash Iteration Functions
1961 @subsection Iteration Functions
1963 These functions allow iterating through the elements in a hash table.
1964 Two interfaces are supplied. The first requires writing and supplying a
1965 @var{hash_action_func} to act on each element (@pxref{Hash Data Types}).
1967 @deftypefun void hash_apply (struct hash *@var{hash}, hash_action_func *@var{action})
1968 Calls @var{action} once for each element in @var{hash}, in arbitrary
1969 order. @var{action} must not call any function that may modify the hash
1970 table, such as @func{hash_insert} or @func{hash_delete}. @var{action}
1971 must not modify key data in elements, although it may modify any other
1975 The second interface is based on an ``iterator'' data type.
1976 Idiomatically, iterators are used as follows:
1979 struct hash_iterator i;
1982 while (hash_next (&i))
1984 struct foo *f = hash_entry (hash_cur (&i), struct foo, elem);
1985 @r{@dots{}do something with @i{f}@dots{}}
1989 @deftp {Type} {struct hash_iterator}
1990 Represents a position within a hash table. Calling any function that
1991 may modify a hash table, such as @func{hash_insert} or
1992 @func{hash_delete}, invalidates all iterators within that hash table.
1994 Like @struct{hash} and @struct{hash_elem}, @struct{hash_elem} is opaque.
1997 @deftypefun void hash_first (struct hash_iterator *@var{iterator}, struct hash *@var{hash})
1998 Initializes @var{iterator} to just before the first element in
2002 @deftypefun {struct hash_elem *} hash_next (struct hash_iterator *@var{iterator})
2003 Advances @var{iterator} to the next element in @var{hash}, and returns
2004 that element. Returns a null pointer if no elements remain. After
2005 @func{hash_next} returns null for @var{iterator}, calling it again
2006 yields undefined behavior.
2009 @deftypefun {struct hash_elem *} hash_cur (struct hash_iterator *@var{iterator})
2010 Returns the value most recently returned by @func{hash_next} for
2011 @var{iterator}. Yields undefined behavior after @func{hash_first} has
2012 been called on @var{iterator} but before @func{hash_next} has been
2013 called for the first time.
2016 @node Hash Table Example
2017 @subsection Hash Table Example
2019 Suppose you have a structure, called @struct{page}, that you
2020 want to put into a hash table. First, define @struct{page} to include a
2021 @struct{hash_elem} member:
2026 struct hash_elem hash_elem; /* @r{Hash table element.} */
2027 void *addr; /* @r{Virtual address.} */
2028 /* @r{@dots{}other members@dots{}} */
2032 We write a hash function and a comparison function using @var{addr} as
2033 the key. A pointer can be hashed based on its bytes, and the @samp{<}
2034 operator works fine for comparing pointers:
2037 /* @r{Returns a hash value for page @var{p}.} */
2039 page_hash (const struct hash_elem *p_, void *aux UNUSED)
2041 const struct page *p = hash_entry (p_, struct page, hash_elem);
2042 return hash_bytes (&p->addr, sizeof p->addr);
2045 /* @r{Returns true if page @var{a} precedes page @var{b}.} */
2047 page_less (const struct hash_elem *a_, const struct hash_elem *b_,
2050 const struct page *a = hash_entry (a_, struct page, hash_elem);
2051 const struct page *b = hash_entry (b_, struct page, hash_elem);
2053 return a->addr < b->addr;
2058 (The use of @code{UNUSED} in these functions' prototypes suppresses a
2059 warning that @var{aux} is unused. @xref{Function and Parameter
2060 Attributes}, for information about @code{UNUSED}. @xref{Hash Auxiliary
2061 Data}, for an explanation of @var{aux}.)
2063 Then, we can create a hash table like this:
2068 hash_init (&pages, page_hash, page_less, NULL);
2071 Now we can manipulate the hash table we've created. If @code{@var{p}}
2072 is a pointer to a @struct{page}, we can insert it into the hash table
2076 hash_insert (&pages, &p->hash_elem);
2079 @noindent If there's a chance that @var{pages} might already contain a
2080 page with the same @var{addr}, then we should check @func{hash_insert}'s
2083 To search for an element in the hash table, use @func{hash_find}. This
2084 takes a little setup, because @func{hash_find} takes an element to
2085 compare against. Here's a function that will find and return a page
2086 based on a virtual address, assuming that @var{pages} is defined at file
2090 /* @r{Returns the page containing the given virtual @var{address},
2091 or a null pointer if no such page exists.} */
2093 page_lookup (const void *address)
2096 struct hash_elem *e;
2099 e = hash_find (&pages, &p.hash_elem);
2100 return e != NULL ? hash_entry (e, struct page, hash_elem) : NULL;
2105 @struct{page} is allocated as a local variable here on the assumption
2106 that it is fairly small. Large structures should not be allocated as
2107 local variables. @xref{struct thread}, for more information.
2109 A similar function could delete a page by address using
2112 @node Hash Auxiliary Data
2113 @subsection Auxiliary Data
2115 In simple cases like the example above, there's no need for the
2116 @var{aux} parameters. In these cases, just pass a null pointer to
2117 @func{hash_init} for @var{aux} and ignore the values passed to the hash
2118 function and comparison functions. (You'll get a compiler warning if
2119 you don't use the @var{aux} parameter, but you can turn that off with
2120 the @code{UNUSED} macro, as shown in the example, or you can just ignore
2123 @var{aux} is useful when you have some property of the data in the
2124 hash table that's both constant and needed for hashing or comparisons,
2125 but which is not stored in the data items themselves. For example, if
2126 the items in a hash table contain fixed-length strings, but the items
2127 themselves don't indicate what that fixed length is, you could pass
2128 the length as an @var{aux} parameter.
2130 @node Hash Synchronization
2131 @subsection Synchronization
2133 The hash table does not do any internal synchronization. It is the
2134 caller's responsibility to synchronize calls to hash table functions.
2135 In general, any number of functions that examine but do not modify the
2136 hash table, such as @func{hash_find} or @func{hash_next}, may execute
2137 simultaneously. However, these function cannot safely execute at the
2138 same time as any function that may modify a given hash table, such as
2139 @func{hash_insert} or @func{hash_delete}, nor may more than one function
2140 that can modify a given hash table execute safely at once.
2142 It is also the caller's responsibility to synchronize access to data in
2143 hash table elements. How to synchronize access to this data depends on
2144 how it is designed and organized, as with any other data structure.