Linux Device Drivers, 3/e (Paperback)

Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman




Device drivers literally drive everything you're interested in--disks, monitors, keyboards, modems--everything outside the computer chip and memory. And writing device drivers is one of the few areas of programming for the Linux operating system that calls for unique, Linux-specific knowledge. For years now, programmers have relied on the classic Linux Device Drivers from O'Reilly to master this critical subject. Now in its third edition, this bestselling guide provides all the information you'll need to write drivers for a wide range of devices.

Over the years the book has helped countless programmers learn:

  • how to support computer peripherals under the Linux operating system
  • how to develop and write software for new hardware under Linux
  • the basics of Linux operation even if they are not expecting to write a driver

The new edition of Linux Device Drivers is better than ever. The book covers all the significant changes to Version 2.6 of the Linux kernel, which simplifies many activities, and contains subtle new features that can make a driver both more efficient and more flexible. Readers will find new chapters on important types of drivers not covered previously, such as consoles, USB drivers, and more.

Best of all, you don't have to be a kernel hacker to understand and enjoy this book. All you need is an understanding of the C programming language and some background in Unix system calls. And for maximum ease-of-use, the book uses full-featured examples that you can compile and run without special hardware.

Today Linux holds fast as the most rapidly growing segment of the computer market and continues to win over enthusiastic adherents in many application areas. With this increasing support, Linux is now absolutely mainstream, and viewed as a solid platform for embedded systems. If you're writing device drivers, you'll want this book. In fact, you'll wonder how drivers are ever written without it.


Table of Contents:


1. An Introduction to Device Drivers

     The Role of the Device Driver
     Splitting the Kernel

     Classes of Devices and Modules
     Security Issues

     Version Numbering

     License Terms

     Joining the Kernel Development Community

     Overview of the Book

2. Building and Running Modules

     Setting Up Your Test System

     The Hello World Module

     Kernel Modules Versus Applications

     Compiling and Loading

     The Kernel Symbol Table


     Initialization and Shutdown

     Module Parameters

     Doing It in User Space

     Quick Reference

3. Char Drivers

     The Design of scull

     Major and Minor Numbers

     Some Important Data Structures

     Char Device Registration

     open and release

     scull's Memory Usage

     read and write

     Playing with the New Devices

     Quick Reference

4. Debugging Techniques

     Debugging Support in the Kernel

     Debugging by Printing

     Debugging by Querying

     Debugging by Watching

     Debugging System Faults

     Debuggers and Related Tools

5. Concurrency and Race Conditions

     Pitfalls in scull

     Concurrency and Its Management

     Semaphores and Mutexes



     Locking Traps

     Alternatives to Locking

     Quick Reference

6. Advanced Char Driver Operations


     Blocking I/O

     poll and select

     Asynchronous Notification

     Seeking a Device

     Access Control on a Device File

     Quick Reference

7. Time, Delays, and Deferred Work

     Measuring Time Lapses

     Knowing the Current Time

     Delaying Execution

     Kernel Timers



     Quick Reference

8. Allocating Memory

     The Real Story of kmalloc

     Lookaside Caches

     get_free_page and Friends

     vmalloc and Friends

     Per-CPU Variables

     Obtaining Large Buffers

     Quick Reference

9. Communicating with Hardware

     I/O Ports and I/O Memory

     Using I/O Ports

     An I/O Port Example

     Using I/O Memory

     Quick Reference

10. Interrupt Handling

     Preparing the Parallel Port

     Installing an Interrupt Handler

     Implementing a Handler

     Top and Bottom Halves

     Interrupt Sharing

     Interrupt-Driven I/O

     Quick Reference

11. Data Types in the Kernel

     Use of Standard C Types

     Assigning an Explicit Size to Data Items

     Interface-Specific Types

     Other Portability Issues

     Linked Lists

     Quick Reference

12. PCI Drivers

     The PCI Interface

     A Look Back: ISA

     PC/104 and PC/104+

     Other PC Buses



     External Buses

     Quick Reference

13. USB Drivers

     USB Device Basics

     USB and Sysfs

     USB Urbs

     Writing a USB Driver

     USB Transfers Without Urbs

     Quick Reference

14. The Linux Device Model

     Kobjects, Ksets, and Subsystems

     Low-Level Sysfs Operations

     Hotplug Event Generation

     Buses, Devices, and Drivers


     Putting It All Together


     Dealing with Firmware

     Quick Reference

15. Memory Mapping and DMA

     Memory Management in Linux

     The mmap Device Operation

     Performing Direct I/O

     Direct Memory Access

     Quick Reference

16. Block Drivers


     The Block Device Operations

     Request Processing

     Some Other Details

     Quick Reference

17. Network Drivers

     How snull Is Designed

     Connecting to the Kernel

     The net_device Structure in Detail

     Opening and Closing

     Packet Transmission

     Packet Reception

     The Interrupt Handler

     Receive Interrupt Mitigation

     Changes in Link State

     The Socket Buffers

     MAC Address Resolution

     Custom ioctl Commands

     Statistical Information


     A Few Other Details

     Quick Reference

18. TTY Drivers

     A Small TTY Driver

     tty_driver Function Pointers

     TTY Line Settings


     proc and sysfs Handling of TTY Devices

     The tty_driver Structure in Detail

     The tty_operations Structure in Detail

     The tty_struct Structure in Detail

     Quick Reference