Chapter 1: Starting Out
Selecting the right operating system
Hardware for embedded Linux
Hardware used in this book
Software used in this book
Chapter 2: Learning About Toolchains
Types of toolchain - native versus cross toolchain
Other tools in the toolchain
Looking at the components of the C library
Linking with libraries: static and dynamic linking
The art of cross compiling
Problems with cross compiling
Chapter 3: All About Bootloaders
What does a bootloader do?
Booting with UEFI firmware
Moving from bootloader to kernel
Chapter 4: Porting and Configuring the Kernel
Porting Linux to a new board
Chapter 5: Building a Root Filesystem
What should be in the root filesystem?
Programs for the root filesystem
Libraries for the root filesystem
The proc and sysfs filesystems
Transfering the root filesystem to the target
Configuring user accounts
Starting a daemon process
A better way of managing device nodes
Creating filesystem images with device tables
Mounting the root filesystem using NFS
Using TFTP to load the kernel
Chapter 6: Selecting a Build System
No more rolling your own embedded Linux
Package formats and package managers
Chapter 7: Creating a Storage Strategy
Accessing flash memory from the bootloader
Accessing flash memory from Linux
Filesystems for flash memory
Filesystems for NOR and NAND flash memory
Filesystems for managed flash
Read-only compressed filesystems
Making the root filesystem read-only
Chapter 8: Introducing Device Drivers
The role of device drivers
Finding out about drivers at runtime
Finding the right device driver
Device drivers in user-space
Writing a kernel device driver
Discovering hardware configuration
Chapter 9: Starting up - the init Program
After the kernel has booted
Introducing the init programs
Chapter 10: Learning About Processes and Threads
Chapter 11: Managing Memory
Kernel space memory layout
How much memory does my application use?
Chapter 12: Debugging with GDB
Debugging applications using GDB
Remote debugging using gdbserver
Debugging shared libraries
Debugging forks and threads
Chapter 13: Profiling and Tracing
Other profilers: OProfile and gprof
Using Valgrind for application profiling
Using strace to show system calls
Chapter 14: Real-time Programming
Identifying the sources of non-determinism
Understanding scheduling latency
The real-time Linux kernel (PREEMPT_RT)
Threaded interrupt handlers
Getting the PREEMPT_RT patches
Avoiding page faults in a real-time application
Measuring scheduling latencies