Linux kernel and drivers development training

Our Linux Kernel Drivers development course is based on real experience, and is mostly hands-on. Get familiar with device driver development for the Linux kernel. Start from the basics of Linux kernel sources and compilation, and explore up to driver development and integration into kernel frameworks. Includes hands-on labs on embedded targets.

Linux Kernel and Drivers Course
2000 € / VAT excluded per person*


LINUX KERNEL DRIVERS COURSE CONTENT

Introduction to the linux kernel
  • Kernel features
  • Understanding the development process
  • Legal constraints with device drivers
  • Kernel user interface (/proc and /sys)
  • Userspace device drivers
Kernel source code
  • Specifics of Linux kernel development
  • Coding standards
  • Retrieving Linux kernel sources
  • Tour of the Linux kernel sources
Configuring, compiling and booting the kernel
  • Kernel configuration
  • Native and cross-compilation
  • Booting the kernel
  • Booting the kernel using NFS
Linux kernel modules
  • Linux device drivers
  • A simple module
  • Programming constraints
  • Loading, unloading modules
  • Module dependencies
  • Adding sources to the kernel tree
Linux device model
  • Understand how the kernel is designed
  • To support device drivers
  • The device model
  • Binding devices and drivers
  • Platform devices, Device Tree
  • Interface in userspace: /sys
I2C API
  • The I2C subsystem of the kernel
  • Details about the API provided to kernel drivers to interact with I2C devices
Kernel frameworks
  • Block vs. character devices
  • Interaction of userspace applications with the kernel
  • Details on character devices, file_operations, ioctl(), etc…
  • Exchanging data to/from userspace
  • The principle of kernel frameworks
The input subsystem
  • Principle of the kernel input subsystem
  • API offered to kernel drivers to expose input devices capabilities to userspace application
  • Userspace API offered by the input subsystem
Memory management and accessing hardware
  • Linux: memory management
  • Physical and virtual (kernel and user) address spaces
  • Linux memory management implementation
  • Allocating with kmalloc()
  • Allocating by pages
  • Allocating with vmalloc()
The misc kernel subsystem
  • What the misc kernel subsystem is useful for 
  • API of the misc kernel subsystem, both the kernel side and userspace side
Processes, scheduling, sleeping, waiting for resources and interrupt management
  • Process management in the Linux kernel
  • The Linux kernel scheduler and how processes sleep
  • Interrupt handling in device drivers: interrupt handler registration and programming, scheduling deferred work
Locking
  • Issues with concurrent access to resources
  • Locking primitives: mutexes, semaphores, spinlocks
  • Atomic operations
  • Typical locking issues
  • Using the lock validator to identify the sources of locking problems
Kernel debugging techniques
  • Debugging with printk
  • Debugfs entries
  • Analyzing a kernel oops
  • Using kgdb, a kernel debugger
  • Using the Magic SysRq commands
  • Debugging through a JTAG probe
ARM board support and SoC support
  • Understand the organization of the ARM support code
  • Understand how the kernel can be ported to a new hardware board
Working with the community
  • Organization of the kernel community
  • The release schedule and process: release candidates, stable releases, long-term support, etc…
  • Legal aspects, licensing
  • How to submit patches to contribute code to the community

How long is the Training

The duration of the training can be adapted to the client’s needs.
The normal training lasts 5 days – from 9am to 5pm.

Language

The course is given in English or Italian or Spanish.
The training material is in English in all cases.

Pre-Requisite

Be proficient in C programming language
Be familiar with basic Linux command line and utilities.
Know the basics of building programs

(these prerequisites are not mandatory but would help in being more efficient during the training)

 


Would you like to participate?