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.
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
- 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