First Technology Transfer

Standard and Advanced Technical Training, Consultancy and Mentoring

ELIN 103 - Linux Kernel Internals and Device Driver Programming

Duration: 5 Days

Intended Audience

Attendees are expected to be proficient C programmers and have a good working knowledge of Linux or Unix.


Developers building embedded solutions using Linux often need to make kernel-level modifications, or to write drivers for custom hardware. This advanced programming course provides an intensive overview of the Linux 2.6 kernel, kernel level programming and device driver theory and implementation, as well as kernel configuration and compilation. Code will be developed and tested on both a Linux 4.x kernel running on a PC Platform and on an ARM platform. The ARM platform used on this course will be either a RaspberryPi or a BeagleBone Black.

The objectives of the course include providing a comprehensive understanding of Linux Kernel building, kernel and device driver programming, and experience of device drivers for components and protocols often found in embedded systems such as I2C, SPI, Bluetooth and USB.

Course Outline

  • Linux Background
    • The evolution of Linux
    • Linux and the POSIX API
    • Understanding how the Linux Kernel is split up
  • Linux Internals - the key parts
    • Memory addressing - segmentation and paging
    • Process creation, process switching, process destruction
    • Interrupts and Exception Handling
    • Time, timing and timer interrupts
    • Memory management and the process address space
    • System calls, signals and the POSIX API
    • I/O Devices
    • File systems
    • Inter-process communication
    • Program loading and execution
  • Modules
    • Loadable modules and insmod
    • Security issues with loadable modules
    • Applications compared to kernel modules
    • User space, kernel space
    • Compiling and loading a module
    • Initialisation, shutdown and error handling by a module
    • Usage counting and module unloading
    • How a module acquires and accesses system resources (I/O Ports, I/O memory)
    • Automatic and manual configuration
    • User space drivers
  • Character Drivers
    • Major and minor device numbers
    • Dynamic allocation of major numbers
    • File operations - the file_operations structure and the file structure
    • Getting applications to use new devices
  • Device drivers
    • Device driver testing and debugging
    • Using ioctl commands
    • Blocking vs. non-blocking I/O
    • Controlling access to a device
  • Time and the Linux Kernel
    • Timer interrupts and kernel time
    • Kernel time and the jiffies variable
    • Task queues
    • Understanding kernel timers
    • Timers, kernel threads and deferred work
  • Memory management - basics
    • kmalloc
    • Lookaside caches
    • vmalloc
    • Boot time memory allocation
  • Hardware management and usage - basics
    • I/O Ports and I/O Memory
    • Interrupts and Interrupt handling
    • The /proc interface
    • Circular buffers
    • Spinlocks
    • Race conditions
  • Block drivers
    • Registering
    • Handling requests - and data transfer
    • Queuing and block drivers
    • The ioctl command and block drivers
  • Case studies
    • USB device drivers
    • I2C and SPI device drivers
    • Network device drivers
    • Overview of the Linux TCP/IP Protocol stack