Embedded Linux Device Drivers and Kernel Internals

5 Day Course
Code PSD162

Book Now - 1 Delivery Method Available:

Classroom Virtual Classroom Private Group - Virtual Self-Paced Online


This 5-day training class uses hands-on exercises combined with instruction to illustrate the concepts of GNU/Linux kernel internals and device driver development. It is designed to bring you quickly up to speed. We describe processes, concepts and commands necessary to write GNU/Linux device drivers through a combination of theory and on-the-job training. Don’t reinvent the wheel, but learn from an experienced trainer and take home a working knowledge and the ability to use it effectively in your own embedded development project.


To provide an understanding of the essentials necessary to write a GNU/Linux Device Driver. How-to’s, theory and hands-on excercises provide you with the necessary experience to interact with community from the very beginning and to write your own GNU/Linux Device Driver after successfully completing this training.


Hide all

Introduction (1 topic)

  • Quick history of GNU/Linux, licensing, kernel versioning, release cycle, kernel trees, mainline, kernel vs. user space, mechanism vs. policy, kernel driver alternatives, RTOS vs. Linux

Memory Management (1 topic)

  • Virtual memory vs. physical memory, memory allocation in kernel, pages, zones, API, slab

Kernel Patch (1 topic)

  • Life cycle, git, kernel source, create patch, check patch, fix patch, ship patch, audited code

Kernel Module (2 topics)

  • Get kernel sources, configure, build, install, device drivers (statically linked, loaded at runtime), init, licensing, EXPORT SYMBOL GPL, out of
  • tree makefile, module-init-tools, module in kernel tree, Kconfig, parameter passing, sparse

Char Drivers (8 topics)

  • Architecture, user/kernel interface, I/O subsystem, VFS, sysfs (devices, bus, drivers, classes), kobject, ktype, kset, linux kernel driver model, device files
  • Char driver
  • Initialization
  • Registration
  • Open, release
  • cdev, cdev add, cdev del,...
  • Major/minor numbers
  • udev, udevmonitor, udevadm

Advanced Charachter Driver Operations (2 topics)

  • ioctl, unlocked ioctl, compat ioctl,
  • user space API, kernel space API, process lifecycle, sleeping/blocking, sleeping/waking up, wait queue. thundering herd, poll/select

Kernel Debugging (10 topics)

  • Bug, debugging, debugging the kernel
  • Binary search with git
  • Debug support from kernel
  • printk syslogd, klogd, loglevels, rate
  • limit, debug levels, debug selective subsystems
  • Debugging by querying debugfs
  • oops debugging, asserting oops
  • Magic SysRq Key
  • kgdb/kdb
  • JTAG

Tracing (5 topics)

  • gcov
  • lcov
  • oprofile
  • ftrace (nop tracer, function tracer, sched switch tracer (viewer), function graph tracer, dynamic tracer)
  • LTTng

Interrupts (1 topic)

  • Interrupts vs. polling, interrupt, program sections, reentrancy, events, interrupt handler, shared interrupt handler, interrupt flow, interrupt control

Deferring Work (1 topic)

  • Top/bottom halves, softirqs, tasklets, work queues

Concurrency (12 topics)

  • Critical region/section, atomic, race condition, synchronization, locking, locking solutions, deadlock, contention, what to lock?
  • Atomic operations
  • Spin locks
  • Reader-writer spin locks
  • Semaphore
  • Binary semaphore
  • Mutex
  • Reader-writer semaphore
  • Completion variables
  • Sequential locks
  • Disable preemption
  • Orderig and barriers

Time (1 topic)

  • HZ, Jiffies, big/small delays, kernel timers

Hardware I/O (1 topic)

  • I/O Ports, I/O Memory, How to deal with side effects accessing registers?

User-Kernel Communication (1 topic)

  • put(get) user(), copy to(from) user(), Kernel I/O, memory mapping, procfs, sysfs, debugfs, relayfs, netlink, ioctl

Portability (1 topic)

  • Word size, opaque types, signed/unsigned char, data alignment, integral promotion, code reuse, endianess, system tick, page size, instruction ordering, SMP/preemption/high memory


  • Basic familiarity with using a GNU/Linux system as an end user.
  • Basic familiarity with a command line shell.
  • Basic knowledge of user space / application development.
  • Intermediate C programming knowledge.
  • Should have attended Embedded GNU/Linux Systems Architecture before(strongly recommended!).

Additional Learning

The courses below may help you meet the knowledge level required to take this course.

Relevant Certifications

Course PDF


Share this Course


Recommend this Course