Contents

  1. Modern Operating Systems
  2. Modern Operating Systems
  3. Pearson’s Commitment to Diversity, Equity, and Inclusion
  4. Contents
  5. Preface
    1. About the Authors
  6. 1 Introduction
    1. 1.1 What is an Operating System?
      1. 1.1.1 The Operating System as an Extended Machine
      2. 1.1.2 The Operating System as a Resource Manager
    2. 1.2 History of Operating Systems
      1. 1.2.1 The First Generation (1945–1955): Vacuum Tubes
      2. 1.2.2 The Second Generation (1955–1965): Transistors and Batch Systems
      3. 1.2.3 The Third Generation (1965–1980): ICs and Multiprogramming
      4. 1.2.4 The Fourth Generation (1980–Present): Personal Computers
      5. 1.2.5 The Fifth Generation (1990–Present): Mobile Computers
    3. 1.3 Computer Hardware Review
      1. 1.3.1 Processors
        1. Multithreaded and Multicore Chips
      2. 1.3.2 Memory
      3. 1.3.3 Nonvolatile Storage
      4. 1.3.4 I/O Devices
      5. 1.3.5 Buses
      6. 1.3.6 Booting the Computer
    4. 1.4 The Operating System Zoo
      1. 1.4.1 Mainframe Operating Systems
      2. 1.4.2 Server Operating Systems
      3. 1.4.3 Personal Computer Operating Systems
      4. 1.4.4 Smartphone and Handheld Computer Operating Systems
      5. 1.4.5 The Internet of Things and Embedded Operating Systems
      6. 1.4.6 Real-Time Operating Systems
      7. 1.4.7 Smart Card Operating Systems
    5. 1.5 Operating System Concepts
      1. 1.5.1 Processes
      2. 1.5.2 Address Spaces
      3. 1.5.3 Files
      4. 1.5.4 Input/Output
      5. 1.5.5 Protection
      6. 1.5.6 The Shell
      7. 1.5.7 Ontogeny Recapitulates Phylogeny
        1. Large Memories
        2. Protection Hardware
        3. Disks
        4. Virtual Memory
    6. 1.6 System Calls
      1. 1.6.1 System Calls for Process Management
      2. 1.6.2 System Calls for File Management
      3. 1.6.3 System Calls for Directory Management
      4. 1.6.4 Miscellaneous System Calls
      5. 1.6.5 The Windows API
    7. 1.7 Operating System Structure
      1. 1.7.1 Monolithic Systems
      2. 1.7.2 Layered Systems
      3. 1.7.3 Microkernels
      4. 1.7.4 Client-Server Model
      5. 1.7.5 Virtual Machines
        1. VM/370
        2. Virtual Machines Rediscovered
        3. The Java Virtual Machine
        4. Containers
      6. 1.7.6 Exokernels and Unikernels
    8. 1.8 The World According to C
      1. 1.8.1 The C Language
      2. 1.8.2 Header Files
      3. 1.8.3 Large Programming Projects
      4. 1.8.4 The Model of Run Time
    9. 1.9 Research On Operating Systems
    10. 1.10 Outline of the Rest of this Book
    11. 1.11 Metric Units
    12. 1.12 Summary
    13. Problems
  7. 2 Processes and Threads
    1. 2.1 Processes
      1. 2.1.1 The Process Model
      2. 2.1.2 Process Creation
      3. 2.1.3 Process Termination
      4. 2.1.4 Process Hierarchies
      5. 2.1.5 Process States
      6. 2.1.6 Implementation of Processes
      7. 2.1.7 Modeling Multiprogramming
    2. 2.2 Threads
      1. 2.2.1 Thread Usage
      2. 2.2.2 The Classical Thread Model
      3. 2.2.3 POSIX Threads
      4. 2.2.4 Implementing Threads in User Space
      5. 2.2.5 Implementing Threads in the Kernel
      6. 2.2.6 Hybrid Implementations
      7. 2.2.7 Making Single-Threaded Code Multithreaded
    3. 2.3 Event-Driven Servers
    4. 2.4 Synchronization and Interprocess Communication
      1. 2.4.1 Race Conditions
      2. 2.4.2 Critical Regions
      3. 2.4.3 Mutual Exclusion with Busy Waiting
        1. Disabling Interrupts
        2. Lock Variables
        3. Strict Alternation
        4. Peterson’s Solution
        5. The TSL Instruction
      4. 2.4.4 Sleep and Wakeup
        1. The Producer-Consumer Problem
      5. 2.4.5 Semaphores
        1. Solving the Producer-Consumer Problem Using Semaphores
        2. The Readers and Writers Problem
      6. 2.4.6 Mutexes
        1. Futexes
        2. Mutexes in Pthreads
      7. 2.4.7 Monitors
      8. 2.4.8 Message Passing
        1. Design Issues for Message-Passing Systems
        2. The Producer-Consumer Problem with Message Passing
      9. 2.4.9 Barriers
      10. 2.4.10 Priority Inversion
      11. 2.4.11 Avoiding Locks: Read-Copy-Update
    5. 2.5 Scheduling
      1. 2.5.1 Introduction to Scheduling
        1. Process Behavior
        2. When to Schedule
        3. Categories of Scheduling Algorithms
        4. Scheduling Algorithm Goals
      2. 2.5.2 Scheduling in Batch Systems
        1. First-Come, First-Served
        2. Shortest Job First
        3. Shortest Remaining Time Next
      3. 2.5.3 Scheduling in Interactive Systems
        1. Round-Robin Scheduling
        2. Priority Scheduling
        3. Multiple Queues
        4. Shortest Process Next
        5. Guaranteed Scheduling
        6. Lottery Scheduling
        7. Fair-Share Scheduling
      4. 2.5.4 Scheduling in Real-Time Systems
      5. 2.5.5 Policy Versus Mechanism
      6. 2.5.6 Thread Scheduling
    6. 2.6 Research on Processes and Threads
    7. 2.7 Summary
    8. Problems
  8. 3 Memory Management
    1. 3.1 No Memory Abstraction
      1. 3.1.1 Running Multiple Programs Without a Memory Abstraction
    2. 3.2 A Memory Abstraction: Address Spaces
      1. 3.2.1 The Notion of an Address Space
        1. Base and Limit Registers
      2. 3.2.2 Swapping
      3. 3.2.3 Managing Free Memory
        1. Memory Management with Bitmaps
        2. Memory Management with Linked Lists
    3. 3.3 Virtual Memory
      1. 3.3.1 Paging
      2. 3.3.2 Page Tables
        1. Structure of a Page Table Entry
      3. 3.3.3 Speeding Up Paging
        1. Translation Lookaside Buffers
        2. Software TLB Management
      4. 3.3.4 Page Tables for Large Memories
        1. Multilevel Page Tables
        2. Inverted Page Tables
    4. 3.4 Page Replacement Algorithms
      1. 3.4.1 The Optimal Page Replacement Algorithm
      2. 3.4.2 The Not Recently Used Page Replacement Algorithm
      3. 3.4.3 The First-In, First-Out (FIFO) Page Replacement Algorithm
      4. 3.4.4 The Second-Chance Page Replacement Algorithm
      5. 3.4.5 The Clock Page Replacement Algorithm
      6. 3.4.6 The Least Recently Used (LRU) Page Replacement Algorithm
      7. 3.4.7 Simulating LRU in Software
      8. 3.4.8 The Working Set Page Replacement Algorithm
      9. 3.4.9 The WSClock Page Replacement Algorithm
      10. 3.4.10 Summary of Page Replacement Algorithms
    5. 3.5 Design Issues for Paging Systems
      1. 3.5.1 Local versus Global Allocation Policies
      2. 3.5.2 Load Control
      3. 3.5.3 Cleaning Policy
      4. 3.5.4 Page Size
      5. 3.5.5 Separate Instruction and Data Spaces
      6. 3.5.6 Shared Pages
      7. 3.5.7 Shared Libraries
      8. 3.5.8 Mapped Files
    6. 3.6 Implementation Issues
      1. 3.6.1 Operating System Involvement with Paging
      2. 3.6.2 Page Fault Handling
      3. 3.6.3 Instruction Backup
      4. 3.6.4 Locking Pages in Memory
      5. 3.6.5 Backing Store
      6. 3.6.6 Separation of Policy and Mechanism
    7. 3.7 Segmentation
      1. 3.7.1 Implementation of Pure Segmentation
      2. 3.7.2 Segmentation with Paging: MULTICS
      3. 3.7.3 Segmentation with Paging: The Intel x86
    8. 3.8 Research on Memory Management
    9. 3.9 Summary
    10. Problems
  9. 4 File Systems
    1. 4.1 Files
      1. 4.1.1 File Naming
      2. 4.1.2 File Structure
      3. 4.1.3 File Types
      4. 4.1.4 File Access
      5. 4.1.5 File Attributes
      6. 4.1.6 File Operations
      7. 4.1.7 An Example Program Using File-System Calls
    2. 4.2 Directories
      1. 4.2.1 Single-Level Directory Systems
      2. 4.2.2 Hierarchical Directory Systems
      3. 4.2.3 Path Names
      4. 4.2.4 Directory Operations
    3. 4.3 File-System Implementation
      1. 4.3.1 File-System Layout
        1. Old School: The Master Boot Record
        2. New School: Unified Extensible Firmware Interface
      2. 4.3.2 Implementing Files
        1. Contiguous Allocation
        2. Linked-List Allocation
        3. Linked-List Allocation Using a Table in Memory
        4. I-nodes
      3. 4.3.3 Implementing Directories
      4. 4.3.4 Shared Files
      5. 4.3.5 Log-Structured File Systems
      6. 4.3.6 Journaling File Systems
      7. 4.3.7 Flash-based File Systems
      8. 4.3.8 Virtual File Systems
    4. 4.4 File-System Management and Optimization
      1. 4.4.1 Disk-Space Management
        1. Block Size
        2. Keeping Track of Free Blocks
        3. Disk Quotas
      2. 4.4.2 File-System Backups
      3. 4.4.3 File-System Consistency
      4. 4.4.4 File-System Performance
        1. Caching
        2. Block Read Ahead
        3. Reducing Disk-Arm Motion
      5. 4.4.5 Defragmenting Disks
      6. 4.4.6 Compression and Deduplication
      7. 4.4.7 Secure File Deletion and Disk Encryption
    5. 4.5 Example File Systems
      1. 4.5.1 The MS-DOS File System
      2. 4.5.2 The UNIX V7 File System
    6. 4.6 Research on File Systems
    7. 4.7 Summary
    8. Problems
  10. 5 Input/Output
    1. 5.1 Principles of I/O Hardware
      1. 5.1.1 I/O Devices
      2. 5.1.2 Device Controllers
      3. 5.1.3 Memory-Mapped I/O
      4. 5.1.4 Direct Memory Access
      5. 5.1.5 Interrupts Revisited
        1. Precise and Imprecise Interrupts
    2. 5.2 Principles of I/O Software
      1. 5.2.1 Goals of the I/O Software
      2. 5.2.2 Programmed I/O
      3. 5.2.3 Interrupt-Driven I/O
      4. 5.2.4 I/O Using DMA
    3. 5.3 I/O Software Layers
      1. 5.3.1 Interrupt Handlers
      2. 5.3.2 Device Drivers
      3. 5.3.3 Device-Independent I/O Software
        1. Uniform Interfacing for Device Drivers
        2. Buffering
        3. Error Reporting
        4. Allocating and Releasing Dedicated Devices
        5. Device-Independent Block Size
      4. 5.3.4 User-Space I/O Software
    4. 5.4 Mass Storage: Disk and SSD
      1. 5.4.1 Magnetic Disks
        1. Disk Formatting
        2. Disk Arm Scheduling Algorithms
        3. Error Handling
      2. 5.4.2 Solid State Drives (SSDs)
        1. Stable Storage
      3. 5.4.3 RAID
    5. 5.5 Clocks
      1. 5.5.1 Clock Hardware
      2. 5.5.2 Clock Software
      3. 5.5.3 Soft Timers
    6. 5.6 User Interfaces: Keyboard, Mouse, & Monitor
      1. 5.6.1 Input Software
        1. Keyboard Software
        2. Mouse Software
        3. Trackpads
      2. 5.6.2 Output Software
        1. Text Windows
        2. The X Window System
        3. Graphical User Interfaces
        4. Bitmaps
        5. Fonts
        6. Touch Screens
    7. 5.7 Thin Clients
    8. 5.8 Power Management
      1. 5.8.1 Hardware Issues
      2. 5.8.2 Operating System Issues
        1. The Display
        2. The Hard Disk
        3. The CPU
        4. The Memory
        5. Wireless Communication
        6. Thermal Management
        7. Battery Management
        8. Driver Interface
      3. 5.8.3 Application Program Issues
    9. 5.9 Research on Input/Output
    10. 5.10 Summary
    11. Problems
  11. 6 Deadlocks
    1. 6.1 Resources
      1. 6.1.1 Preemptable and Nonpreemptable Resources
      2. 6.1.2 Resource Acquisition
      3. 6.1.3 The Dining Philosophers Problem
    2. 6.2 Introduction to Deadlocks
      1. 6.2.1 Conditions for Resource Deadlocks
      2. 6.2.2 Deadlock Modeling
    3. 6.3 The Ostrich Algorithm
    4. 6.4 Deadlock Detection and Recovery
      1. 6.4.1 Deadlock Detection with One Resource of Each Type
      2. 6.4.2 Deadlock Detection with Multiple Resources of Each Type
      3. 6.4.3 Recovery from Deadlock
        1. Recovery through Preemption
        2. Recovery through Rollback
        3. Recovery through Killing Processes
    5. 6.5 Deadlock Avoidance
      1. 6.5.1 Resource Trajectories
      2. 6.5.2 Safe and Unsafe States
      3. 6.5.3 The Banker’s Algorithm for a Single Resource
      4. 6.5.4 The Banker’s Algorithm for Multiple Resources
    6. 6.6 Deadlock Prevention
      1. 6.6.1 Attacking the Mutual-Exclusion Condition
      2. 6.6.2 Attacking the Hold-and-Wait Condition
      3. 6.6.3 Attacking the No-Preemption Condition
      4. 6.6.4 Attacking the Circular Wait Condition
    7. 6.7 Other Issues
      1. 6.7.1 Two-Phase Locking
      2. 6.7.2 Communication Deadlocks
      3. 6.7.3 Livelock
      4. 6.7.4 Starvation
    8. 6.8 Research on Deadlocks
    9. 6.9 Summary
    10. Problems
  12. 7 Virtualization and the Cloud
    1. 7.1 History
    2. 7.2 Requirements for Virtualization
    3. 7.3 Type 1 and Type 2 Hypervisors
    4. 7.4 Techniques for Efficient Virtualization
      1. 7.4.1 Virtualizing the Unvirtualizable
      2. 7.4.2 The Cost of Virtualization
    5. 7.5 Are Hypervisors Microkernels Done Right?
    6. 7.6 Memory Virtualization
    7. 7.7 I/O Virtualization
    8. 7.8 Virtual Machines on Multicore CPUS
    9. 7.9 Clouds
      1. 7.9.1 Clouds as a Service
      2. 7.9.2 Virtual Machine Migration
      3. 7.9.3 Checkpointing
    10. 7.10 OS-Level Virtualization
    11. 7.11 Case Study: Vmware
      1. 7.11.1 The Early History of VMware
      2. 7.11.2 VMware Workstation
      3. 7.11.3 Challenges in Bringing Virtualization to the x86
      4. 7.11.4 VMware Workstation: Solution Overview
        1. Virtualizing the x86 Architecture
        2. A Guest Operating System Centric Strategy
        3. The Virtual Hardware Platform
        4. The Role of the Host Operating System
      5. 7.11.5 The Evolution of VMware Workstation
      6. 7.11.6 ESX Server: VMware’s type 1 Hypervisor
    12. 7.12 Research on Virtualization and the Cloud
    13. 7.13 Summary
    14. Problems
  13. 8 Multiple Processor Systems
    1. 8.1 Multiprocessors
      1. 8.1.1 Multiprocessor Hardware
        1. UMA Multiprocessors with Bus-Based Architectures
        2. UMA Multiprocessors Using Crossbar Switches
        3. UMA Multiprocessors Using Multistage Switching Networks
        4. NUMA Multiprocessors
        5. Multicore Chips
        6. Manycore Chips
        7. Heterogeneous Multicores
        8. Programming with Multiple Cores
        9. Simultaneous Multithreading
      2. 8.1.2 Multiprocessor Operating System Types
        1. Each CPU Has Its Own Operating System
        2. Leader-Follower Multiprocessors
        3. Symmetric Multiprocessors
      3. 8.1.3 Multiprocessor Synchronization
        1. Spinning vs. Switching
      4. 8.1.4 Multiprocessor Scheduling
        1. Time Sharing
        2. Space Sharing
        3. Gang Scheduling
        4. Scheduling for Security
    2. 8.2 Multicomputers
      1. 8.2.1 Multicomputer Hardware
        1. Interconnection Technology
        2. Network Interfaces
      2. 8.2.2 Low-Level Communication Software
        1. Node-to-Network Interface Communication
        2. Remote Direct Memory Access
      3. 8.2.3 User-Level Communication Software
        1. Send and Receive
        2. Blocking Versus Nonblocking Calls
      4. 8.2.4 Remote Procedure Call
        1. Implementation Issues
      5. 8.2.5 Distributed Shared Memory
        1. Replication
        2. False Sharing
        3. Achieving Sequential Consistency
      6. 8.2.6 Multicomputer Scheduling
      7. 8.2.7 Load Balancing
        1. A Graph-Theoretic Deterministic Algorithm
        2. A Sender-Initiated Distributed Heuristic Algorithm
        3. A Receiver-Initiated Distributed Heuristic Algorithm
    3. 8.3 Distributed Systems
      1. 8.3.1 Network Hardware
        1. Ethernet
        2. The Internet
      2. 8.3.2 Network Services and Protocols
        1. Network Services
        2. Network Protocols
      3. 8.3.3 Document-Based Middleware
      4. 8.3.4 File-System-Based Middleware
        1. Transfer Model
        2. The Directory Hierarchy
        3. Naming Transparency
        4. Semantics of File Sharing
      5. 8.3.5 Object-Based Middleware
      6. 8.3.6 Coordination-Based Middleware
        1. Publish/Subscribe
    4. 8.4 Research on Multiple Processor Systems
    5. 8.5 Summary
    6. Problems
  14. 9 Security
    1. 9.1 Fundamentals of Operating System Security
      1. 9.1.1 The CIA Security Triad
      2. 9.1.2 Security Principles
      3. 9.1.3 Security of the Operating System Structure
      4. 9.1.4 Trusted Computing Base
      5. 9.1.5 Attackers
      6. 9.1.6 Can We Build Secure Systems?
    2. 9.2 Controlling Access to Resources
      1. 9.2.1 Protection Domains
      2. 9.2.2 Access Control Lists
      3. 9.2.3 Capabilities
    3. 9.3 Formal Models of Secure Systems
      1. 9.3.1 Multilevel Security
        1. The Bell-LaPadula Model
        2. The Biba Model
      2. 9.3.2 Cryptography
        1. Secret-Key Cryptography
        2. Public-Key Cryptography
        3. Digital Signatures
      3. 9.3.3 Trusted Platform Modules
    4. 9.4 Authentication
      1. 9.4.1 Passwords
        1. Weak Passwords
        2. UNIX Password Security
        3. One-Time Passwords
        4. Challenge-Response Authentication
      2. 9.4.2 Authentication Using a Physical Object
      3. 9.4.3 Authentication Using Biometrics
    5. 9.5 Exploiting Software
      1. 9.5.1 Buffer Overflow Attacks
        1. Stack Canaries
        2. Avoiding Stack Canaries
        3. Data Execution Prevention
        4. Code Reuse Attacks
        5. Address-Space Layout Randomization
        6. Bypassing ASLR
        7. Non-Control-Flow Diverting Attacks
        8. Buffer Overflows—The Not So Final Word
      2. 9.5.2 Format String Attacks
      3. 9.5.3 Use-After-Free Attacks
      4. 9.5.4 Type Confusion Vulnerabilities
      5. 9.5.5 Null Pointer Dereference Attacks
      6. 9.5.6 Integer Overflow Attacks
      7. 9.5.7 Command Injection Attacks
      8. 9.5.8 Time of Check to Time of Use Attacks
      9. 9.5.9 Double Fetch Vulnerability
    6. 9.6 Exploiting Hardware
      1. 9.6.1 Covert Channels
      2. 9.6.2 Side Channels
      3. 9.6.3 Transient Execution Attacks
        1. Transient Execution Attacks Based on Faults
        2. Transient Execution Attacks Based on Speculation
    7. 9.7 Insider Attacks
      1. 9.7.1 Logic Bombs
      2. 9.7.2 Back Doors
      3. 9.7.3 Login Spoofing
    8. 9.8 Operating System Hardening
      1. 9.8.1 Fine-Grained Randomization
      2. 9.8.2 Control-Flow Restrictions
      3. 9.8.3 Access Restrictions
      4. 9.8.4 Code and Data Integrity Checks
      5. 9.8.5 Remote Attestation Using a Trusted Platform Module
      6. 9.8.6 Encapsulating Untrusted Code
        1. Sandboxing
    9. 9.9 Research on Security
    10. 9.10 Summary
    11. Problems
  15. 10 Case Study 1: UNIX, Linux, and Android
    1. 10.1 History of UNIX and Linux
      1. 10.1.1 UNICS
      2. 10.1.2 PDP-11 UNIX
      3. 10.1.3 Portable UNIX
      4. 10.1.4 Berkeley UNIX
      5. 10.1.5 Standard UNIX
      6. 10.1.6 MINIX
      7. 10.1.7 Linux
    2. 10.2 Overview of Linux
      1. 10.2.1 Linux Goals
      2. 10.2.2 Interfaces to Linux
      3. 10.2.3 The Shell
      4. 10.2.4 Linux Utility Programs
      5. 10.2.5 Kernel Structure
    3. 10.3 Processes in Linux
      1. 10.3.1 Fundamental Concepts
      2. 10.3.2 Process-Management System Calls in Linux
      3. 10.3.3 Implementation of Processes and Threads in Linux
        1. Threads in Linux
      4. 10.3.4 Scheduling in Linux
      5. 10.3.5 Synchronization in Linux
      6. 10.3.6 Booting Linux
    4. 10.4 Memory Management in Linux
      1. 10.4.1 Fundamental Concepts
      2. 10.4.2 Memory Management System Calls in Linux
      3. 10.4.3 Implementation of Memory Management in Linux
        1. Physical Memory Management
        2. Memory-Allocation Mechanisms
        3. Virtual Address-Space Representation
      4. 10.4.4 Paging in Linux
        1. The Page Replacement Algorithm
    5. 10.5 Input/Output in Linux
      1. 10.5.1 Fundamental Concepts
      2. 10.5.2 Networking
      3. 10.5.3 Input/Output System Calls in Linux
      4. 10.5.4 Implementation of Input/Output in Linux
      5. 10.5.5 Modules in Linux
    6. 10.6 The Linux File System
      1. 10.6.1 Fundamental Concepts
      2. 10.6.2 File-System Calls in Linux
      3. 10.6.3 Implementation of the Linux File System
        1. The Linux Virtual File System
        2. The Linux Ext2 File System
        3. The Linux Ext4 File System
        4. The /proc File System
      4. 10.6.4 NFS: The Network File System
        1. NFS Architecture
        2. NFS Protocols
        3. NFS Implementation
        4. NFS Version 4
    7. 10.7 Security in Linux
      1. 10.7.1 Fundamental Concepts
      2. 10.7.2 Security System Calls in Linux
      3. 10.7.3 Implementation of Security in Linux
    8. 10.8 Android
      1. 10.8.1 Android and Google
      2. 10.8.2 History of Android
        1. Early Development
        2. Android 1.0
        3. Continued Development
      3. 10.8.3 Design Goals
      4. 10.8.4 Android Architecture
      5. 10.8.5 Linux Extensions
        1. Wake Locks
        2. Out-of-Memory Killer
      6. 10.8.6 Art
      7. 10.8.7 Binder IPC
        1. Binder Kernel Module
        2. Binder User-Space API
        3. Binder Interfaces and AIDL
      8. 10.8.8 Android Applications
        1. Activities
        2. Services
        3. Receivers
        4. Content Providers
      9. 10.8.9 Intents
      10. 10.8.10 Process Model
        1. Starting Processes
        2. Process Lifecycle
        3. Process Dependencies
      11. 10.8.11 Security and Privacy
        1. Application Sandboxes
        2. Permissions
        3. SELinux and Defense in Depth
        4. Privacy and Permissions
        5. Evolving Runtime Permissions
      12. 10.8.12 Background Execution and Social Engineering
    9. 10.9 Summary
    10. Problems
  16. 11 Case Study 2: Windows 11
    1. 11.1 History of Windows Through Windows 11
      1. 11.1.1 1980s: MS-DOS
      2. 11.1.2 1990s: MS-DOS-based Windows
      3. 11.1.3 2000s: NT-based Windows
      4. 11.1.4 Windows Vista
      5. 11.1.5 Windows 8
      6. 11.1.6 Windows 10
      7. 11.1.7 Windows 11
    2. 11.2 Programming Windows
      1. 11.2.1 Universal Windows Platform
      2. 11.2.2 Windows Subsystems
      3. 11.2.3 The Native NT Application Programming Interface
      4. 11.2.4 The Win32 Application Programming Interface
      5. 11.2.5 The Windows Registry
    3. 11.3 System Structure
      1. 11.3.1 Operating System Structure
        1. The Hypervisor
        2. The Hardware Abstraction Layer
        3. The Kernel Layer
        4. Deferred Procedure Calls
        5. Asynchronous Procedure Calls
        6. Dispatcher Objects
        7. The Executive Layer
        8. The Device Drivers
      2. 11.3.2 Booting Windows
      3. 11.3.3 Implementation of the Object Manager
        1. Handles
        2. The Object Namespace
        3. Object Types
      4. 11.3.4 Subsystems, DLLs, and User-Mode Services
    4. 11.4 Processes and Threads in Windows
      1. 11.4.1 Fundamental Concepts
        1. Processes
        2. Jobs and Fibers
        3. Thread Pools
        4. Threads
      2. 11.4.2 Job, Process, Thread, and Fiber Management API Calls
        1. Interprocess Communication
        2. Synchronization
      3. 11.4.3 Implementation of Processes and Threads
        1. Scheduling
      4. 11.4.4 WoW64 and Emulation
        1. WoW64 Design
        2. x64 Emulation on arm64
    5. 11.5 Memory Management
      1. 11.5.1 Fundamental Concepts
        1. Virtual Address Allocation
        2. Pagefiles
      2. 11.5.2 Memory-Management System Calls
      3. 11.5.3 Implementation of Memory Management
        1. Page-Fault Handling
        2. Page Tables
        3. The Page Replacement Algorithm
        4. Physical Memory Management
        5. Page Combining
      4. 11.5.4 Memory Compression
      5. 11.5.5 Memory Partitions
    6. 11.6 Caching in Windows
    7. 11.7 Input/Output in Windows
      1. 11.7.1 Fundamental Concepts
      2. 11.7.2 Input/Output API Calls
      3. 11.7.3 Implementation of I/O
        1. Device Drivers
        2. I/O Request Packets
        3. Device Stacks
    8. 11.8 The Windows NT File System
      1. 11.8.1 Fundamental Concepts
      2. 11.8.2 Implementation of the NT File System
        1. File System Structure
        2. Storage Allocation
        3. File Compression
        4. Journaling
        5. File Encryption
    9. 11.9 Windows Power Management
    10. 11.10 Virtualization in Windows
      1. 11.10.1 Hyper-V
        1. Hypervisor
        2. The Virtualization Stack
        3. Device I/O
        4. VA-backed VMs
      2. 11.10.2 Containers
        1. Namespace Virtualization
        2. Hyper-V Isolated Containers
        3. Hardware Isolated Processes
      3. 11.10.3 Virtualization-Based Security
    11. 11.11 Security in Windows
      1. 11.11.1 Fundamental Concepts
      2. 11.11.2 Security API Calls
      3. 11.11.3 Implementation of Security
      4. 11.11.4 Security Mitigations
        1. Eliminating Vulnerabilities
        2. Breaking Exploitation Techniques
        3. Containing Damage
        4. Limiting Window of Time to Exploit
        5. Antimalware
    12. 11.12 Summary
    13. Problems
  17. 12 Operating System Design
    1. 12.1 The Nature of the Design Problem
      1. 12.1.1 Goals
      2. 12.1.2 Why Is It Hard to Design an Operating System?
    2. 12.2 Interface Design
      1. 12.2.1 Guiding Principles
        1. Principle 1: Simplicity
        2. Principle 2: Completeness
        3. Principle 3: Efficiency
      2. 12.2.2 Paradigms
        1. User-Interface Paradigms
        2. Execution Paradigms
        3. Data Paradigms
      3. 12.2.3 The System-Call Interface
    3. 12.3 Implementation
      1. 12.3.1 System Structure
        1. Layered Systems
        2. Exokernels
        3. Microkernel-Based Client-Server Systems
        4. Kernel Threads
      2. 12.3.2 Mechanism vs. Policy
      3. 12.3.3 Orthogonality
      4. 12.3.4 Naming
      5. 12.3.5 Binding Time
      6. 12.3.6 Static vs. Dynamic Structures
      7. 12.3.7 Top-Down vs. Bottom-Up Implementation
      8. 12.3.8 Synchronous vs. Asynchronous Communication
      9. 12.3.9 Useful Techniques
        1. Hiding the Hardware
        2. Indirection
        3. Reusability
        4. Reentrancy
        5. Brute Force
        6. Check for Errors First
    4. 12.4 Performance
      1. 12.4.1 Why Are Operating Systems Slow?
      2. 12.4.2 What Should Be Optimized?
      3. 12.4.3 Space-Time Trade-offs
      4. 12.4.4 Caching
      5. 12.4.5 Hints
      6. 12.4.6 Exploiting Locality
      7. 12.4.7 Optimize the Common Case
    5. 12.5 Project Management
      1. 12.5.1 The Mythical Man Month
      2. 12.5.2 Team Structure
      3. 12.5.3 The Role of Experience
      4. 12.5.4 No Silver Bullet
    6. Problems
  18. 13 Reading List and Bibliography
    1. 13.1 Suggestions for Further Reading
      1. 13.1.1 Introduction
      2. 13.1.2 Processes and Threads
      3. 13.1.3 Memory Management
      4. 13.1.4 File Systems
      5. 13.1.5 Input/Output
      6. 13.1.6 Deadlocks
      7. 13.1.7 Virtualization and the Cloud
      8. 13.1.8 Multiple Processor Systems
      9. 13.1.9 Security
      10. 13.1.10 Case Study 1: UNIX, Linux, and Android
      11. 13.1.11 Case Study 2: Windows
      12. 13.1.12 Operating System Design
    2. 13.2 Alphabetical Bibliography
  19. Index
    1. A
    2. B
    3. C
    4. D
    5. E
    6. F
    7. G
    8. H
    9. I
    10. J
    11. K
    12. L
    13. M
    14. N
    15. O
    16. P
    17. Q
    18. R
    19. S
    20. T
    21. U
    22. V
    23. W
    24. X
    25. Z

List of Figures

  1. Figure 1-1: Where the operating system fits in.
  2. Figure 1-2: Operating systems turn awful hardware into beautiful abstractions.
  3. Figure 1-3: An early batch system. (a) Programmers bring cards to 1401. (b) 1401 reads batch of jobs onto tape. (c) Operator carries input tape to 7094. (d) 7094 does computing. (e) Operator carries output tape to 1401. (f) 1401 prints output.
  4. Figure 1-4: Structure of a typical FMS job.
  5. Figure 1-5: A multiprogramming system with three jobs in memory.
  6. Figure 1-6: Some of the components of a simple personal computer.
  7. Figure 1-7: (a) A three-stage pipeline. (b) A superscalar CPU.
  8. Figure 1-8: (a) A quad-core chip with a shared L2 cache. (b) A quad-core chip with separate L2 caches.
  9. Figure 1-9: A typical memory hierarchy. The numbers are very rough approximations.
  10. Figure 1-10: Structure of a disk drive.
  11. Figure 1-11: (a) The steps in starting an I/O device and getting an interrupt. (b) Interrupt processing involves taking the interrupt, running the interrupt handler, and returning to the user program.
  12. Figure 1-12: The structure of a large x86 system.
  13. Figure 1-13: A process tree. Process A created two child processes, B and C. Process B created three child processes, D, E, and F.
  14. Figure 1-14: A file system for a university department.
  15. Figure 1-15: (a) Before mounting, the files on the USB drive are not accessible. (b) After mounting, they are part of the file hierarchy.
  16. Figure 1-16: Two processes connected by a pipe.
  17. Figure 1-17: The 10 steps in making the system call read(fd, buffer, nbytes).
  18. Figure 1-19: A stripped-down shell. Throughout this book, TRUE is assumed to be defined as 1.
  19. Figure 1-20: Processes have three segments: text, data, and stack.
  20. Figure 1-21: (a) Two directories before linking /usr/jim/memo to ast’s directory. (b) The same directories after linking.
  21. Figure 1-22: (a) File system before the mount. (b) File system after the mount.
  22. Figure 1-24: A simple structuring model for a monolithic system.
  23. Figure 1-26: Simplified structure of the MINIX system.
  24. Figure 1-27: The client-server model over a network.
  25. Figure 1-28: The structure of VM/370 with CMS.
  26. Figure 1-29: (a) A type 1 hypervisor. (b) A pure type 2 hypervisor. (c) A practical type 2 hypervisor.
  27. Figure 1-30: The process of compiling C and header files to make an executable.
  28. Figure 2-1: (a) Multiprogramming four programs. (b) Conceptual model of four independent, sequential processes. (c) Only one program is active at once.
  29. Figure 2-2: A process can be in running, blocked, or ready state. Transitions between these states are as shown.
  30. Figure 2-3: The lowest layer of a process-structured operating system handles interrupts and scheduling. Above that layer are sequential processes.
  31. Figure 2-6: CPU utilization as a function of the number of processes in memory.
  32. Figure 2-7: A word processor with three threads.
  33. Figure 2-8: A multithreaded Web server.
  34. Figure 2-9: A rough outline of the code for Fig. 2-8. (a) Dispatcher thread.(b) Worker thread.
  35. Figure 2-10: (a) Three processes each with one thread. (b) One process with three threads.
  36. Figure 2-12: Each thread has its own stack.
  37. Figure 2-14: An example program using threads.
  38. Figure 2-15: (a) A user-level threads package. (b) A threads package managed by the kernel.
  39. Figure 2-16: Multiplexing user-level threads onto kernel-level threads.
  40. Figure 2-17: Conflicts between threads over the use of a global variable.
  41. Figure 2-18: Threads can have private global variables.
  42. Figure 2-19: An event-driven thank-you server (pseudo code).
  43. Figure 2-21: Two processes want to access shared memory at the same time.
  44. Figure 2-22: Mutual exclusion using critical regions.
  45. Figure 2-23: A proposed solution to the critical-region problem. (a) Process 0. (b) Process 1. In both cases, be sure to note the semicolons terminating the while statements.
  46. Figure 2-24: Peterson’s solution for achieving mutual exclusion.
  47. Figure 2-25: Entering and leaving a critical region using the TSL instruction.
  48. Figure 2-26: Entering and leaving a critical region using the XCHG instruction.
  49. Figure 2-27: The producer-consumer problem with a fatal race condition.
  50. Figure 2-28: The producer-consumer problem using semaphores.
  51. Figure 2-29: A solution to the readers and writers problem.
  52. Figure 2-30: Implementation of mutex_lock and mutex_unlock.
  53. Figure 2-33: Using threads to solve the producer-consumer problem.
  54. Figure 2-34: A monitor.
  55. Figure 2-35: An outline of the producer-consumer problem with monitors. Only one monitor procedure at a time is active. The buffer has N slots.
  56. Figure 2-36: A solution to the producer-consumer problem in Java.
  57. Figure 2-37: The producer-consumer problem with N messages.
  58. Figure 2-38: Use of a barrier. (a) Processes approaching a barrier. (b) All processes but one blocked at the barrier. (c) When the last process arrives at the barrier, all of them are let through.
  59. Figure 2-39: Read-Copy-Update: inserting a node in the tree and then removing a branch—all without locks.
  60. Figure 2-40: Bursts of CPU usage alternate with periods of waiting for I/O. (a) A CPU-bound process. (b) An I/O-bound process.
  61. Figure 2-41: Some goals of the scheduling algorithm under different circumstances.
  62. Figure 2-42: An example of shortest-job-first scheduling. (a) Running four jobs in the original order. (b) Running them in shortest-job-first order.
  63. Figure 2-43: Round-robin scheduling. (a) The list of runnable processes. (b)The list of runnable processes after B uses up its quantum.
  64. Figure 2-44: A scheduling algorithm with four priority classes.
  65. Figure 2-45: (a) Possible scheduling of user-level threads with a 50-msec process quantum and threads that run 5 msec per CPU burst. (b) Possible scheduling of kernel-level threads with the same characteristics as (a).
  66. Figure 3-1: Three simple ways of organizing memory with an operating system and one user process. Other possibilities also exist.
  67. Figure 3-2: Illustration of the relocation problem. (a) A 16-KB program. (b) Another 16-KB program. (c) The two programs loaded consecutively into memory.
  68. Figure 3-3: Base and limit registers can be used to give each process a separate address space.
  69. Figure 3-4: Memory allocation changes as processes come into memory and leave it. The shaded regions are unused memory.
  70. Figure 3-5: (a) Allocating space for a growing data segment. (b) Allocating space for a growing stack and a growing data segment.
  71. Figure 3-6: (a) A part of memory with five processes and three holes. The tick marks show the memory allocation units. The shaded regions (0 in the bitmap) are free. (b) The corresponding bitmap. (c) The same information as a list.
  72. Figure 3-7: Four neighbor combinations for the terminating process, X.
  73. Figure 3-8: The position and function of the MMU. Here the MMU is shown as being a part of the CPU chip because it commonly is nowadays. However, logically it could be a separate chip and was years ago.
  74. Figure 3-9: The relation between virtual addresses and physical memory addresses is given by the page table. Every page begins on a multiple of 4096 and ends 4095 addresses higher, so 4K–8K really means 4096–8191 and 8K–12K means 8192–12287.
  75. Figure 3-10: The internal operation of the MMU with 16 4-KB pages.
  76. Figure 3-11: A typical page table entry.
  77. Figure 3-13: (a) A 32-bit address with two page table fields. (b) Two-level page tables.
  78. Figure 3-14: Comparison of a traditional page table with an inverted page table.
  79. Figure 3-15: Operation of second chance. (a) Pages sorted in FIFO order. (b) Page list if a page fault occurs at time 20 and A has its R bit set. The numbers above the pages are their load times.
  80. Figure 3-16: The clock page replacement algorithm.
  81. Figure 3-17: The aging algorithm simulates LRU in software. Shown are six pages for five clock ticks. The five clock ticks are represented by (a) to (e).
  82. Figure 3-18: The working set is the set of pages used by the k most recent memory references. The function w(k, t) is the size of the working set at time t.
  83. Figure 3-19: The working set algorithm.
  84. Figure 3-20: Operation of the WSClock algorithm. (a) and (b) give an example of what happens when R=1. (c) and (d) give an example of R=0.
  85. Figure 3-22: Local versus global page replacement. (a) Original configuration. (b) Local page replacement. (c) Global page replacement.
  86. Figure 3-23: Page fault rate as a function of the number of page frames assigned.
  87. Figure 3-24: (a) One address space. (b) Separate I and D spaces.
  88. Figure 3-25: Two processes sharing the same program sharing its page tables.
  89. Figure 3-26: A shared library being used by two processes.
  90. Figure 3-27: An instruction causing a page fault.
  91. Figure 3-28: (a) Paging to a static swap area. (b) Backing up pages dynamically.
  92. Figure 3-29: Page fault handling with an external pager.
  93. Figure 3-30: In a one-dimensional address space with growing tables, one table may bump into another.
  94. Figure 3-31: A segmented memory allows each table to grow or shrink independently of the other tables.
  95. Figure 3-32: Comparison of paging and segmentation.
  96. Figure 3-33: (a)–(d) Development of checkerboarding. (e) Removal of the checkerboarding by compaction.
  97. Figure 3-34: The MULTICS virtual memory. (a) The descriptor segment pointed to the page tables. (b) A segment descriptor. The numbers are the field lengths.
  98. Figure 3-35: A 34-bit MULTICS virtual address.
  99. Figure 3-36: Conversion of a two-part MULTICS address into a main memory address.
  100. Figure 3-37: A simplified version of the MULTICS TLB. The existence of two page sizes made the actual TLB more complicated.
  101. Figure 4-2: Three kinds of files. (a) Byte sequence. (b) Record sequence. (c) Tree.
  102. Figure 4-3: (a) An executable file. (b) An archive.
  103. Figure 4-6: A simple program to copy a file.
  104. Figure 4-7: A single-level directory system containing four files.
  105. Figure 4-8: A hierarchical directory system.
  106. Figure 4-9: A UNIX directory tree.
  107. Figure 4-10: A possible file-system layout.
  108. Figure 4-11: Layout for UEFI with partition table.
  109. Figure 4-12: (a) Contiguous allocation of disk space for seven files. (b) The state of the disk after files D and F have been removed.
  110. Figure 4-13: Storing a file as a linked list of disk blocks.
  111. Figure 4-14: Linked-list allocation using a file-allocation table in main memory.
  112. Figure 4-15: An example i-node.
  113. Figure 4-16: (a) A simple directory containing fixed-size entries with the disk addresses and attributes in the directory entry. (b) A directory in which each entry justrefers to an i-node.
  114. Figure 4-17: Two ways of handling long file names in a directory. (a) In-line. (b) In a heap.
  115. Figure 4-18: File system containing a shared file.
  116. Figure 4-19: (a) Situation prior to linking. (b) After the link is created. (c) After the original owner removes the file.
  117. Figure 4-20: Components inside a typical flash SSD.
  118. Figure 4-21: Position of the virtual file system.
  119. Figure 4-22: A simplified view of the data structures and code used by the VFS and concrete file system to do a read.
  120. Figure 4-23: The dashed curve (left-hand scale) gives the data rate of a disk. The solid curve (right-hand scale) gives the disk-space efficiency. All files are 4 KB.
  121. Figure 4-24: (a) Storing the free list on a linked list. (b) A bitmap.
  122. Figure 4-25: (a) An almost-full block of pointers to free disk blocks in memory and three blocks of pointers on disk. (b) Result of freeing a three-block file. (c) An alternative strategy for handling the three free blocks. The shaded entries represent pointers to free disk blocks.
  123. Figure 4-26: Quotas are kept track of on a per-user basis in a quota table.
  124. Figure 4-27: A file system to be dumped. The squares are directories and the circles are files. The shaded items have been modified since the last dump. Each directory and file is labeled by its i-node number.
  125. Figure 4-28: Bitmaps used by the logical dumping algorithm.
  126. Figure 4-29: File-system states. (a) Consistent. (b) Missing block. (c) Duplicate block in free list. (d) Duplicate data block.
  127. Figure 4-30: The buffer cache data structures.
  128. Figure 4-31: (a) I-nodes placed at the start of the disk. (b) Disk divided into cylinder groups, each with its own blocks and i-nodes.
  129. Figure 4-32: The MS-DOS directory entry.
  130. Figure 4-34: A UNIX V7 directory entry.
  131. Figure 4-35: A UNIX i-node.
  132. Figure 4-36: The steps in looking up /usr/ast/mbox.
  133. Figure 5-2: (a) Separate I/O and memory space. (b) Memory-mapped I/O. (c) Hybrid.
  134. Figure 5-3: (a) A single-bus architecture. (b) A dual-bus memory architecture.
  135. Figure 5-4: Operation of a DMA transfer.
  136. Figure 5-5: How an interrupt happens. The connections between the devices and the controller actually use interrupt lines on the bus rather than dedicated wires.
  137. Figure 5-6: (a) A precise interrupt. (b) An imprecise interrupt.
  138. Figure 5-7: Steps in printing a string.
  139. Figure 5-8: Writing a string to the printer using programmed I/O.
  140. Figure 5-9: Writing a string to the printer using interrupt-driven I/O. (a) Code executed at the time the print system call is made. (b) Interrupt service procedure for the printer.
  141. Figure 5-10: Printing a string using DMA. (a) Code executed when the print system call is made. (b) Interrupt-service procedure.
  142. Figure 5-11: Layers of the I/O software system.
  143. Figure 5-12: Logical positioning of device drivers. In reality, all communication between drivers and device controllers goes over the bus.
  144. Figure 5-14: (a) Without a standard driver interface. (b) With a standard driver interface.
  145. Figure 5-15: (a) Unbuffered input. (b) Buffering in user space. (c) Buffering in the kernel followed by copying to user space. (d) Double buffering in the kernel.
  146. Figure 5-16: Networking may involve many copies of a packet.
  147. Figure 5-17: Layers of the I/O system and the main functions of each layer.
  148. Figure 5-18: (a) Physical geometry of a disk with two zones. (b) A possible virtual geometry for this disk.
  149. Figure 5-19: A disk sector.
  150. Figure 5-20: An illustration of cylinder skew.
  151. Figure 5-21: (a) No interleaving. (b) Single interleaving. (c) Double interleaving.
  152. Figure 5-22: Shortest Seek First (SSF) disk scheduling algorithm.
  153. Figure 5-23: The elevator algorithm for scheduling disk requests.
  154. Figure 5-24: (a) A disk track with a bad sector. (b) Substituting a spare for the bad sector. (c) Shifting all the sectors to bypass the bad one.
  155. Figure 5-25: Analysis of the influence of crashes on stable writes.
  156. Figure 5-26: RAID levels 0 through 6. Backup and parity drives are shown shaded.
  157. Figure 5-27: A programmable clock.
  158. Figure 5-28: Three ways to maintain the time of day.
  159. Figure 5-29: Simulating multiple timers with a single clock.
  160. Figure 5-33: Clients and servers in the M.I.T. X Window System.
  161. Figure 5-34: A skeleton of an X Window application program.
  162. Figure 5-35: A sample window on the authors’ machine on a 1920×1080 display.
  163. Figure 5-36: A skeleton of a Windows main program.
  164. Figure 5-37: An example rectangle drawn using Rectangle. Each box represents one pixel.
  165. Figure 5-38: Copying bitmaps using BitBlt. (a) Before. (b) After.
  166. Figure 5-39: Some examples of character outlines at different point sizes.
  167. Figure 5-40: (a) Running at full clock speed. (b) Cutting voltage by two cuts clock speed by two and power consumption by four.
  168. Figure 6-1: Using a semaphore to protect resources. (a) One resource. (b) Two resources.
  169. Figure 6-2: (a) Deadlock-free code. (b) Code with a potential deadlock.
  170. Figure 6-3: Lunch time in the Philosophy Department.
  171. Figure 6-4: A nonsolution to the dining philosophers problem.
  172. Figure 6-5: A solution to the dining philosophers problem.
  173. Figure 6-6: Resource -allocation graphs. (a) Holding a resource. (b) Requesting a resource. (c) Deadlock.
  174. Figure 6-7: An example of how deadlock occurs and how it can be avoided.
  175. Figure 6-8: (a) A resource graph. (b) A cycle extracted from (a).
  176. Figure 6-9: The four data structures needed by the deadlock detection algorithm.
  177. Figure 6-10: An example for the deadlock detection algorithm.
  178. Figure 6-11: Two process resource trajectories.
  179. Figure 6-12: Demonstration that the state in (a) is safe.
  180. Figure 6-13: Demonstration that the state in (b) is not safe.
  181. Figure 6-14: Three resource allocation states: (a) safe. (b) safe. (c) unsafe.
  182. Figure 6-15: The banker’s algorithm with multiple resources.
  183. Figure 6-16: (a) Numerically ordered resources. (b) A resource graph.
  184. Figure 6-18: A resource deadlock in a network.
  185. Figure 6-19: Polite processes that may cause livelock.
  186. The figure illustrates the state of a system with four processes.
  187. Figure 7-1: Location of type 1 and type 2 hypervisors.
  188. Figure 7-3: When the operating system in a virtual machine executes a kernelonly instruction, it traps to the hypervisor if virtualization technology is present.
  189. Figure 7-4: The binary translator rewrites the guest operating system running in ring 1, while the hypervisor runs in ring 0.
  190. Figure 7-5: True virtualization and paravirtualization.
  191. Figure 7-6: VMI Linux running on (a) the bare hardware, (b) VMware, and (c) Xen.
  192. Figure 7-7: Extended/nested page tables are walked every time a guest physical address is accessed—including the accesses for each level of the guest’s page tables.
  193. Figure 7-8: High-level components of the VMware virtual machine monitor (in the absence of hardware support).
  194. Figure 7-9: Virtual hardware configuration options of the early VMware Workstation, ca. 2000.
  195. Figure 7-10: The VMware Hosted Architecture and its three components: VMX, VMM driver, and VMM.
  196. Figure 7-11: Difference between a normal context switch and a world switch.
  197. Figure 7-12: ESX Server: VMware’s type 1 hypervisor.
  198. Figure 8-1: (a) A shared-memory multiprocessor. (b) A message-passing multicomputer. (c) A wide area distributed system.
  199. Figure 8-2: Three bus-based multiprocessors. (a) Without caching. (b) With caching. (c) With caching and private memories.
  200. Figure 8-3: (a) An 8×8 crossbar switch. (b) An open crosspoint. (c) A closed crosspoint.
  201. Figure 8-4: (a) A 2×2 switch with two input lines, A and B, and two output lines, X and Y. (b) A message format.
  202. Figure 8-5: An omega switching network.
  203. Figure 8-6: (a) A 256-node directory-based multiprocessor. (b) Division of a 32-bit memory address into fields. (c) The directory at node 36.
  204. Figure 8-7: Partitioning multiprocessor memory among four CPUs, but sharing a single copy of the operating system code. The boxes marked Data are the operating system’s private data for each CPU.
  205. Figure 8-8: A leader-follower multiprocessor model.
  206. Figure 8-9: The SMP multiprocessor model.
  207. Figure 8-10: The TSL instruction can fail if the bus cannot be locked. These four steps show a sequence of events where the failure is demonstrated.
  208. Figure 8-11: Use of multiple locks to avoid cache thrashing.
  209. Figure 8-12: Using a single data structure for scheduling a multiprocessor.
  210. Figure 8-13: A set of 32 CPUs split into four partitions, with two CPUs available.
  211. Figure 8-14: Communication between two threads belonging to thread A that are running out of phase.
  212. Figure 8-15: Gang scheduling.
  213. Figure 8-16: Various interconnect topologies. (a) A single switch. (b) A ring. (c) A grid. (d) A double torus. (e) A cube. (f) A 4D hypercube.
  214. Figure 8-17: Store-and-forward packet switching.
  215. Figure 8-18: Position of the network interface boards in a multicomputer.
  216. Figure 8-19: (a) A blocking send call. (b) A nonblocking send call.
  217. Figure 8-20: Steps in making a remote procedure call. The stubs are shaded.
  218. Figure 8-21: Various layers where shared memory can be implemented. (a) The hardware. (b) The operating system. (c) User-level software.
  219. Figure 8-22: (a) Pages of the address space distributed among four machines. (b) Situation after CPU 0 references page 10 and the page is moved there. (c) Situation if page 10 is read only and replication is used.
  220. Figure 8-23: False sharing of a page containing two unrelated variables.
  221. Figure 8-24: Two ways of allocating nine processes to three nodes.
  222. Figure 8-25: (a) An overloaded node looking for a lightly loaded node to hand off processes to. (b) An empty node looking for work to do.
  223. Figure 8-27: Positioning of middleware in a distributed system.
  224. Figure 8-28: (a) Classic Ethernet. (b) Switched Ethernet.
  225. Figure 8-29: A portion of the Internet.
  226. Figure 8-30: Six different types of network service.
  227. Figure 8-31: Accumulation of packet headers.
  228. Figure 8-32: The Web is a big directed graph of documents.
  229. Figure 8-33: (a) The upload/download model. (b) The remote-access model.
  230. Figure 8-34: (a) Two file servers. The squares are directories and the circles are files. (b) A system in which all clients have the same view of the file system. (c) A system in which different clients have different views of the file system.
  231. Figure 8-35: (a) Sequential consistency. (b) In a distributed system with caching, reading a file may return an obsolete value.
  232. Figure 8-36: Three Linda tuples.
  233. Figure 8-37: The publish/subscribe architecture.
  234. Figure 9-2: A reference monitor.
  235. Figure 9-3: Three protection domains.
  236. Figure 9-4: A protection matrix.
  237. Figure 9-5: A protection matrix with domains as objects.
  238. Figure 9-6: Use of access control lists to manage file access.
  239. Figure 9-8: When capabilities are used, each process has a capability list.
  240. Figure 9-9: A cryptographically protected capability.
  241. Figure 9-10: (a) An authorized state. (b) An unauthorized state.
  242. Figure 9-11: The Bell-LaPadula multilevel security model.
  243. Figure 9-12: Relationship between the plaintext and the ciphertext.
  244. Figure 9-13: (a) Computing a signature block. (b) What the receiver gets.
  245. Figure 9-16: Use of a smart card for authentication.
  246. Figure 9-17: (a) Situation when the main program is running. (b) After the procedure A has been called. (c) Buffer overflow shown in gray
  247. Figure 9-18: Skipping the stack canary: by modifying len first, the attack is able to bypass the canary and modify the return address directly.
  248. Figure 9-19: Return-oriented programming: linking gadgets.
  249. Figure 9-20: A format string vulnerability.
  250. Figure 9-21: A format string attack. By using exactly the right number of %08x, the attacker can use the first four characters of the format string as an address.
  251. Figure 9-22: Code that might lead to a command injection attack.
  252. Figure 9-23: (a) The client, server, and collaborator processes. (b) The encapsulated server can still leak to the collaborator via covert channels.
  253. Figure 9-24: A covert channel using file locking.
  254. Figure 9-25: Structure of an encryption routine which iterates over the bits in the key, taking different actions depending on the value of the bit.
  255. Figure 9-26: Cache side channel attack on Andy’s Messenger App.
  256. Figure 9-27: Meltdown: a user access kernel memory and uses it as an index.
  257. Figure 9-28: A value read by a faulting instruction still leaves a trace in the cache.
  258. Figure 9-29: Speculative execution: the CPU mispredicts the condition in Line 1 and executes Lines 2–3 speculatively, accessing memory that should be off-limits.
  259. Figure 9-30: Original Spectre attack on the kernel.
  260. Figure 9-31: (a) Normal code. (b) Code with a back door inserted.
  261. Figure 9-32: (a) Correct login screen. (b) Phony login screen.
  262. Figure 9-33: Address-space layout randomization: (a) coarse-grained (b) fine-grained
  263. Figure 9-34: Control-flow integrity (pseudo-code): (a) without CFI, (b) with CFI.
  264. Figure 9-35: Securing and verifying the boot process.
  265. Figure 9-36: (a) Memory divided into 16-MB sandboxes. (b) One way of checking an instruction for validity.
  266. Figure 10-1: The layers in a Linux system.
  267. Figure 10-3: Structure of the Linux kernel.
  268. Figure 10-4: Process creation in Linux.
  269. Figure 10-7: A highly simplified shell.
  270. Figure 10-8: The steps in executing the command ls typed to the shell.
  271. Figure 10-10: Illustration of Linux runqueue data structures for (a) the Linux O(1) scheduler, and (b) the Completely Fair Scheduler.
  272. Figure 10-11: The sequence of processes used to boot some Linux systems.
  273. Figure 10-12: (a) Process A’s virtual address space. (b) Physical memory. (c) Process B’s virtual address space.
  274. Figure 10-13: Two processes can share a mapped file.
  275. Figure 10-15: Linux’ main memory representation.
  276. Figure 10-16: Linux uses four-level page tables.
  277. Figure 10-17: Operation of the buddy algorithm.
  278. Figure 10-18: Page states considered in the page-frame replacement algorithm.
  279. Figure 10-19: The uses of sockets for networking.
  280. Figure 10-22: The Linux I/O system showing one file system in detail.
  281. Figure 10-24: (a) Before linking. (b) After linking.
  282. Figure 10-25: (a) Separate file systems. (b) After mounting.
  283. Figure 10-26: (a) A file with one lock. (b) Adding a second lock. (c) A third one.
  284. Figure 10-31: Disk layout of the Linux ext2 file system.
  285. Figure 10-32: (a) A Linux directory with three files. (b) The same directory after the file voluminous has been removed.
  286. Figure 10-34: The relation between the file-descriptor table, the open-filedescription table, and the i-node table.
  287. Figure 10-35: Examples of remote mounted file systems. Directories are shown as squares and files as circles.
  288. Figure 10-36: The NFS layer structure.
  289. Figure 10-39: Android process hierarchy.
  290. Figure 10-40: Publishing and interacting with system services.
  291. Figure 10-41: Creating a new ART process from zygote.
  292. Figure 10-42: Binder IPC architecture.
  293. Figure 10-43: Basic Binder IPC transaction.
  294. Figure 10-44: Binder cross-process object mapping.
  295. Figure 10-45: Transferring Binder objects between processes.
  296. Figure 10-46: Binder user-space API.
  297. Figure 10-47: Simple interface described in AIDL.
  298. Figure 10-48: Binder interface inheritance hierarchy.
  299. Figure 10-49: Full path of an AIDL-based Binder IPC.
  300. Figure 10-50: Basic service manager AIDL interface.
  301. Figure 10-51: Basic structure of AndroidManifest.xml.
  302. Figure 10-52: Starting an email application’s main activity.
  303. Figure 10-53: Starting the camera application after email.
  304. Figure 10-54: Removing the email process to reclaim RAM for the camera.
  305. Figure 10-55: Sharing a camera picture through the email application.
  306. Figure 10-56: Returning to the email application.
  307. Figure 10-57: Starting an application service.
  308. Figure 10-58: Interface for controlling a sync service’s sync interval.
  309. Figure 10-59: Binding to an application service.
  310. Figure 10-60: Sending a broadcast to application receivers.
  311. Figure 10-61: Interacting with a content provider.
  312. Figure 10-62: Steps in launching a new application process.
  313. Figure 10-67: Requesting and using a permission.
  314. Figure 10-68: Accessing data without a permission.
  315. Figure 10-69: Sharing a picture using a content provider.
  316. Figure 10-70: Adding a picture attachment using a content provider.
  317. Figure 10-71: The only thing most users care about security.
  318. Figure 10-72: Confirming permissions at install time (circa 2010)
  319. Figure 10-75: Android 6.0 runtime permission prompt.
  320. Figure 10-78: Android 10’s background vs. foreground location prompt.
  321. Figure 10-79: Android 11’s ‘‘only this once’’ prompt.
  322. Figure 10-80: Android 11’s location permission settings.
  323. Figure 10-81: Android 12’s coarse vs. fine prompt.
  324. Figure 10-82: Android 12’s privacy dashboard showing ‘‘location’’ details.
  325. Figure 10-83: Android’s early battery use screen.
  326. Figure 10-84: Doze and maintenance windows.
  327. Figure 11-3: The Win32 API allows programs to run on almost all versions of Windows.
  328. Figure 11-4: The programming layers in Modern Windows.
  329. Figure 11-5: The components used to build NT subsystems.
  330. Figure 11-11: Windows kernel-mode organization.
  331. Figure 11-12: Some of the hardware functions the HAL manages.
  332. Figure 11-13: Dispatcher_header data structure embedded in many executive objects (dispatcher objects).
  333. Figure 11-14: Simplified depiction of device stacks for two NTFS file volumes. The I/O request packet is passed from down the stack. The appropriate routines from the associated drivers are called at each level in the stack. The device stacks themselves consist of device objects allocated specifically to each stack.
  334. Figure 11-15: Structure of an executive object managed by the object manager.
  335. Figure 11-16: Handle table data structures for a minimal table using a single page for up to 512 handles.
  336. Figure 11-17: Handle-table data structures for a maximal table of up to 16 million handles.
  337. Figure 11-20: I/O and object manager steps for creating/opening a file and getting back a file handle.
  338. Figure 11-22: The relationship between jobs, processes, threads, and fibers. Jobs and fibers are optional; not all processes are in jobs or contain fibers.
  339. Figure 11-26: Windows supports 32 priorities for threads.
  340. Figure 11-27: An example of priority inversion.
  341. Figure 11-28: Native vs. WoW64 processes on an arm64 machine. Shaded areas indicate emulated code.
  342. Figure 11-29: Comparison of x86 and x64 emulation infrastructure on an arm64 machine. Shaded areas indicate emulated code.
  343. Figure 11-30: Virtual to physical address translation with a 4-level page table scheme implementing 48-bits of virtual address.
  344. Figure 11-31: Virtual address space layout for three 64-bit user processes. The white areas are private per process. The shaded areas are shared among all processes.
  345. Figure 11-33: Mapped regions with their shadow pages on disk. The lib.dll file is mapped into two address spaces at the same time.
  346. Figure 11-34: A page table entry (PTE) for a mapped page on the Intel x86 and AMD x64 architectures.
  347. Figure 11-35: The Windows self-map entries are used to map the physical pages of the page table hierarchy into kernel virtual addresses. This makes conversion between a virtual address and its PTE address very easy.
  348. Figure 11-36: Some of the fields in the page-frame database for a valid page.
  349. Figure 11-37: The various page lists and the transitions between them.
  350. Figure 11-38: Page transitions with memory compression (free/zero lists and mapped files omitted for clarity).
  351. Figure 11-39: Memory partition data structures.
  352. Figure 11-41: A single level in a device stack.
  353. Figure 11-42: The major fields of an I/O Request Packet.
  354. Figure 11-43: Windows allows drivers to be stacked to work with a specific instance of a device. The stacking is represented by device objects.
  355. Figure 11-44: The NTFS master file table.
  356. Figure 11-46: An MFT record for a three-run, nine-block stream.
  357. Figure 11-47: A file that requires three MFT records to store all its runs.
  358. Figure 11-48: The MFT record for a small directory.
  359. Figure 11-49: (a) An example of a 48-block file being compressed to 32 blocks. (b) The MFT record for the file after compression.
  360. Figure 11-50: Hyper-V virtualization components in the root and child partitions.
  361. Figure 11-51: Flow of parvirtualized I/O for an enlightened guest OS.
  362. Figure 11-52: VA-backed VM’s GPA space is logically mapped to virtual address ranges in its vmmem process on the host.
  363. Figure 11-53: The contents of the VHD exposed to the container is backed by a set of host directories that are merged at runtime to make up the container file system contents.
  364. Figure 11-54: Virtual Secure Mode architecture with NT kernel in VTL0 and Secure Kernel in VTL1. VTLs share memory, CPUs, and devices, but each VTL has its own access protections for these resources, controlled by higher VTLs.
  365. Figure 11-55: Structure of an access token.
  366. Figure 11-56: An example security descriptor for a file.
  367. Figure 11-59: Hotpatch application for mylib.dll. Functions foo() and baz() are updated in the patch binary, mylib_patch.dll.
  368. Figure 12-1: (a) Algorithmic code. (b) Event-driven code.
  369. Figure 12-2: One possible design for a modern layered operating system.
  370. Figure 12-3: Client-server computing based on a microkernel.
  371. Figure 12-4: Directories are used to map external names onto internal names.
  372. Figure 12-5: Code for searching the process table for a given PID.
  373. Figure 12-6: (a) CPU-dependent conditional compilation. (b) Word-length-dependent conditional compilation.
  374. Figure 12-7: (a) A procedure for counting bits in a byte. (b) A macro to count the bits. (c) A macro that counts bits by table lookup.
  375. Figure 12-8: (a) Part of an uncompressed image with 24 bits per pixel. (b) The same part compressed with GIF, with 8 bits per pixel. (c) The color palette.
  376. Figure 12-11: (a) Traditional software design progresses in stages. (b) Alternative design produces a working system (that does nothing) starting on day 1.

Landmarks

  1. Front Matter
  2. Start of Content
  3. Back Matter
  4. List of Figures

Page List

  1. i
  2. ii
  3. iii
  4. iv
  5. v
  6. vi
  7. vii
  8. viii
  9. ix
  10. x
  11. xi
  12. xii
  13. xiii
  14. xiv
  15. xv
  16. xvi
  17. xvii
  18. xviii
  19. xix
  20. xx
  21. xxi
  22. xxii
  23. xxiii
  24. xxiv
  25. xxv
  26. xxvi
  27. xxvii
  28. xxviii
  29. 1
  30. 2
  31. 3
  32. 4
  33. 5
  34. 6
  35. 7
  36. 8
  37. 9
  38. 10
  39. 11
  40. 12
  41. 13
  42. 14
  43. 15
  44. 16
  45. 17
  46. 18
  47. 19
  48. 20
  49. 21
  50. 22
  51. 23
  52. 24
  53. 25
  54. 26
  55. 27
  56. 28
  57. 29
  58. 30
  59. 31
  60. 32
  61. 33
  62. 34
  63. 35
  64. 36
  65. 37
  66. 38
  67. 39
  68. 40
  69. 41
  70. 42
  71. 43
  72. 44
  73. 45
  74. 46
  75. 47
  76. 48
  77. 49
  78. 50
  79. 51
  80. 52
  81. 53
  82. 54
  83. 55
  84. 56
  85. 57
  86. 58
  87. 59
  88. 60
  89. 61
  90. 62
  91. 63
  92. 64
  93. 65
  94. 66
  95. 67
  96. 68
  97. 69
  98. 70
  99. 71
  100. 72
  101. 73
  102. 74
  103. 75
  104. 76
  105. 77
  106. 78
  107. 79
  108. 80
  109. 81
  110. 82
  111. 83
  112. 84
  113. 85
  114. 86
  115. 87
  116. 88
  117. 89
  118. 90
  119. 91
  120. 92
  121. 93
  122. 94
  123. 95
  124. 96
  125. 97
  126. 98
  127. 99
  128. 100
  129. 101
  130. 102
  131. 103
  132. 104
  133. 105
  134. 106
  135. 107
  136. 108
  137. 109
  138. 110
  139. 111
  140. 112
  141. 113
  142. 114
  143. 115
  144. 116
  145. 117
  146. 118
  147. 119
  148. 120
  149. 121
  150. 122
  151. 123
  152. 124
  153. 125
  154. 126
  155. 127
  156. 128
  157. 129
  158. 130
  159. 131
  160. 132
  161. 133
  162. 134
  163. 135
  164. 136
  165. 137
  166. 138
  167. 139
  168. 140
  169. 141
  170. 142
  171. 143
  172. 144
  173. 145
  174. 146
  175. 147
  176. 148
  177. 149
  178. 150
  179. 151
  180. 152
  181. 153
  182. 154
  183. 155
  184. 156
  185. 157
  186. 158
  187. 159
  188. 160
  189. 161
  190. 162
  191. 163
  192. 164
  193. 165
  194. 166
  195. 167
  196. 168
  197. 169
  198. 170
  199. 171
  200. 172
  201. 173
  202. 174
  203. 175
  204. 176
  205. 177
  206. 178
  207. 179
  208. 180
  209. 181
  210. 182
  211. 183
  212. 184
  213. 185
  214. 186
  215. 187
  216. 188
  217. 189
  218. 190
  219. 191
  220. 192
  221. 193
  222. 194
  223. 195
  224. 196
  225. 197
  226. 198
  227. 199
  228. 200
  229. 201
  230. 202
  231. 203
  232. 204
  233. 205
  234. 206
  235. 207
  236. 208
  237. 209
  238. 210
  239. 211
  240. 212
  241. 213
  242. 214
  243. 215
  244. 216
  245. 217
  246. 218
  247. 219
  248. 220
  249. 221
  250. 222
  251. 223
  252. 224
  253. 225
  254. 226
  255. 227
  256. 228
  257. 229
  258. 230
  259. 231
  260. 232
  261. 233
  262. 234
  263. 235
  264. 236
  265. 237
  266. 238
  267. 239
  268. 240
  269. 241
  270. 242
  271. 243
  272. 244
  273. 245
  274. 246
  275. 247
  276. 248
  277. 249
  278. 250
  279. 251
  280. 252
  281. 253
  282. 254
  283. 255
  284. 256
  285. 257
  286. 258
  287. 259
  288. 260
  289. 261
  290. 262
  291. 263
  292. 264
  293. 265
  294. 266
  295. 267
  296. 268
  297. 269
  298. 270
  299. 271
  300. 272
  301. 273
  302. 274
  303. 275
  304. 276
  305. 277
  306. 278
  307. 279
  308. 280
  309. 281
  310. 282
  311. 283
  312. 284
  313. 285
  314. 286
  315. 287
  316. 288
  317. 289
  318. 290
  319. 291
  320. 292
  321. 293
  322. 294
  323. 295
  324. 296
  325. 297
  326. 298
  327. 299
  328. 300
  329. 301
  330. 302
  331. 303
  332. 304
  333. 305
  334. 306
  335. 307
  336. 308
  337. 309
  338. 310
  339. 311
  340. 312
  341. 313
  342. 314
  343. 315
  344. 316
  345. 317
  346. 318
  347. 319
  348. 320
  349. 321
  350. 322
  351. 323
  352. 324
  353. 325
  354. 326
  355. 327
  356. 328
  357. 329
  358. 330
  359. 331
  360. 332
  361. 333
  362. 334
  363. 335
  364. 336
  365. 337
  366. 338
  367. 339
  368. 340
  369. 341
  370. 342
  371. 343
  372. 344
  373. 345
  374. 346
  375. 347
  376. 348
  377. 349
  378. 350
  379. 351
  380. 352
  381. 353
  382. 354
  383. 355
  384. 356
  385. 357
  386. 358
  387. 359
  388. 360
  389. 361
  390. 362
  391. 363
  392. 364
  393. 365
  394. 366
  395. 367
  396. 368
  397. 369
  398. 370
  399. 371
  400. 372
  401. 373
  402. 374
  403. 375
  404. 376
  405. 377
  406. 378
  407. 379
  408. 380
  409. 381
  410. 382
  411. 383
  412. 384
  413. 385
  414. 386
  415. 387
  416. 388
  417. 389
  418. 390
  419. 391
  420. 392
  421. 393
  422. 394
  423. 395
  424. 396
  425. 397
  426. 398
  427. 399
  428. 400
  429. 401
  430. 402
  431. 403
  432. 404
  433. 405
  434. 406
  435. 407
  436. 408
  437. 409
  438. 410
  439. 411
  440. 412
  441. 413
  442. 414
  443. 415
  444. 416
  445. 417
  446. 418
  447. 419
  448. 420
  449. 421
  450. 422
  451. 423
  452. 424
  453. 425
  454. 426
  455. 427
  456. 428
  457. 429
  458. 430
  459. 431
  460. 432
  461. 433
  462. 434
  463. 435
  464. 436
  465. 437
  466. 438
  467. 439
  468. 440
  469. 441
  470. 442
  471. 443
  472. 444
  473. 445
  474. 446
  475. 447
  476. 448
  477. 449
  478. 450
  479. 451
  480. 452
  481. 453
  482. 454
  483. 455
  484. 456
  485. 457
  486. 458
  487. 459
  488. 460
  489. 461
  490. 462
  491. 463
  492. 464
  493. 465
  494. 466
  495. 467
  496. 468
  497. 469
  498. 470
  499. 471
  500. 472
  501. 473
  502. 474
  503. 475
  504. 476
  505. 477
  506. 478
  507. 479
  508. 480
  509. 481
  510. 482
  511. 483
  512. 484
  513. 485
  514. 486
  515. 487
  516. 488
  517. 489
  518. 490
  519. 491
  520. 492
  521. 493
  522. 494
  523. 495
  524. 496
  525. 497
  526. 498
  527. 499
  528. 500
  529. 501
  530. 502
  531. 503
  532. 504
  533. 505
  534. 506
  535. 507
  536. 508
  537. 509
  538. 510
  539. 511
  540. 512
  541. 513
  542. 514
  543. 515
  544. 516
  545. 517
  546. 518
  547. 519
  548. 520
  549. 521
  550. 522
  551. 523
  552. 524
  553. 525
  554. 526
  555. 527
  556. 528
  557. 529
  558. 530
  559. 531
  560. 532
  561. 533
  562. 534
  563. 535
  564. 536
  565. 537
  566. 538
  567. 539
  568. 540
  569. 541
  570. 542
  571. 543
  572. 544
  573. 545
  574. 546
  575. 547
  576. 548
  577. 549
  578. 550
  579. 551
  580. 552
  581. 553
  582. 554
  583. 555
  584. 556
  585. 557
  586. 558
  587. 559
  588. 560
  589. 561
  590. 562
  591. 563
  592. 564
  593. 565
  594. 566
  595. 567
  596. 568
  597. 569
  598. 570
  599. 571
  600. 572
  601. 573
  602. 574
  603. 575
  604. 576
  605. 577
  606. 578
  607. 579
  608. 580
  609. 581
  610. 582
  611. 583
  612. 584
  613. 585
  614. 586
  615. 587
  616. 588
  617. 589
  618. 590
  619. 591
  620. 592
  621. 593
  622. 594
  623. 595
  624. 596
  625. 597
  626. 598
  627. 599
  628. 600
  629. 601
  630. 602
  631. 603
  632. 604
  633. 605
  634. 606
  635. 607
  636. 608
  637. 609
  638. 610
  639. 611
  640. 612
  641. 613
  642. 614
  643. 615
  644. 616
  645. 617
  646. 618
  647. 619
  648. 620
  649. 621
  650. 622
  651. 623
  652. 624
  653. 625
  654. 626
  655. 627
  656. 628
  657. 629
  658. 630
  659. 631
  660. 632
  661. 633
  662. 634
  663. 635
  664. 636
  665. 637
  666. 638
  667. 639
  668. 640
  669. 641
  670. 642
  671. 643
  672. 644
  673. 645
  674. 646
  675. 647
  676. 648
  677. 649
  678. 650
  679. 651
  680. 652
  681. 653
  682. 654
  683. 655
  684. 656
  685. 657
  686. 658
  687. 659
  688. 660
  689. 661
  690. 662
  691. 663
  692. 664
  693. 665
  694. 666
  695. 667
  696. 668
  697. 669
  698. 670
  699. 671
  700. 672
  701. 673
  702. 674
  703. 675
  704. 676
  705. 677
  706. 678
  707. 679
  708. 680
  709. 681
  710. 682
  711. 683
  712. 684
  713. 685
  714. 686
  715. 687
  716. 688
  717. 689
  718. 690
  719. 691
  720. 692
  721. 693
  722. 694
  723. 695
  724. 696
  725. 697
  726. 698
  727. 699
  728. 700
  729. 701
  730. 702
  731. 703
  732. 704
  733. 705
  734. 706
  735. 707
  736. 708
  737. 709
  738. 710
  739. 711
  740. 712
  741. 713
  742. 714
  743. 715
  744. 716
  745. 717
  746. 718
  747. 719
  748. 720
  749. 721
  750. 722
  751. 723
  752. 724
  753. 725
  754. 726
  755. 727
  756. 728
  757. 729
  758. 730
  759. 731
  760. 732
  761. 733
  762. 734
  763. 735
  764. 736
  765. 737
  766. 738
  767. 739
  768. 740
  769. 741
  770. 742
  771. 743
  772. 744
  773. 745
  774. 746
  775. 747
  776. 748
  777. 749
  778. 750
  779. 751
  780. 752
  781. 753
  782. 754
  783. 755
  784. 756
  785. 757
  786. 758
  787. 759
  788. 760
  789. 761
  790. 762
  791. 763
  792. 764
  793. 765
  794. 766
  795. 767
  796. 768
  797. 769
  798. 770
  799. 771
  800. 772
  801. 773
  802. 774
  803. 775
  804. 776
  805. 777
  806. 778
  807. 779
  808. 780
  809. 781
  810. 782
  811. 783
  812. 784
  813. 785
  814. 786
  815. 787
  816. 788
  817. 789
  818. 790
  819. 791
  820. 792
  821. 793
  822. 794
  823. 795
  824. 796
  825. 797
  826. 798
  827. 799
  828. 800
  829. 801
  830. 802
  831. 803
  832. 804
  833. 805
  834. 806
  835. 807
  836. 808
  837. 809
  838. 810
  839. 811
  840. 812
  841. 813
  842. 814
  843. 815
  844. 816
  845. 817
  846. 818
  847. 819
  848. 820
  849. 821
  850. 822
  851. 823
  852. 824
  853. 825
  854. 826
  855. 827
  856. 828
  857. 829
  858. 830
  859. 831
  860. 832
  861. 833
  862. 834
  863. 835
  864. 836
  865. 837
  866. 838
  867. 839
  868. 840
  869. 841
  870. 842
  871. 843
  872. 844
  873. 845
  874. 846
  875. 847
  876. 848
  877. 849
  878. 850
  879. 851
  880. 852
  881. 853
  882. 854
  883. 855
  884. 856
  885. 857
  886. 858
  887. 859
  888. 860
  889. 861
  890. 862
  891. 863
  892. 864
  893. 865
  894. 866
  895. 867
  896. 868
  897. 869
  898. 870
  899. 871
  900. 872
  901. 873
  902. 874
  903. 875
  904. 876
  905. 877
  906. 878
  907. 879
  908. 880
  909. 881
  910. 882
  911. 883
  912. 884
  913. 885
  914. 886
  915. 887
  916. 888
  917. 889
  918. 890
  919. 891
  920. 892
  921. 893
  922. 894
  923. 895
  924. 896
  925. 897
  926. 898
  927. 899
  928. 900
  929. 901
  930. 902
  931. 903
  932. 904
  933. 905
  934. 906
  935. 907
  936. 908
  937. 909
  938. 910
  939. 911
  940. 912
  941. 913
  942. 914
  943. 915
  944. 916
  945. 917
  946. 918
  947. 919
  948. 920
  949. 921
  950. 922
  951. 923
  952. 924
  953. 925
  954. 926
  955. 927
  956. 928
  957. 929
  958. 930
  959. 931
  960. 932
  961. 933
  962. 934
  963. 935
  964. 936
  965. 937
  966. 938
  967. 939
  968. 940
  969. 941
  970. 942
  971. 943
  972. 944
  973. 945
  974. 946
  975. 947
  976. 948
  977. 949
  978. 950
  979. 951
  980. 952
  981. 953
  982. 954
  983. 955
  984. 956
  985. 957
  986. 958
  987. 959
  988. 960
  989. 961
  990. 962
  991. 963
  992. 964
  993. 965
  994. 966
  995. 967
  996. 968
  997. 969
  998. 970
  999. 971
  1000. 972
  1001. 973
  1002. 974
  1003. 975
  1004. 976
  1005. 977
  1006. 978
  1007. 979
  1008. 980
  1009. 981
  1010. 982
  1011. 983
  1012. 984
  1013. 985
  1014. 986
  1015. 987
  1016. 988
  1017. 989
  1018. 990
  1019. 991
  1020. 992
  1021. 993
  1022. 994
  1023. 995
  1024. 996
  1025. 997
  1026. 998
  1027. 999
  1028. 1000
  1029. 1001
  1030. 1002
  1031. 1003
  1032. 1004
  1033. 1005
  1034. 1006
  1035. 1007
  1036. 1008
  1037. 1009
  1038. 1010
  1039. 1011
  1040. 1012
  1041. 1013
  1042. 1014
  1043. 1015
  1044. 1016
  1045. 1017
  1046. 1018
  1047. 1019
  1048. 1020
  1049. 1021
  1050. 1022
  1051. 1023
  1052. 1024
  1053. 1025
  1054. 1026
  1055. 1027
  1056. 1028
  1057. 1029
  1058. 1030
  1059. 1031
  1060. 1032
  1061. 1033
  1062. 1034
  1063. 1035
  1064. 1036
  1065. 1037
  1066. 1038
  1067. 1039
  1068. 1040
  1069. 1041
  1070. 1042
  1071. 1043
  1072. 1044
  1073. 1045
  1074. 1046
  1075. 1047
  1076. 1048
  1077. 1049
  1078. 1050
  1079. 1051
  1080. 1052
  1081. 1053
  1082. 1054
  1083. 1055
  1084. 1056
  1085. 1057
  1086. 1058
  1087. 1059
  1088. 1060
  1089. 1061
  1090. 1062
  1091. 1063
  1092. 1064
  1093. 1065
  1094. 1066
  1095. 1067
  1096. 1068
  1097. 1069
  1098. 1070
  1099. 1071
  1100. 1072
  1101. 1073
  1102. 1074
  1103. 1075
  1104. 1076
  1105. 1077
  1106. 1078
  1107. 1079
  1108. 1080
  1109. 1081
  1110. 1082
  1111. 1083
  1112. 1084
  1113. 1085
  1114. 1086
  1115. 1087
  1116. 1088
  1117. 1089
  1118. 1090
  1119. 1091
  1120. 1092
  1121. 1093
  1122. 1094
  1123. 1095
  1124. 1096
  1125. 1097
  1126. 1098
  1127. 1099
  1128. 1100
  1129. 1101
  1130. 1102
  1131. 1103
  1132. 1104
  1133. 1105
  1134. 1106
  1135. 1107
  1136. 1108
  1137. 1109
  1138. 1110
  1139. 1111
  1140. 1112
  1141. 1113
  1142. 1114
  1143. 1115
  1144. 1116
  1145. 1117
  1146. 1118
  1147. 1119
  1148. 1120
  1149. 1121
  1150. 1122
  1151. 1123
  1152. 1124
  1153. 1125
  1154. 1126
  1155. 1127
  1156. 1128
  1157. 1129
  1158. 1130
  1159. 1131
  1160. 1132
  1161. 1133
  1162. 1134
  1163. 1135
  1164. 1136
  1165. 1137
  1166. 1138
  1167. 1139
  1168. 1140
  1169. 1141
  1170. 1142
  1171. 1143
  1172. 1144
  1173. 1145
  1174. 1146
  1175. 1147
  1176. 1148
  1177. 1149
  1178. 1150
  1179. 1151
  1180. 1152
  1181. 1153
  1182. 1154
  1183. 1155
  1184. 1156