Students Free Training

Embedded Linux Development (LFD450)

Learn to develop embedded Linux products step by step—set up a development system, configure boot loaders, the kernel, drivers, and device trees, and build a user space root filesystem.

Updated 2026-03-17
English

Description

Learn to develop embedded Linux products step by step—set up a development system, configure boot loaders, the kernel, drivers, and device trees, and build a user space root filesystem. Hands-on labs with a RISC-V-based emulated target provide practical experience across industries like electronics, medical, and automotive.

Summary

Learn to develop embedded Linux products step by step—set up a development system, configure boot loaders, the kernel, drivers, and device trees, and build a user space root filesystem.

What You'll Learn

  • In this course you will learn about the Linux kernel architecture, emphasizing the essential points relevant to adapting the kernel to a custom embedded platform.
  • The course also covers techniques for right-sizing systems to meet project constraints, the multitude of resources available for constructing a cross development environment for embedded projects, the options available for populating libraries and application user-spaces to meet the goals and constraints of embedded systems, and more.

Prerequisites

  • The course is primarily intended for experienced developers, programmers, and engineers who are interested in learning how to adapt Linux to an embedded system.
  • You should be familiar with basic Linux utilities, know the C programming language, and be comfortable developing for Linux or UNIX.
  • Pre-class preparation material will be provided before class

Outline

34 modules 4 Days total
  • Objectives
  • Who You Are
  • The Linux Foundation
  • Copyright and No Confidential Information
  • Linux Foundation Training
  • Certification Programs and Digital Badging
  • Linux Distributions
  • Platforms
  • Preparing Your System
  • Things change in Linux
  • Documentation and Links
  • Linux Distributions
  • Virtual Machine Installation
  • Procedures
  • Labs
  • Overview on How to Contribute Properly
  • Know Where the Code is Coming From: DCO and CLA
  • Stay Close to Mainline for Security and Quality
  • Study and Understand the Project DNA
  • Figure Out What Itch You Want to Scratch
  • Identify Maintainers and Their Work Flows and Methods
  • Get Early Input and Work in the Open
  • Contribute Incremental Bits, Not Large Code Dumps
  • Leave Your Ego at the Door: Don't Be Thin-Skinned
  • Be Patient, Develop Long Term Relationships, Be Helpful
  • Basic Concepts
  • Protection Motivations
  • Off the Shelf (OTS)
  • Embedded Caveats
  • Real Time Operating Systems
  • Real Time Linux
  • Custom Hardware Assistance
  • Resources
  • Introduction
  • Why is it Hard?
  • Project Goal Considerations
  • Links to Additional Discussions
  • Labs
  • Introduction
  • Kbuild Makefiles
  • Kconfig Basics
  • Searching Kconfig
  • The Compiler Triplet
  • Built-in Linux Distribution Cross Compiler
  • Linaro
  • CodeSourcery
  • crosstool-ng
  • Buildroot
  • OpenEmbedded
  • Yocto Project
  • Clang
  • Labs
  • What is QEMU?
  • Why use QEMU?
  • Emulated Architectures
  • Image Formats
  • Labs
  • Why do we use uSD cards?
  • Getting SW onto a uSD card
  • Booting from flash
  • Why is using uSD cards a bad idea?
  • Labs
  • Using virtual Hardware
  • An easier way to develop
  • The Boot Sequence using TFTP and NFSroot
  • Objectives of the Lab
  • Labs
  • Boot Code Stages
  • Some GPL BIOSes
  • Some GPL Boot Loaders
  • Das U-Boot
  • U-Boot Command Line
  • U-Boot Environment
  • Labs
  • Configuring the Kernel for the Development Board
  • Labs
  • Types of Devices
  • Device Nodes
  • Character Drivers
  • An Example
  • Labs
  • What are Device Trees?
  • What Device Trees Do and What They Do Not Do
  • Device Tree Syntax
  • Device Tree Walk Through
  • Device Tree Bindings
  • Device Tree support in Boot Loaders
  • Using Device Tree Data in Drivers
  • Coexistence and Conversion of Old Drivers
  • Labs
  • Embedded Filesystem Goals
  • Directories: a Survey
  • Embedded Filesystem Types
  • Objectives of the Lab
  • Labs
  • SysV init vs. BusyBox init
  • udev vs. BusyBox mdev
  • Systemd
  • C Library Choices
  • Labs
  • Configuring uClibc for NFS
  • Labs
  • What is musl?
  • Configuring BuildRoot for musl
  • Labs
  • Basic Workings
  • Integrated with Buildroot
  • Labs
  • Tracing and Profiling
  • Ftrace, Trace-Cmd, Kernelshark
  • Perf
  • Using perf
  • sysctl
  • SysRq Key
  • oops Messages
  • Kernel Debuggers
  • debugfs
  • Oft-Needed Embedded Components
  • Taking Inventory of Kernel Sizes
  • What are MTD Devices?
  • NAND vs. NOR vs. eMMC
  • Driver and User Modules
  • Flash Filesystems
  • SquashFS
  • Deploying in an MTD Partition
  • Labs
  • When do we need to update?
  • Update strategies
  • Prebuilt upgrade systems
  • Labs
  • Predictability and Preemption and Locks
  • PREEMPT RT Project
  • Real-Time Checklist
  • Evaluation Survey
  • Linux and UNIX
  • Monolithic and Micro Kernels
  • Main Kernel Tasks
  • User-Space and Kernel-Space
  • Installation and Layout of the Kernel Source
  • Kernel Browsers
  • Kernel Configuration Files
  • Why is it Hard? Part 2
  • Coding Style
  • kernel-doc
  • Using Generic Kernel Routines and Methods
  • Error Numbers, Printing Kernel Output, syslogd
  • Task Structure
  • Memory Allocation
  • Transferring Data between User and Kernel Space
  • What are Modules?
  • A Trivial Example
  • Compiling Modules
  • Modules vs Built-in
  • Module Utilities
  • Automatic Module Loading
  • Module Usage Count
  • Module Licensing
  • Exporting Symbols
  • Resolving Symbols
  • Labs
  • Objectives of the Lab
  • Labs
  • Objectives of the Lab
  • Labs
  • An easier way to develop
  • The Boot Sequence using TFTP and NFSroot
  • Objectives of the Lab
  • Labs