Click here to load reader

Notes on the Plan 9tm 3rd edition Kernel Sourceindex-of.co.uk/Operating-Systems/Notes_on_The_Plan... · PDF file to the public on its 3rd edition, I knew it was just the material

  • View
    0

  • Download
    0

Embed Size (px)

Text of Notes on the Plan 9tm 3rd edition Kernel...

  • Notes on the Plan 9 tm

    3rd edition Kernel Source

    Francisco J Ballesteros

    [email protected]

    May 8, 2007

  • ii

  • Contents

    Trademarks vii

    License ix

    Preface xiii

    1 Introduction 1 1.1 How to read this document . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.1.1 Coming up next . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Other documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.2.1 Manual pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.2 Papers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    1.3 Introduction to Plan 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.4 Source code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    1.4.1 Notes on C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.4.2 mk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    1.5 PC hardware facilities . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.5.1 Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.5.2 Instructions and addressing modes . . . . . . . . . . . . . . . . 18 1.5.3 Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.5.4 Interrupts and exceptions . . . . . . . . . . . . . . . . . . . . . 20

    2 System source 23 2.1 Quick tour to the source . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    2.1.1 Interesting include files . . . . . . . . . . . . . . . . . . . . . . 23 2.1.2 Interesting source files . . . . . . . . . . . . . . . . . . . . . . . 23

    2.2 System structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    3 Starting up 27 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2 Running the loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    3.2.1 Preparing for loading . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2.2 Loading the kernel . . . . . . . . . . . . . . . . . . . . . . . . . 34

    3.3 Booting the kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.4 Processors and system configuration . . . . . . . . . . . . . . . . . . . 41 3.5 I/O ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    i

  • ii CONTENTS

    3.5.1 Port allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.5.2 Back to I/O initialization . . . . . . . . . . . . . . . . . . . . . 46

    3.6 Memory allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.7 Architecture initialization . . . . . . . . . . . . . . . . . . . . . . . . . 55

    3.7.1 Traps and interrupts . . . . . . . . . . . . . . . . . . . . . . . . 56 3.7.2 Virtual Memory . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.7.3 Traps and interrupts (continued) . . . . . . . . . . . . . . . . . 61

    3.8 Setting up I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.9 Preparing to have processes . . . . . . . . . . . . . . . . . . . . . . . . 66 3.10 Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.11 Files and Channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    3.11.1 Using local files . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.11.2 Starting to serve files . . . . . . . . . . . . . . . . . . . . . . . . 72 3.11.3 Setting up the environment . . . . . . . . . . . . . . . . . . . . 74

    3.12 Memory pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.13 The first process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    3.13.1 Hand-crafting the first process: The data structures . . . . . . 78 3.13.2 Hand-crafting the first process: The state . . . . . . . . . . . . 85 3.13.3 Starting the process . . . . . . . . . . . . . . . . . . . . . . . . 91

    4 Processes 99 4.1 Trap handling continued . . . . . . . . . . . . . . . . . . . . . . . . . . 100 4.2 System calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.3 Error handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    4.3.1 Exceptions in C . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 4.3.2 Error messages . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    4.4 Clock, alarms, and time handling . . . . . . . . . . . . . . . . . . . . . 110 4.4.1 Clock handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 4.4.2 Time handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 4.4.3 Alarm handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    4.5 Scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 4.5.1 Context switching . . . . . . . . . . . . . . . . . . . . . . . . . 118 4.5.2 Context switching . . . . . . . . . . . . . . . . . . . . . . . . . 118 4.5.3 FPU context switch . . . . . . . . . . . . . . . . . . . . . . . . 122 4.5.4 The scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    4.6 Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 4.6.1 Disabling interrupts . . . . . . . . . . . . . . . . . . . . . . . . 127 4.6.2 Test and set locks . . . . . . . . . . . . . . . . . . . . . . . . . 129 4.6.3 Queuing locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.6.4 Read/write locks . . . . . . . . . . . . . . . . . . . . . . . . . . 135

    4.7 Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 4.7.1 Rendezvous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 4.7.2 Sleep and wakeup . . . . . . . . . . . . . . . . . . . . . . . . . 140

    4.8 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 4.8.1 Posting notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 4.8.2 Notifying notes . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 4.8.3 Terminating the handler . . . . . . . . . . . . . . . . . . . . . . 147

  • CONTENTS iii

    4.9 Rfork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

    4.10 Exec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    4.10.1 Locating the program . . . . . . . . . . . . . . . . . . . . . . . 157

    4.10.2 Executing the program . . . . . . . . . . . . . . . . . . . . . . . 160

    4.11 Dead processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

    4.11.1 Exiting and aborting . . . . . . . . . . . . . . . . . . . . . . . . 164

    4.11.2 Waiting for children . . . . . . . . . . . . . . . . . . . . . . . . 168

    4.12 The proc device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

    4.12.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

    4.12.2 Reading under /proc . . . . . . . . . . . . . . . . . . . . . . . 173

    4.12.3 Writing under /proc . . . . . . . . . . . . . . . . . . . . . . . . 175

    4.12.4 A system call? A file operation? Or what? . . . . . . . . . . . 179

    5 Files 181

    5.1 Files for users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

    5.2 Name spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

    5.2.1 Path resolution . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

    5.2.2 Adjusting the name space . . . . . . . . . . . . . . . . . . . . . 194

    5.3 File I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

    5.3.1 Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

    5.3.2 Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

    5.3.3 Seeking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214

    5.3.4 Metadata I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

    5.4 Other system calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

    5.4.1 Current directory . . . . . . . . . . . . . . . . . . . . . . . . . . 217

    5.4.2 Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

    5.5 Device operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

    5.5.1 The pipe device . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

    5.5.2 Remote files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

    5.6 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

    5.6.1 Caching a new file . . . . . . . . . . . . . . . . . . . . . . . . . 245

    5.6.2 Using the cached file . . . . . . . . . . . . . . . . . . . . . . . . 248

    5.7 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

    5.7.1 Creating a queue . . . . . . . . . . . . . . . . . . . . . . . . . . 253

    5.7.2 Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254

    5.7.3 Other read procedures . . . . . . . . . . . . . . . . . . . . . . . 256

    5.7.4 Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

    5.7.5 Other write procedures . . . . . . . . . . . . . . . . . . . . . . 259

    5.7.6 Terminating queues . . . . . . . . . . . . . . . . . . . . . . . . 260

    5.7.7 Other queue procedures . . . . . . . . . . . . . . . . . . . . . . 261

    5.7.8 Block handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

    5.7.9 Block allocation . . . . . . . . . . . . . . . . . . . . . . . . . . 262

    5.8 Protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

    5.8.1 Your local kernel . . .