Synopses & Reviews
Device drivers make it possible for your software to communicate with your hardware, and because every operating system has specific requirements, driver writing is nontrivial. When developing for FreeBSD, you've probably had to scour the Internet and dig through the kernel sources to figure out how to write the drivers you need. Thankfully, that stops now. In FreeBSD Device Drivers, Joseph Kong will teach you how to master everything from the basics of building and running loadable kernel modules to more complicated topics like thread synchronization. After a crash course in the different FreeBSD driver frameworks, extensive tutorial sections dissect real-world drivers like the parallel port printer driver.
You'll learn:
- All about Newbus, the infrastructure used by FreeBSD to manage the hardware devices on your system
- How to work with ISA, PCI, USB, and other buses
- The best ways to control and communicate with the hardware devices from user space
- How to use Direct Memory Access (DMA) for maximum system performance
- The inner workings of the virtual null modem terminal driver, the USB printer driver, the Intel PCI Gigabit Ethernet adapter driver, and other important drivers
- How to use Common Access Method (CAM) to manage host bus adapters (HBAs)
Concise descriptions and extensive annotations walk you through the many code examples. Don't waste time searching man pages or digging through the kernel sources to figure out how to make that arcane bit of hardware work with your system. FreeBSD Device Drivers gives you the framework that you need to write any driver you want, now.
Synopsis
FreeBSD Device Drivers is the first and only book to teach readers how to develop device drivers for the FreeBSD operating system. A one-stop reference for FreeBSD device driver writers of all levels of expertise, FreeBSD Device Drivers begins with the nuts and bolts of device drivers, including explanations of the different driver components and building blocks. You will then learn how to build and run modules, allocate memory, control device communication, deal with concurrency issues, manage hardware resources, handle interrupts, support direct memory access, write PCI, SCSI, and USB device drivers, and more. With case study chapters that dissect various drivers and a liberal use of examples-from simple "hello, world" drivers to full-blown, hardware-controlling drivers-you will walk away with a full understanding of how device drivers work on FreeBSD. This book is for anyone writing device drivers, but also for any FreeBSD enthusiast who would appreciate its hands-on approach to understanding the device driver subsystem, kernel internals, and key design choices made by the FreeBSD developers.
About the Author
Tinkering with computers has always been a primary passion of author Joseph Kong. He is a self-taught programmer who dabbles in information security, operating system theory, reverse engineering, and vulnerability assessment. He has written for Phrack Magazine and was a system administrator for the City of Toronto.
Table of Contents
Dedication; About the Technical Reviewer; Foreword; Acknowledgments; Introduction; Who Is This Book For?; Prerequisites; Contents at a Glance; Welcome Aboard!; Chapter 1: Building and Running Modules; 1.1 Types of Device Drivers; 1.2 Loadable Kernel Modules; 1.3 Hello, world!; 1.4 Compiling and Loading; 1.5 Character Drivers; 1.6 Mostly Harmless; 1.7 Block Drivers Are Gone; 1.8 Conclusion; Chapter 2: Allocating Memory; 2.1 Memory Management Routines; 2.2 malloc_type Structures; 2.3 Tying Everything Together; 2.4 Contiguous Physical Memory Management Routines; 2.5 A Straightforward Example; 2.6 Conclusion; Chapter 3: Device Communication and Control; 3.1 ioctl; 3.2 Defining ioctl Commands; 3.3 Implementing ioctl; 3.4 Invoking ioctl; 3.5 sysctl; 3.6 Implementing sysctls, Part 1; 3.7 sysctl Context Management Routines; 3.8 Creating Dynamic sysctls; 3.9 Implementing sysctls, Part 2; 3.10 Conclusion; Chapter 4: Thread Synchronization; 4.1 A Simple Synchronization Problem; 4.2 A More Complex Synchronization Problem; 4.3 Preventing Race Conditions; 4.4 Mutexes; 4.5 Mutex Management Routines; 4.6 Implementing Mutexes; 4.7 Shared/Exclusive Locks; 4.8 Shared/Exclusive Lock Management Routines; 4.9 Implementing Shared/Exclusive Locks; 4.10 Reader/Writer Locks; 4.11 Reader/Writer Lock Management Routines; 4.12 Condition Variables; 4.13 Condition Variable Management Routines; 4.14 General Guidelines; 4.15 Conclusion; Chapter 5: Delaying Execution; 5.1 Voluntary Context Switching, or Sleeping; 5.2 Implementing Sleeps and Condition Variables; 5.3 Kernel Event Handlers; 5.4 Callouts; 5.5 Callouts and Race Conditions; 5.6 Taskqueues; 5.7 Conclusion; Chapter 6: Case Study: Virtual Null Modem; 6.1 Prerequisites; 6.2 Code Analysis; 6.3 Conclusion; Chapter 7: Newbus and Resource Allocation; 7.1 Autoconfiguration and Newbus Drivers; 7.2 Tying Everything Together; 7.3 Hardware Resource Management; 7.4 Conclusion; Chapter 8: Interrupt Handling; 8.1 Registering an Interrupt Handler; 8.2 Interrupt Handlers in FreeBSD; 8.3 Implementing an Interrupt Handler; 8.4 Generating Interrupts on the Parallel Port; 8.5 Conclusion; Chapter 9: Case Study: Parallel Port Printer Driver; 9.1 Code Analysis; 9.2 Conclusion; Chapter 10: Managing and Using Resources; 10.1 I/O Ports and I/O Memory; 10.2 Memory Barriers; 10.3 Tying Everything Together; 10.4 Conclusion; Chapter 11: Case Study: Intelligent Platform Management Interface Driver; 11.1 Code Analysis; 11.2 Conclusion; Chapter 12: Direct Memory Access; 12.1 Implementing DMA; 12.2 Creating DMA Tags; 12.3 Tearing Down DMA Tags; 12.4 DMA Map Management Routines, Part 1; 12.5 Loading (DMA) Buffers into DMA Maps; 12.6 DMA Map Management Routines, Part 2; 12.7 A Straightforward Example; 12.8 Synchronizing DMA Buffers; 12.9 Conclusion; Chapter 13: Storage Drivers; 13.1 disk Structures; 13.2 disk Structure Management Routines; 13.3 Block I/O Structures; 13.4 Block I/O Queues; 13.5 Tying Everything Together; 13.6 Block I/O Completion Routines; 13.7 Conclusion; Chapter 14: Common Access Method; 14.1 How CAM Works; 14.2 A (Somewhat) Simple Example; 14.3 SIM Registration Routines; 14.4 Action Routines; 14.5 Conclusion; Chapter 15: USB Drivers; 15.1 About USB Devices; 15.2 More About USB Devices; 15.3 USB Configuration Structures; 15.4 USB Transfers (in FreeBSD); 15.5 USB Configuration Structure Management Routines; 15.6 USB Methods Structure; 15.7 Tying Everything Together; 15.8 Conclusion; Chapter 16: Network Drivers, Part 1: Data Structures; 16.1 Network Interface Structures; 16.2 Network Interface Structure Management Routines; 16.3 Network Interface Media Structures; 16.4 Network Interface Media Structure Management Routines; 16.5 Hello, world!; 16.6 mbuf Structures; 16.7 Message Signaled Interrupts; 16.8 Implementing MSI; 16.9 MSI Management Routines; 16.10 Conclusion; Chapter 17: Network Drivers, Part 2: Packet Reception and Transmission; 17.1 Packet Reception; 17.2 Packet Transmission; 17.3 Post Packet Transmission; 17.4 Conclusion; References; Colophon; UPDATES;