Embedded Linux Kernel and Driver Development

מק"ט: #5913 | משך קורס: 40 שעות אק'

This course focuses on the basic elements of the Linux kernel, which allow programmers to build modules and device drivers. The students will gain a general understanding of the basic tools and interfaces, in order to successfully modify features and develop new aspects of the kernel. Major topics include full code examples and hands on exercises.

לפרטים נוספים, מלא את פרטיך או התקשר 03-7100673
*שדות חובה


  • Understanding the Linux kernel
  • Developing Linux device drivers
  • Linux kernel debugging
  • Porting the Linux kernel to a new board
  • Working with the kernel development community
  • Practical labs with the ARM-based Beagle Bone Black board

קהל יעד

  • People developing devices using the Linux kernel
  • People supporting embedded Linux system developers
  • Embedded Developers

תנאי קדם

  • Solid experience in C programming
  • Knowledge and practice of UNIX or GNU/Linux commands
  • Experience in embedded Linux development


Introduction to the Linux kernel

  • Kernel features
  • Understanding the development process
  • Legal constraints with device drivers
  • Kernel user interface (/proc and /sys)
  • User space device drivers

Kernel sources

  • Specifics of Linux kernel development
  • Coding standards
  • Retrieving Linux kernel sources
  • Tour of the Linux kernel sources
  • Kernel source code browsers: cscope, Kscope, Linux Cross Reference (LXR)

Configuring, compiling and booting the Linux kernel

  • Kernel configuration
  • Native and cross compilation. Generated files
  • Booting the kernel. Kernel booting parameters
  • Mounting a root file system on 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 user space: /sys

Introduction to the I2C API

  • The I2C subsystem of the kernel
  • Details about the API provided to kernel drivers to interact with I2C devices

Pin muxing

  • Understand the pinctrl framework of the kernel
  • Understand how to configure the muxing of pins

Kernel frameworks

  • Block vs. character devices
  • Interaction of user space applications with the kernel
  • Details on character devices, file_operations, ioctl(), etc.
  • Exchanging data to/from user space
  • 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 user space applications
  • User space API offered by the input subsystem

Memory management

  • Linux: memory management – Physical and virtual (kernel and user) address spaces
  • Linux memory management implementation
  • Allocating with kmalloc()
  • Allocating by pages
  • Allocating with vmalloc()

I/O memory and ports

  • I/O register and memory range registration
  • I/O register and memory access
  • Read / write memory barriers

The misc kernel subsystem

  • What the misc kernel subsystem is useful for
  • API of the misc kernel subsystem, both the kernel side and user space side

Processes, scheduling, sleeping and Interrupts

  • 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


  • Issues with concurrent access to shared resources
  • Locking primitives: mutexes, semaphores, spinlocks
  • Atomic operations
  • Typical locking issues
  • Using the lock validator to identify the sources of locking problems

Driver debugging techniques

  • Debugging with printk
  • Using Debugfs
  • Analyzing a kernel oops
  • Using kgdb, a kernel debugger
  • Using the Magic SysRq commands
  • Debugging through a JTAG probe