Training > IoT & Embedded Development > Embedded Linux Development (LFD450)

Embedded Linux Development (LFD450)

This instructor-led course will give you the step-by-step framework for developing an embedded Linux product. Starting with the cross-compiler, you’ll learn about setting up a development system, boot loaders, the kernel, drivers, device tree, and all the various software and decisions that need to be made when building a user space root filesystem, such as those in use in consumer electronics, military, medical, industrial, and auto industries. Hands-on labs with a RISC-V based emulated development target allow students to practice both coding and building the various parts of the system covered in class.

Who Is It For

This course is for experienced developers who need to develop an embedded Linux product from the ground up.
read less read more
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.
read less read more
What It Prepares You For

The course will prepare you to use the tools and techniques necessary for developing embedded Linux devices.
read less read more
Course Outline
Expand All
Collapse All
- Objectives
- Who You Are
- The Linux Foundation
- 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
How to Work in OSS Projects **
- Overview on How to Contribute Properly
- 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
Embedded and Real-Time Systems Concepts
- Basic Concepts
- Protection Motivations
- Off the Shelf (OTS)
- Embedded Caveats
- Real Time Operating Systems
- Real Time Linux
- Custom Hardware Assistance
- Resources
Cross-Development Environments: Goals and Needs
- Introduction
- Why is it Hard?
- Project Goal Considerations
- Links to Additional Discussions
- Labs
Kbuild System
- Introduction
- Kbuild Makefiles
- Kconfig Basics
- Searching Kconfig
Cross-Development Toolchain
- 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
Booting a Target Development Board from uSD
- Why do we use uSD cards?
- Getting SW onto a uSD card
- Why is using uSD cards a bad idea?
- Labs
Booting a Target Development Board over Ethernet
- Using virtual Hardware
- An easier way to develop
- Objectives of the Lab
- Labs
Boot loaders and U-Boot
- Boot Code Stages
- Some GPL BIOSes
- Some GPL Boot Loaders
- Das U-Boot
- U-Boot Command Line
- U-Boot Environment
- Labs
Kernel Configuration, Compilation, Booting
- Configuring the Kernel for the Development Board
- Labs
Device Drivers**
- Types of Devices
- Device Nodes
- Character Drivers
- An Example
- Labs
Device Trees
- 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
Target Filesystem Packaging
- Embedded Filesystem Goals
- Directories: a Survey
- Embedded Filesystem Types
Build Target Root Filesystem
- Objectives of the Lab
- Labs
Root Filesystem Choices
- SysV init vs. BusyBox init
- udev vs. BusyBox mdev
- Systemd
- C Library Choices
- Labs
Configuring uClibc
- Configuring uClibc for NFS
- Labs
Another Alternate C-library: musl **
- What is musl?
- Configuring BuildRoot for musl
- Labs
Build BusyBox Utility Suite
- Basic Workings
- Integrated with Buildroot
- Labs
Kernel Monitoring and Debugging
- Tracing and Profiling
- Ftrace, Trace-Cmd, Kernelshark
- Perf
- Using perf
- sysctl
- SysRq Key and oops Messages
- Kernel Debuggers
- Labs
- Oft-Needed Embedded Components
- Taking Inventory of Kernel Sizes
Memory Technology Devices (Flash Memory Filesystems)
- What are MTD Devices?
- NAND vs. NOR vs. eMMC
- Driver and User Modules
- Flash Filesystems
Compressed Filesystems
- SquashFS
- Deploying in an MTD Partition
- Labs
System Upgrades
- When do we need to update?
- Update strategies
- Prebuilt upgrade systems
- Labs
Real-Time Extensions
- Predictability and Preemption and Locks
- PREEMPT RT Project
- Real-Time Checklist
Closing and Evaluation Survey
- Evaluation Survey
Basic Target Development Board Setup
- Objectives of the Lab
- Labs
Booting the Target Development Board from uSD
- Objectives of the Lab
- Labs
Booting a Target Development Board over Ethernet
- An easier way to develop
- Objectives of the Lab
- Labs
Kernel Architecture Preview
- Linux and UNIX
- Monolithic and Micro Kernels
- Main Kernel Tasks
- User-Space and Kernel-Space
Kernel Source Tree Overview
- Installation and Layout of the Kernel Source
- Kernel Browsers
- Kernel Configuration Files
- Why is it Hard? Part 2
Kernel Programming Preview
- 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

** These sections may be considered in part or in whole as optional. They contain either background reference material, specialized topics, or advanced subjects. The instructor may choose to cover or not cover them depending on classroom experience and time constraints.
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.
Dec 2021
Thank you for being an awesome instructor.
Dec 2021
The labs were really useful in order to get a practical experience of the topics.
Dec 2021
The breadth of topics covered, and hands-on lab exercises.
Dec 2021
The labs, and access to the instructor's personal experience and knowledge. I may never speak with someone in my life who knows more about Linux than Behan!
Dec 2021
I really enjoyed learning about the kernel fundamentals, as well as writing device drivers, and cross compiling with different compilers. Gave me great insight on menuconfig, really great experience on those chapters.
Dec 2021
Lots of labs, and very structured.
Oct 2021
John Bonesio's jokes were pretty great, especially at the beginning of each day, as it set the mood. Overall, he did not make it feel like I was taking a class, he made it fun to learn.
Oct 2021
I liked the instructor, John Bonesio. He was funny, and he made the content interesting and engaging. He was also super helpful, and always waited until everyone was done with the labs, so nobody got left behind. It made me feel comfortable, and I knew that if I ever needed help, he would most certainly have taken the time to help me as much as he could.
Oct 2021
The chapters 4-14 were my core interests, so laying down the different ways/possibilities to go about things to me, was an eye-opener. The labs also were very useful, so now I feel comfortable playing around with Uboots, Kernel, Device tree etc.
Oct 2021
I liked the section on Device Trees the most, since that was the area that was most confusing to me before.
Jul 2021
The course covers a wide range of topics.
Jun 2021
Behan was a great teacher, very knowledgeable on the subject.
Jun 2021
There was a lot of time to do the exercises, but at the same time the instructor was helpful when I was in need. The instructor has knowledge greater than in the attached training book, and he shared it with passion. The training was organized very well, and did not require much tinkering on my side.
May 2021
Karl was exceptionally friendly, and willing to help. He kept the training interesting and relatable, by explaining his experience with imbedded linux systems.
May 2021
Live and Instructor-led classes are great!
Mar 2021
Fantastic class, Behan is an amazing teacher! I feel very well prepared to begin diving into Embedded Linux Development.
Mar 2021
I liked how knowledgeable the instructor was, and I also gained knowledge about Linux topics that were outside the textbook.
Mar 2021
It covered a lot of ground. I now have a much better feel about where I need to invest more time learning.
Jan 2021
I thought the course presenter was very knowledgeable about the topic, and provided good information beyond what was in the course. I found his firsthand, and "a friend of mine" accounts, particularly insightful.
Jan 2021
I found the devkit script extremely helpful! Saved us a lot of time when typing out long qemu commands. Also, using $RESOURCES and $SOLUTION was nice.
Jan 2021
I liked that our instructor was a well qualified Linux guru.
Jan 2021
Instructor was great!