Organization of the Material

There are three major parts to this book. The first part is composed of Chapter 1 through Chapter 3. These chapters cover the preliminary background required for building any sort of embedded Linux system. Though they describe no hands-on procedures, they are essential to understand many aspects of building embedded Linux systems.

The second part spans Chapter 4 through Chapter 9. These important chapters lay out the essential steps involved in building any embedded Linux system. Regardless of your systems' purpose or functionality, these chapters are required reading.

The final part of the book is made up of Chapter 10 and Chapter 11, and covers material that, though very important, is not essential to building embedded Linux systems.

Chapter 1 gives an in-depth introduction to the world of embedded Linux. It lays out basic definitions and then introduces real-life issues about embedded Linux systems, including a discussion of open source and free software licenses from the embedded perspective. The chapter then introduces the example system used in other parts of this book and the implementation method used throughout the book.

Chapter 2 outlines the basic concepts that are common to building all embedded Linux systems.

Chapter 3 provides a thorough review of the embedded hardware supported by Linux, and gives links to web sites where the drivers and subsystems implementing this support can be found. This chapter discusses processor architectures, buses and interfaces, I/O, storage, general purpose networking, industrial grade networking, and system monitoring.

Chapter 4 covers the installation and use of the various development tools used in building embedded Linux systems. This includes, most notably, how to build and install the GNU toolchain components from scratch. It also includes sections discussing Java, Perl, and Python, along with a section about the various terminal emulators that can be used to interact with an embedded target.

Chapter 5 discusses the selection, configuration, cross-compiling, installation, and use of the Linux kernel in an embedded system.

Chapter 6 explains how to build a root filesystem using the components introduced earlier in the book, including the installation of the C library and the creation of the appropriate /dev entries. More importantly, this chapter covers the installation and use of BusyBox, TinyLogin, Embutils, and System V init.

Chapter 7 covers the intricacies of manipulating and setting up storage devices for embedded Linux systems. The chapter's emphasis is on solid-state storage devices, such as native flash and DiskOnChip devices, and the MTD subsystem.

Chapter 8 explains how to set up the root filesystem created in Chapter 6 for the embedded system's storage device. This includes the creation of JFFS2 and CRAMFS filesystem images, and the use of disk-style filesystems over NFTL.

Chapter 9 discusses the various bootloaders available for use in each embedded Linux architecture. Special emphasis is put on the use of GRUB with DiskOnChip devices, and U-Boot. Network booting using BOOTP/DHCP, TFTP, and NFS is also covered.

Chapter 10 focuses on the configuration, installation, and use of software packages that offer networking services, such as SNMP, SSH, and HTTP.

Chapter 11 covers the main debugging issues encountered in developing software for embedded Linux systems. This includes the use of gdb in a cross-platform development environment, tracing, performance analysis, and memory debugging.

Appendix A introduces a worksheet that can be used in conjunction with this book to provide a complete specification of an embedded Linux system.

Appendix B provides resources you may find useful when building embedded Linux systems.

Appendix C includes important postings by Linus Torvalds and other kernel developers regarding the kernel's licensing and the issue of non-GPL binary kernel modules.

Though Chapter 7 through Chapter 9 are independent, note that their content is highly interrelated. Setting up the target's storage device as discussed in Chapter 7, for example, requires a basic knowledge about the target filesystem organization as discussed in Chapter 8, and vice versa. So, too, does setting up storage devices require a basic knowledge of bootloader set up and operation as discussed in Chapter 9, and vice versa. I therefore recommend that you read Chapter 7 through Chapter 9 in one breath a first time before carrying out the instructions of any of these chapters. When setting up your target thereafter, you will nevertheless follow the same sequence of operations outlined in these chapters.