Chapter 1
Figure 1-1 Processor Block Diagram
Figure 1-2 32-Bit General Registers
Figure 1-3 64-Bit General Registers
Figure 1-4 Control Registers
Figure 1-5 32-Bit Address Space Layout
Figure 1-6 64-Bit Address Space Layout
Figure 1-7 Address Swizzling
Figure 1-8 Translation of Virtual Address to Physical Address
Figure 1-9 Address Translation through the TLB and Cache
Chapter 2
Figure 2-1 Stack Usage in Narrow Mode
Figure 2-2 Stack Usage in Wide Mode
Figure 2-3 Stack Usage for the Call to proc()
Chapter 3
Figure 3-1 The Big Picture
Figure 3-2 Virtual Memory Objects, Private and Shared
Figure 3-3 Tables and Lists
Figure 3-4 Resource Maps
Figure 3-5 Hashtables and Chains
Figure 3-6 Partitioned Tables
Figure 3-7 B-Trees
Figure 3-8 Sparse Tables
Figure 3-9 Skip List
Figure 3-10 Operations Arrays: A Vectored Jump Table
Figure 3-11 Kernel Memory Tables
Figure 3-12 Kernel Process Tables
Figure 3-13 Kernel File System Tables
Figure 3-14 Kernel I/O Tables
Chapter 4
Figure 4-1 Static versus Dynamic proc Tables
Figure 4-2 Linking Threads to Their Process
Figure 4-3 Threading Models
Figure 4-4 User-to-Kernel Thread Transitions
Figure 4-5 System Calls: The Big Picture
Chapter 5
Figure 5-1 Kernel Process Tables
Figure 5-2 Kernel Process Tables
Figure 5-3 The kthread Table
Figure 5-4 Mapping a Program to a Logical Space
Figure 5-5 Magic for 32-Bit Applications)
Figure 5-6 SHARE_MAGIC and Memory Windows
Figure 5-7 Q3 Private Address Space
Figure 5-8 The Process Logical Address Space
Figure 5-9 The vas/pregion List
Figure 5-10 The pregion Structure
Figure 5-11 The uarea Structure
Figure 5-12 Thread Priorities
Figure 5-13 Thread Priorities
Figure 5-14 SCHED_RTPRIO
Figure 5-15 SCHED_RTPRIO
Figure 5-16 POSIX Global Real-Time Run Queue
Figure 5-17 Per-Processor Run Queues
Chapter 6
Figure 6-1 Types of Memory
Figure 6-2 Populating the VAS with Regions
Figure 6-3 How the Kernel Views the pdir
Figure 6-4 The Hashtable
Figure 6-5 Sparse Tables
Figure 6-6 Physical to Virtual Address Translation
Figure 6-7 Virtual Address Aliasing
Figure 6-8 Region of Page Frames
Figure 6-9 VFD|DBD
Figure 6-10 The B-Tree
Figure 6-11 Growing the tree
Figure 6-12 The Process View Meets the Kernel View
Figure 6-13 Managing Page Frames
Figure 6-14 Page Free Data, pfda
Figure 6-15 phash and phead
Figure 6-16 Pools, Ponds, Views
Figure 6-17 Page Groups
Figure 6-18 Physical Memory Allocator
Figure 6-19 Free Lists Revisited
Chapter 7
Figure 7-1 Lotsfree
Figure 7-2 Inside Each pregion
Figure 7-3 Linking All the pregions
Figure 7-4 Reserved Versus Allocated
Figure 7-5 A Simple Swap Example
Figure 7-6 Adding Pseudo-Swap to the Mix
Figure 7-7 Swap Kernel Structures
Chapter 8
Figure 8-1 The File Management Subsystem
Figure 8-2 File System Basics: 101
Figure 8-3 Fragmentation of Available Space
Figure 8-4 Fragmentation Is Our Friend
Figure 8-5 Creating an Index
Figure 8-6 Metadata
Figure 8-7 Super Blocks, Index Nodes, Directories, and User Data
Figure 8-8 The HFS File System Layout
Figure 8-9 The inode
Figure 8-10 Blocks and Fragments
Figure 8-11 Kernel File System Tables
Figure 8-12 Mounting a File System
Figure 8-13 Type-Specific Data Structures (HFS Example)
Figure 8-14 The vnode
Figure 8-15 Building a Seamless File System
Figure 8-16 System File Table
Figure 8-17 The Buffer Cache
Figure 8-18 The Buffer Cache Hash
Figure 8-19 Directory Name Lookup Cache
Chapter 9
Figure 9-1 Parent Creates a Child
Figure 9-2 The fork()
Figure 9-3 The vfork()
Figure 9-4 Process Life Cycle
Figure 9-5 The exec() Call: Disposing of Old Regions
Figure 9-6 getxfile() Rebuilds the Memory View
Figure 9-7 Executable and Memory Mapped Files
Figure 9-8 Shared Memory Objects
Figure 9-9 The exit()
Chapter 10
Figure 10-1 PA-RISC I/O Block Diagram
Figure 10-2 32-Bit I/O Address Space
Figure 10-3 64-Bit I/O Address Space
Figure 10-4 Converged Workstation and Server I/O Systems
Figure 10-5 Iotree Example
Chapter 11
Figure 11-1 The Logical Volume Manager
Figure 11-2 Mapping Extents
Figure 11-3 LVM Administration Review
Figure 11-4 Metadata Disk Layout
Figure 11-5 PVRA and VGRA Components
Figure 11-6 The LVM Pseudodriver Architecture
Figure 11-7 Work Queues
Figure 11-8 Kernel-Resident Configuration Structures
Figure 11-9 Mirror Write Consistency Records
Chapter 12
Figure 12-1 A Typical Multiprocessor System
Figure 12-2 Flowchart of Spinlock Acquisition
Figure 12-3 Flowchart of Alpha Semaphore Acquisition
Chapter 13
Figure 13-1 Per-Processor Structures for Callouts
Figure 13-2 Callout Table Headers
Figure 13-3 Buckets on the Free List
Figure 13-4 Memory Arena Objects and Object Headers
Figure 13-5 Free List for Fixed-Size Objects
Figure 13-6 Free List for Variable-Sized Objects
Chapter 14
Figure 14-1 Signal-Related Data Structures
Figure 14-2 The kill() and sigqueue() System Calls