| Preface | p. xi |
| Introduction | p. 1 |
| Linux Versus Other Unix-Like Kernels | p. 2 |
| Hardware Dependency | p. 6 |
| Linux Versions | p. 7 |
| Basic Operating System Concepts | p. 8 |
| An Overview of the Unix Filesystem | p. 12 |
| An Overview of Unix Kernels | p. 19 |
| Memory Addressing | p. 35 |
| Memory Addresses | p. 35 |
| Segmentation in Hardware | p. 36 |
| Segmentation in Linux | p. 41 |
| Paging in Hardware | p. 45 |
| Paging in Linux | p. 57 |
| Processes | p. 79 |
| Processes, Lightweight Processes, and Threads | p. 79 |
| Process Descriptor | p. 81 |
| Process Switch | p. 102 |
| Creating Processes | p. 114 |
| Destroying Processes | p. 126 |
| Interrupts and Exceptions | p. 131 |
| The Role of Interrupt Signals | p. 132 |
| Interrupts and Exceptions | p. 133 |
| Nested Execution of Exception and Interrupt Handlers | p. 143 |
| Initializing the Interrupt Descriptor Table | p. 145 |
| Exception Handling | p. 148 |
| Interrupt Handling | p. 151 |
| Softirqs and Tasklets | p. 171 |
| Work Queues | p. 180 |
| Returning from Interrupts and Exceptions | p. 183 |
| Kernel Synchronization | p. 189 |
| How the Kernel Services Requests | p. 189 |
| Synchronization Primitives | p. 194 |
| Synchronizing Accesses to Kernel Data Structures | p. 217 |
| Examples of Race Condition Prevention | p. 222 |
| Timing Measurements | p. 227 |
| Clock and Timer Circuits | p. 228 |
| The Linux Timekeeping Architecture | p. 232 |
| Updating the Time and Date | p. 240 |
| Updating System Statistics | p. 241 |
| Software Timers and Delay Functions | p. 244 |
| System Calls Related to Timing Measurements | p. 252 |
| Process Scheduling | p. 258 |
| Scheduling Policy | p. 258 |
| The Scheduling Algorithm | p. 262 |
| Data Structures Used by the Scheduler | p. 266 |
| Functions Used by the Scheduler | p. 270 |
| Runqueue Balancing in Multiprocessor Systems | p. 284 |
| System Calls Related to Scheduling | p. 290 |
| Memory Management | p. 294 |
| Page Frame Management | p. 294 |
| Memory Area Management | p. 323 |
| Noncontiguous Memory Area Management | p. 342 |
| Process Address Space | p. 351 |
| The Process's Address Space | p. 352 |
| The Memory Descriptor | p. 353 |
| Memory Regions | p. 357 |
| Page Fault Exception Handler | p. 376 |
| Creating and Deleting a Process Address Space | p. 392 |
| Managing the Heap | p. 395 |
| System Calls | p. 398 |
| POSIX APIs and System Calls | p. 398 |
| System Call Handler and Service Routines | p. 399 |
| Entering and Exiting a System Call | p. 401 |
| Parameter Passing | p. 409 |
| Kernel Wrapper Routines | p. 418 |
| Signals | p. 420 |
| The Role of Signals | p. 420 |
| Generating a Signal | p. 433 |
| Delivering a Signal | p. 439 |
| System Calls Related to Signal Handling | p. 450 |
| The Virtual Filesystem | p. 456 |
| The Role of the Virtual Filesystem (VFS) | p. 456 |
| VFS Data Structures | p. 462 |
| Filesystem Types | p. 481 |
| Filesystem Handling | p. 483 |
| Pathname Lookup | p. 495 |
| Implementations of VFS System Calls | p. 505 |
| File Locking | p. 510 |
| I/O Architecture and Device Drivers | p. 519 |
| I/O Architecture | p. 519 |
| The Device Driver Model | p. 526 |
| Device Files | p. 536 |
| Device Drivers | p. 540 |
| Character Device Drivers | p. 552 |
| Block Device Drivers | p. 560 |
| Block Devices Handling | p. 560 |
| The Generic Block Layer | p. 566 |
| The I/O Scheduler | p. 572 |
| Block Device Drivers | p. 585 |
| Opening a Block Device File | p. 595 |
| The Page Cache | p. 599 |
| The Page Cache | p. 600 |
| Storing Blocks in the Page Cache | p. 611 |
| Writing Dirty Pages to Disk | p. 622 |
| The sync(), fsync(), and fdatasync() System Calls | p. 629 |
| Accessing Files | p. 631 |
| Reading and Writing a File | p. 632 |
| Memory Mapping | p. 657 |
| Direct I/O Transfers | p. 668 |
| Asynchronous I/O | p. 671 |
| Page Frame Reclaiming | p. 676 |
| The Page Frame Reclaiming Algorithm | p. 676 |
| Reverse Mapping | p. 680 |
| Implementing the PFRA | p. 689 |
| Swapping | p. 712 |
| The Ext2 and Ext3 Filesystems | p. 738 |
| General Characteristics of Ext2 | p. 738 |
| Ext2 Disk Data Structures | p. 741 |
| Ext2 Memory Data Structures | p. 750 |
| Creating the Ext2 Filesystem | p. 753 |
| Ext2 Methods | p. 755 |
| Managing Ext2 Disk Space | p. 757 |
| The Ext3 Filesystem | p. 766 |
| Process Communication | p. 775 |
| Pipes | p. 776 |
| FIFOs | p. 787 |
| System V IPC | p. 789 |
| POSIX Message Queues | p. 806 |
| Program Execution | p. 808 |
| Executable Files | p. 809 |
| Executable Formats | p. 824 |
| Execution Domains | p. 827 |
| The exec Functions | p. 828 |
| System Startup | p. 835 |
| Modules | p. 842 |
| Bibliography | p. 852 |
| Source Code Index | p. 857 |
| Index | p. 905 |
| Table of Contents provided by Ingram. All Rights Reserved. |