Embedded Linux Primer: A Practical Real-World Approach / Edition 1

Paperback (Print)
Used and New from Other Sellers
Used and New from Other Sellers
from $11.85
Usually ships in 1-2 business days
(Save 76%)
Other sellers (Paperback)
  • All (6) from $11.85   
  • New (3) from $32.00   
  • Used (3) from $11.85   
Close
Sort by
Page 1 of 1
Showing All
Note: Marketplace items are not eligible for any BN.com coupons and promotions
$32.00
Seller since 2010

Feedback rating:

(26)

Condition:

New — never opened or used in original packaging.

Like New — packaging may have been opened. A "Like New" item is suitable to give as a gift.

Very Good — may have minor signs of wear on packaging but item works perfectly and has no damage.

Good — item is in good condition but packaging may have signs of shelf wear/aging or torn packaging. All specific defects should be noted in the Comments section associated with each item.

Acceptable — item is in working order but may show signs of wear such as scratches or torn packaging. All specific defects should be noted in the Comments section associated with each item.

Used — An item that has been opened and may show signs of wear. All specific defects should be noted in the Comments section associated with each item.

Refurbished — A used item that has been renewed or updated and verified to be in proper working condition. Not necessarily completed by the original manufacturer.

New
2006 Softcover New 0131679848. This specific softcover book is in new condition and has a cover free from blemishes and scuffing with sharp corners and edges. The pages are ... clean, crisp, unmarked and uncreased. We package all books in custom cardboard book boxes for shipment and ship daily with tracking numbers.; "Comprehensive Real-World Guidance for Every Embedded Developer and EngineerThis book brings together indispensable knowledge for building efficient, high-value, Linux-based embedded products: information that has never been assembled in one place before. Drawing on years of experience as an embedded Linux consultant and field application engineer, Christopher Hallinan offers solutions for the specific technical issues you're most likely to face, demonstrates how to build an effective embedded Linux environment, and shows how to use it as productively as possible. Hallinan begins by touring a typical Linux-based embedded system, introducing key concepts and components, and calling attention to di Read more Show Less

Ships from: Pittsburgh, PA

Usually ships in 1-2 business days

  • Canadian
  • Standard, 48 States
  • Standard (AK, HI)
  • Express, 48 States
  • Express (AK, HI)
$70.00
Seller since 2014

Feedback rating:

(148)

Condition: New
Brand new.

Ships from: acton, MA

Usually ships in 1-2 business days

  • Standard, 48 States
  • Standard (AK, HI)
$105.00
Seller since 2014

Feedback rating:

(148)

Condition: New
Brand new.

Ships from: acton, MA

Usually ships in 1-2 business days

  • Standard, 48 States
  • Standard (AK, HI)
Page 1 of 1
Showing All
Close
Sort by

Overview

Up-to-the-Minute, Complete Guidance for Developing Embedded Solutions with Linux

Linux has emerged as today’s #1 operating system for embedded products. Christopher Hallinan’s Embedded Linux Primer has proven itself as the definitive real-world guide to building efficient, high-value, embedded systems with Linux. Now, Hallinan has thoroughly updated this highly praised book for the newest Linux kernels, capabilities, tools, and hardware support, including advanced multicore processors.

Drawing on more than a decade of embedded Linux experience, Hallinan helps you rapidly climb the learning curve, whether you’re moving from legacy environments or you’re new to embedded programming. Hallinan addresses today’s most important development challenges and demonstrates how to solve the problems you’re most likely to encounter.

You’ll learn how to build a modern, efficient embedded Linux development environment, and then utilize it as productively as possible. Hallinan offers up-to-date guidance on everything from kernel configuration and initialization to bootloaders, device drivers to file systems, and BusyBox utilities to real-time configuration and system analysis. This edition adds entirely new chapters on UDEV, USB, and open source build systems.

  • Tour the typical embedded system and development environment and understand its concepts and components.
  • Understand the Linux kernel and userspace initialization processes.
  • Preview bootloaders, with specific emphasis on U-Boot.
  • Configure the Memory Technology Devices (MTD) subsystem to interface with flash (and other) memory devices.
  • Make the most of BusyBox and latest open source development tools.
  • Learn from expanded and updated coverage of kernel debugging.
  • Build and analyze real-time systems with Linux.
  • Learn to configure device files and driver loading with UDEV.
  • Walk through detailed coverage of the USB subsystem.
  • Introduces the latest open source embedded Linux build systems.
  • Reference appendices include U-Boot and BusyBox commands.
Read More Show Less

Product Details

Meet the Author

Christopher Hallinan is a technical marketing engineer for the Embedded Systems Division of Mentor Graphics, living and working in Florida. He has spent more than 25 years in the networking and communications industry, mostly in various product development, management, and marketing roles, where he developed a strong background in the space where hardware meets software. Prior to joining Mentor Graphics, he spent nearly seven years as a field applications engineer for Monta Vista Software. Before that, Hallinan spent four years as an independent Linux consultant, providing custom Linux board ports, device drivers, and bootloaders. His introduction to the open source community was through contributions to the popular U-Boot bootloader. When not messing about with Linux, he is often found singing and playing a Taylor or Martin.

Read More Show Less

Read an Excerpt

Embedded Linux PrimerEmbedded Linux PrimerPreface

Although many good books cover Linux, none brings together so many dimensions of information and advice specifically targeted to the embedded Linux developer. Indeed, there are some very good books written about the Linux kernel, Linux system administration, and so on. You will find references right here in this book to many of the ones that I consider to be at the top of their categories.

Much of the material presented in this book is motivated by questions I've received over the years from development engineers, in my capacity as an embedded Linux consultant and my present role as a Field Application Engineer for Monta Vista Software, the leading vendor of embedded Linux distributions.

Embedded Linux presents the experienced software engineer with several unique challenges. First, those with many years of experience with legacy real-time operating systems (RTOSes) find it difficult to transition their thinking from those environments to Linux. Second, experienced application developers often have difficulty understanding the relative complexities of a cross-development environment.

Although this is a primer, intended for developers new to embedded Linux, I am confident that even developers who are experienced in embedded Linux will find some useful tips and techniques that I have learned over the years.Practical Advice for the Practicing Embedded Developer

This book contains my view of what an embedded engineer needs to know to get up to speed fast in an embedded Linux environment. Instead of focusing on Linux kernel internals, the kernel chapter in this book focuses on the project nature of thekernel and leaves the internals to the other excellent texts on the subject. You will learn the organization and layout of the kernel source tree. You will discover the binary components that make up a kernel image, and how they are loaded and what purpose they serve on an embedded system. One of my favorite figures in the book is Figure 5-1, which schematically illustrates the build process of a composite kernel image.

In the pages of this book, you will learn how the build system works and how to incorporate into the Linux kernel your own custom changes that are required for your own projects. You will discover the mechanism used to drive the configuration of different architectures and features within the Linux kernel source tree and, more important, how to modify this system to customize it to your own requirements. We also cover in detail the kernel command-line mechanism. You will learn how it works, how to configure the kernel's runtime behavior for your requirements, and how to extend this functionality to your own project. You will learn how to navigate the kernel source code and how to configure the kernel for specific tasks related to an embedded system. You will learn many useful tips and tricks for your embedded project, from bootloaders, system initialization, file systems, and Flash memory to advanced kernel- and application-debugging techniques. Intended Audience

This book is intended for programmers with a working knowledge of programming in C. I assume that you have a rudimentary understanding of local area networks and the Internet. You should understand and recognize an IP address and how it is used on a simple local area network. I also assume that you have an understanding of hexadecimal and octal numbering systems, and their common usage in a text such as this.

Several advanced concepts related to C compiling and linking are explored, so you will benefit from having at least a cursory understanding of the role of the linker in ordinary C programming. Knowledge of the GNU make operation and semantics will also prove beneficial.What This Book Is Not

This book is not a detailed hardware tutorial. One of the difficulties the embedded developer faces is the huge variety of hardware devices in use today. The user manual for a modern 32-bit processor with some integrated peripherals can easily exceed 1,000 pages. There are no shortcuts. If you need to understand a hardware device from a programmer's point of view, you will need to spend plenty of hours in your favorite reading chair with hardware data sheets and reference guides, and many more hours writing and testing code for these hardware devices!

This is also not a book about the Linux kernel or kernel internals. In this book, you won't learn about the intricacies of the Memory Management Unit (MMU) used to implement Linux's virtual memory-management policies and procedures; there are already several good books on this subject. You are encouraged to take advantage of the "Suggestions for Additional Reading" section found at the end of every chapter.Conventions Used

Filenames and code statements are presented in Courier. Commands issued by the reader are indicated in bold Courier. New terms or important concepts are presented in italics.

When you see a pathname preceded with three dots, this references a well-known but unspecified top-level directory. The top-level directory is context dependent but almost universally refers to a top-level Linux source directory. For example, .../arch/ppc/kernel/setup.c refers to the setup.c file located in the architecture branch of a Linux source tree. The actual path might be something like ~/sandbox/linux.2.6.14/arch/ppc/kernel/setup.c.Organization of the Book

Chapter 1, "Introduction," provides a brief look at the factors driving the rapid adoption of Linux in the embedded environment. Several important standards and organizations relevant to embedded Linux are introduced.

Chapter 2, "Your First Embedded Experience," introduces the reader to many concepts related to embedded Linux upon which we build in later chapters.

In Chapter 3, "Processor Basics," we present a high-level look at the more popular processors and platforms that are being used to build embedded Linux systems. We examine selected products from many of the major processor manufacturers. All of the major architecture families are represented.

Chapter 4, "The Linux Kernel—A Different Perspective," examines the Linux kernel from a slightly different perspective. Instead of kernel theory or internals, we look at its structure, layout, and build construction so you can begin to learn your way around this large software project and, more important, learn where your own customization efforts must be focused. This includes detailed coverage of the kernel build system.

Chapter 5, "Kernel Initialization," details the Linux kernel's initialization process. You will learn how the architecture- and bootloader-specific image components are concatenated to the image of the kernel proper for downloading to Flash and booting by an embedded bootloader. The knowledge gained here will help you customize the Linux kernel to your own embedded application requirements.

Chapter 6, "System Initialization," continues the detailed examination of the initialization process. When the Linux kernel has completed its own initialization, application programs continue the initialization process in a predetermined manner. Upon completing Chapter 6, you will have the necessary knowledge to customize your own userland application startup sequence.

Chapter 7, "Bootloaders," is dedicated to the booloader and its role in an embedded Linux system. We examine the popular open-source bootloader U-Boot and present a porting example. We briefly introduce additional bootloaders in use today so you can make an informed choice about your particular requirements.

Chapter 8, "Device Driver Basics," introduces the Linux device driver model and provides enough background to launch into one of the great texts on device drivers, listed as "Suggestions for Additional Reading" at the end of the chapter.

Chapter 9, "File Systems," presents the more popular file systems being used in embedded systems today. We include coverage of the JFFS2, an important embedded file system used on Flash memory devices. This chapter includes a brief introduction on building your own file system image, one of the more difficult tasks the embedded Linux developer faces.

Chapter 10, "MTD Subsystem," explores the Memory Technology Devices (MTD) subsystem. MTD is an extremely useful abstraction layer between the Linux file system and hardware memory devices, primarily Flash memory.

Chapter 11, "BusyBox," introduces BusyBox, one of the most useful utilities for building small embedded systems. We describe how to configure and build BusyBox for your particular requirements, along with detailed coverage of system initialization unique to a BusyBox environment. Appendix C, "BusyBox Commands," lists the available BusyBox commands from a recent BusyBox release.

Chapter 12, "Embedded Development Environment," takes a detailed look at the unique requirements of a typical cross-development environment. Several techniques are presented to enhance your productivity as an embedded developer, including the powerful NFS root mount development configuration.

Chapter 13, "Development Tools," examines many useful development tools. Debugging with gdb is introduced, including coverage of core dump analysis. Many more tools are presented and explained, with examples including strace, ltrace, top, and ps, and the memory profilers mtrace and dmalloc. The chapter concludes with an introduction to the more important binary utilities, including the powerful readelf utility.

Chapter 14, "Kernel Debugging Techniques," provides a detailed examination of many debugging techniques useful for debugging inside the Linux kernel. We introduce the use of the kernel debugger KGDB, and present many useful debugging techniques using the combination of gdb and KGDB as debugging tools. Included is an introduction to using hardware JTAG debuggers and some tips for analyzing failures when the kernel won't boot.

Chapter 15, "Debugging Embedded Linux Applications," moves the debugging context from the kernel to your application programs. We continue to build on the gdb examples from the previous two chapters, and we present techniques for multithreaded and multiprocess debugging.

Chapter 16, "Porting Linux," introduces the issues related to porting Linux to your custom board. We walk through a simple example and highlight the steps taken to produce a working Linux kernel on a custom PowerPC board. Several important concepts are presented that have trapped many newcomers to Linux kernel porting. Together with the techniques presented in Chapters 13 and 14, you should be ready to tackle your own custom board port after reading this chapter.

Chapter 17, "Linux and Real Time," provides an introduction to one of the more exciting developments in embedded Linux: configuring for real time via the CONFIG_RT option. We cover the features available with RT and how they can be used in a design. We also present techniques for measuring latency in your application configuration.

The appendixes cover the GNU Public License, U-Boot Configurable Commands, BusyBox Commands, SDRAM Interface Considerations, resources for the open source developer, and a sample configuration file for one of the more popular hardware JTAG debuggers, the BDI-2000.Follow Along

You will benefit most from this book if you can divide your time between the pages of this book and your favorite Linux workstation. Grab an old x86 computer to experiment on an embedded system. Even better, if you have access to a single-board computer based on another architecture, use that. You will benefit from learning the layout and organization of a very large code base (the Linux kernel), and you will gain significant knowledge and experience as you poke around the kernel and learn by doing.

Look at the code and try to understand the examples produced in this book. Experiment with different settings, configuration options, and hardware devices. Much can be gained in terms of knowledge, and besides, it's loads of fun!GPL Copyright Notice

Portions of open-source code reproduced in this book are copyrighted by a large number of individual and corporate contributors. The code reproduced here has been licensed under the terms of the GNU Public License or GPL.

Appendix A contains the text of the GNU General Public License.

© Copyright Pearson Education. All rights reserved.

Read More Show Less

Table of Contents

Foreword for the First Edition xxv

Foreword for the Second Edition xxvi

Preface xxvii

Acknowledgments for the First Edition xxxiii

Acknowledgments for the Second Edition xxxv

About the Author xxxvi

Chapter 1 Introduction 1

1.1 Why Linux 2

1.2 Embedded Linux Today 3

1.3 Open Source and the GPL 3

1.3.1 Free Versus Freedom 4

1.4 Standards and Relevant Bodies 5

1.4.1 Linux Standard Base 5

1.4.2 Linux Foundation 6

1.4.3 Carrier-Grade Linux 6

1.4.4 Mobile Linux Initiative: Moblin 7

1.4.5 Service Availability Forum 7

1.5 Summary 8

1.5.1 Suggestions for Additional Reading 8

Chapter 2 The Big Picture 9

2.1 Embedded or Not? 10

2.1.1 BIOS Versus Bootloader 11

2.2 Anatomy of an Embedded System 12

2.2.1 Typical Embedded Linux Setup 13

2.2.2 Starting the Target Board 14

2.2.3 Booting the Kernel 16

2.2.4 Kernel Initialization: Overview 18

2.2.5 First User Space Process: init 19

2.3 Storage Considerations 20

2.3.1 Flash Memory 20

2.3.2 NAND Flash 22

2.3.3 Flash Usage 23

2.3.4 Flash File Systems 24

2.3.5 Memory Space 25

2.3.6 Execution Contexts 26

2.3.7 Process Virtual Memory 28

2.3.8 Cross-Development Environment 30

2.4 Embedded Linux Distributions 32

2.4.1 Commercial Linux Distributions 33

2.4.2 Do-It-Yourself Linux Distributions 33

2.5 Summary 34

2.5.1 Suggestions for Additional Reading 35

Chapter 3 Processor Basics 37

3.1 Stand-Alone Processors 38

3.1.1 IBM 970FX 39

3.1.2 Intel Pentium M 39

3.1.3 Intel Atom™ 40

3.1.4 Freescale MPC7448 40

3.1.5 Companion Chipsets 41

3.2 Integrated Processors: Systems on Chip 43

3.2.1 Power Architecture 44

3.2.2 Freescale Power Architecture 44

3.2.3 Freescale PowerQUICC I 45

3.2.4 Freescale PowerQUICC II 46

3.2.5 PowerQUICC II Pro 47

3.2.6 Freescale PowerQUICC III 48

3.2.7 Freescale QorIQ™ 48

3.2.8 AMCC Power Architecture 50

3.2.9 MIPS 53

3.2.10 Broadcom MIPS 54

3.2.11 Other MIPS 55

3.2.12 ARM 55

3.2.13 TI ARM 56

3.2.14 Freescale ARM 58

3.2.15 Other ARM Processors 59

3.3 Other Architectures 59

3.4 Hardware Platforms 60

3.4.1 CompactPCI 60

3.4.2 ATCA 60

3.5 Summary 61

3.5.1 Suggestions for Additional Reading 62

Chapter 4 The Linux Kernel: A Different Perspective 63

4.1 Background 64

4.1.1 Kernel Versions 65

4.1.2 Kernel Source Repositories 67

4.1.3 Using git to Download a Kernel 68

4.2 Linux Kernel Construction 68

4.2.1 Top-Level Source Directory 69

4.2.2 Compiling the Kernel 69

4.2.3 The Kernel Proper: vmlinux 72

4.2.4 Kernel Image Components 73

4.2.5 Subdirectory Layout 77

4.3 Kernel Build System 78

4.3.1 The Dot-Config 78

4.3.2 Configuration Editor(s 80

4.3.3 Makefile Targets 83

4.4 Kernel Configuration 89

4.4.1 Custom Configuration Options 91

4.4.2 Kernel Makefiles 95

4.5 Kernel Documentation 96

4.6 Obtaining a Custom Linux Kernel 96

4.6.1 What Else Do I Need 97

4.7 Summary 97

4.7.1 Suggestions for Additional Reading 98

Chapter 5 Kernel Initialization 99

5.1 Composite Kernel Image: Piggy and Friends 100

5.1.1 The Image Object 103

5.1.2 Architecture Objects 104

5.1.3 Bootstrap Loader 105

5.1.4 Boot Messages 106

5.2 Initialization Flow of Control 109

5.2.1 Kernel Entry Point: head.o 111

5.2.2 Kernel Startup: main.c 113

5.2.3 Architecture Setup 114

5.3 Kernel Command-Line Processing 115

5.3.1 The __setup Macro 116

5.4 Subsystem Initialization 122

5.4.1 The *__initcall Macros 122

5.5 The init Thread 125

5.5.1 Initialization Via initcalls 126

5.5.2 initcall_debug 127

5.5.3 Final Boot Steps 127

5.6 Summary 129

5.6.1 Suggestions for Additional Reading 130

Chapter 6 User Space Initialization 131

6.1 Root File System 132

6.1.1 FHS: File System Hierarchy Standard 133

6.1.2 File System Layout 133

6.1.3 Minimal File System 134

6.1.4 The Embedded Root FS Challenge 136

6.1.5 Trial-and-Error Method 137

6.1.6 Automated File System Build Tools 137

6.2 Kernel’s Last Boot Steps 137

6.2.1 First User Space Program 139

6.2.2 Resolving Dependencies 139

6.2.3 Customized Initial Process 140

6.3 The init Process 140

6.3.1 inittab 143

6.3.2 Sample Web Server Startup Script 145

6.4 Initial RAM Disk 146

6.4.1 Booting with initrd 147

6.4.2 Bootloader Support for initrd 148

6.4.3 initrd Magic: linuxrc 150

6.4.4 The initrd Plumbing 151

6.4.5 Building an initrd Image 152

6.5 Using initramfs 153

6.5.1 Customizing initramfs 154

6.6 Shutdown 156

6.7 Summary 156

6.7.1 Suggestions for Additional Reading 157

Chapter 7 Bootloaders 159

7.1 Role of a Bootloader 160

7.2 Bootloader Challenges 161

7.2.1 DRAM Controller 161

7.2.2 Flash Versus RAM 162

7.2.3 Image Complexity 162

7.2.4 Execution Context 165

7.3 A Universal Bootloader: Das U-Boot 166

7.3.1 Obtaining U-Boot 166

7.3.2 Configuring U-Boot 167

7.3.3 U-Boot Monitor Commands 169

7.3.4 Network Operations 170

7.3.5 Storage Subsystems 173

7.3.6 Booting from Disk 174

7.4 Porting U-Boot 174

7.4.1 EP405 U-Boot Port 175

7.4.2 U-Boot Makefile Configuration Target 176

7.4.3 EP405 First Build 177

7.4.4 EP405 Processor Initialization 178

7.4.5 Board-Specific Initialization 181

7.4.6 Porting Summary 184

7.4.7 U-Boot Image Format 185

7.5 Device Tree Blob (Flat Device Tree 187

7.5.1 Device Tree Source 189

7.5.2 Device Tree Compiler 192

7.5.3 Alternative Kernel Images Using DTB 193

7.6 Other Bootloaders 194

7.6.1 Lilo 194

7.6.2 GRUB 195

7.6.3 Still More Bootloaders 197

7.7 Summary 197

7.7.1 Suggestions for Additional Reading 198

Chapter 8 Device Driver Basics 201

8.1 Device Driver Concepts 202

8.1.1 Loadable Modules 203

8.1.2 Device Driver Architecture 204

8.1.3 Minimal Device Driver Example 204

8.1.4 Module Build Infrastructure 205

8.1.5 Installing a Device Driver 209

8.1.6 Loading a Module 210

8.1.7 Module Parameters 211

8.2 Module Utilities 212

8.2.1 insmod 212

8.2.2 lsmod 213

8.2.3 modprobe 213

8.2.4 depmod 214

8.2.5 rmmod 215

8.2.6 modinfo 216

8.3 Driver Methods 217

8.3.1 Driver File System Operations 217

8.3.2 Allocation of Device Numbers 220

8.3.3 Device Nodes and mknod 220

8.4 Bringing It All Together 222

8.5 Building Out-of-Tree Drivers 223

8.6 Device Drivers and the GPL 224

8.7 Summary 225

8.7.1 Suggestions for Additional Reading 226

Chapter 9 File Systems 227

9.1 Linux File System Concepts 228

9.1.1 Partitions 229

9.2 ext2 230

9.2.1 Mounting a File System 232

9.2.2 Checking File System Integrity 233

9.3 ext3 235

9.4 ext4 237

9.5 ReiserFS 238

9.6 JFFS2 239

9.6.1 Building a JFFS2 Image 240

9.7 cramfs 242

9.8 Network File System 244

9.8.1 Root File System on NFS 246

9.9 Pseudo File Systems 248

9.9.1 /proc File System 249

9.9.2 sysfs 252

9.10 Other File Systems 255

9.11 Building a Simple File System 256

9.12 Summary 258

9.12.1 Suggestions for Additional Reading 259

Chapter 10 MTD Subsystem 261

10.1 MTD Overview 262

10.1.1 Enabling MTD Services 263

10.1.2 MTD Basics 265

10.1.3 Configuring MTD on Your Target 267

10.2 MTD Partitions 267

10.2.1 Redboot Partition Table Partitioning 269

10.2.2 Kernel Command-Line Partitioning 273

10.2.3 Mapping Driver 274

10.2.4 Flash Chip Drivers 276

10.2.5 Board-Specific Initialization 276

10.3 MTD Utilities 279

10.3.1 JFFS2 Root File System 281

10.4 UBI File System 284

10.4.1 Configuring for UBIFS 284

10.4.2 Building a UBIFS Image 284

10.4.3 Using UBIFS as the Root File System 287

10.5 Summary 287

10.5.1 Suggestions for Additional Reading 288

Chapter 11 BusyBox 289

11.1 Introduction to BusyBox 290

11.1.1 BusyBox Is Easy 291

11.2 BusyBox Configuration 291

11.2.1 Cross-Compiling BusyBox 293

11.3 BusyBox Operation 293

11.3.1 BusyBox init 297

11.3.2 Sample rcS Initialization Script 299

11.3.3 BusyBox Target Installation 300

11.3.4 BusyBox Applets 302

11.4 Summary 303

11.4.1 Suggestions for Additional Reading 304

Chapter 12 Embedded Development Environment 305

12.1 Cross-Development Environment 306

12.1.1 “Hello World” Embedded 307

12.2 Host System Requirements 311

12.2.1 Hardware Debug Probe 311

12.3 Hosting Target Boards 312

12.3.1 TFTP Server 312

12.3.2 BOOTP/DHCP Server 313

12.3.3 NFS Server 316

12.3.4 Target NFS Root Mount 318

12.3.5 U-Boot NFS Root Mount Example 320

12.4 Summary 322

12.4.1 Suggestions for Additional Reading 323

Chapter 13 Development Tools 325

13.1 GNU Debugger (GDB) 326

13.1.1 Debugging a Core Dump 327

13.1.2 Invoking GDB 329

13.1.3 Debug Session in GDB 331

13.2 Data Display Debugger 333

13.3 cbrowser/cscope 335

13.4 Tracing and Profiling Tools 337

13.4.1 strace 337

13.4.2 strace Variations 341

13.4.3 ltrace 343

13.4.4 ps 344

13.4.5 top 346

13.4.6 mtrace 348

13.4.7 dmalloc 350

13.4.8 Kernel Oops 353

13.5 Binary Utilities 355

13.5.1 readelf 355

13.5.2 Examining Debug Information Using readelf 357

13.5.3 objdump 359

13.5.4 objcopy 360

13.6 Miscellaneous Binary Utilities 361

13.6.1 strip 361

13.6.2 addr2line 361

13.6.3 strings 362

13.6.4 ldd 362

13.6.5 nm 363

13.6.6 prelink 364

13.7 Summary 364

13.7.1 Suggestions for Additional Reading 365

Chapter 14 Kernel Debugging Techniques 367

14.1 Challenges to Kernel Debugging 368

14.2 Using KGDB for Kernel Debugging 369

14.2.1 KGDB Kernel Configuration 371

14.2.2 Target Boot with KGDB Support 372

14.2.3 Useful Kernel Breakpoints 376

14.2.4 Sharing a Console Serial Port with KGDB 377

14.2.5 Debugging Very Early Kernel Code 379

14.2.6 KGDB Support in the Mainline Kernel 380

14.3 Kernel Debugging Techniques 381

14.3.1 gdb Remote Serial Protocol 382

14.3.2 Debugging Optimized Kernel Code 385

14.3.3 GDB User-Defined Commands 392

14.3.4 Useful Kernel GDB Macros 393

14.3.5 Debugging Loadable Modules 402

14.3.6 printk Debugging 407

14.3.7 Magic SysReq Key 409

14.4 Hardware-Assisted Debugging 410

14.4.1 Programming Flash Using a JTAG Probe 411

14.4.2 Debugging with a JTAG Probe 413

14.5 When It Doesn’t Boot 417

14.5.1 Early Serial Debug Output 417

14.5.2 Dumping the printk Log Buffer 417

14.5.3 KGDB on Panic 420

14.6 Summary 421

14.6.1 Suggestions for Additional Reading 422

Chapter 15 Debugging Embedded Linux Applications 423

15.1 Target Debugging 424

15.2 Remote (Cross) Debugging 424

15.2.1 gdbserver 427

15.3 Debugging with Shared Libraries 429

15.3.1 Shared Library Events in GDB 431

15.4 Debugging Multiple Tasks 435

15.4.1 Debugging Multiple Processes 435

15.4.2 Debugging Multithreaded Applications 438

15.4.3 Debugging Bootloader/Flash Code 441

15.5 Additional Remote Debug Options 442

15.5.1 Debugging Using a Serial Port 442

15.5.2 Attaching to a Running Process 442

15.6 Summary 443

15.6.1 Suggestions for Additional Reading 444

Chapter 16 Open Source Build Systems 445

16.1 Why Use a Build System? 446

16.2 Scratchbox 447

16.2.1 Installing Scratchbox 447

16.2.2 Creating a Cross-Compilation Target 448

16.3 Buildroot 451

16.3.1 Buildroot Installation 451

16.3.2 Buildroot Configuration 451

16.3.3 Buildroot Build 452

16.4 OpenEmbedded 454

16.4.1 OpenEmbedded Composition 455

16.4.2 BitBake Metadata 456

16.4.3 Recipe Basics 456

16.4.4 Metadata Tasks 460

16.4.5 Metadata Classes 461

16.4.6 Configuring OpenEmbedded 462

16.4.7 Building Images 463

16.5 Summary 464

16.5.1 Suggestions for Additional Reading 464

Chapter 17 Linux and Real Time 465

17.1 What Is Real Time 466

17.1.1 Soft Real Time 466

17.1.2 Hard Real Time 467

17.1.3 Linux Scheduling 467

17.1.4 Latency 467

17.2 Kernel Preemption 469

17.2.1 Impediments to Preemption 469

17.2.2 Preemption Models 471

17.2.3 SMP Kernel 472

17.2.4 Sources of Preemption Latency 473

17.3 Real-Time Kernel Patch 473

17.3.1 Real-Time Features 475

17.3.2 O(1) Scheduler 476

17.3.3 Creating a Real-Time Process 477

17.4 Real-Time Kernel Performance Analysis 478

17.4.1 Using Ftrace for Tracing 478

17.4.2 Preemption Off Latency Measurement 479

17.4.3 Wakeup Latency Measurement 481

17.4.4 Interrupt Off Timing 483

17.4.5 Soft Lockup Detection 484

17.5 Summary 485

17.5.1 Suggestion for Additional Reading 485

Chapter 18 Universal Serial Bus 487

18.1 USB Overview 488

18.1.1 USB Physical Topology 488

18.1.2 USB Logical Topology 490

18.1.3 USB Revisions 491

18.1.4 USB Connectors 492

18.1.5 USB Cable Assemblies 494

18.1.6 USB Modes 494

18.2 Configuring USB 495

18.2.1 USB Initialization 497

18.3 sysfs and USB Device Naming 500

18.4 Useful USB Tools 502

18.4.1 USB File System 502

18.4.2 Using usbview 504

18.4.3 USB Utils (lsusb 507

18.5 Common USB Subsystems 508

18.5.1 USB Mass Storage Class 508

18.5.2 USB HID Class 511

18.5.3 USB CDC Class Drivers 512

18.5.4 USB Network Support 515

18.6 USB Debug 516

18.6.1 usbmon 517

18.6.2 Useful USB Miscellanea 518

18.7 Summary 519

18.7.1 Suggestions for Additional Reading 519

Chapter 19 udev 521

19.1 What Is udev? 522

19.2 Device Discovery 523

19.3 Default udev Behavior 525

19.4 Understanding udev Rules 527

19.4.1 Modalias 530

19.4.2 Typical udev Rules Configuration 533

19.4.3 Initial System Setup for udev 535

19.5 Loading Platform Device Drivers 538

19.6 Customizing udev Behavior 540

19.6.1 udev Customization Example: USB Automounting 540

19.7 Persistent Device Naming 541

19.7.1 udev Helper Utilities 542

19.8 Using udev with busybox 545

19.8.1 busybox mdev 545

19.8.2 Configuring mdev 547

19.9 Summary 548

19.9.1 Suggestions for Additional Reading 548

Appendix A GNU Public License 549

Preamble 550

Terms and Conditions for Copying, Distribution, and Modification 551

No Warranty 555

Appendix B U-Boot Configurable Commands 557

Appendix C BusyBox Commands 561

Appendix D SDRAM Interface Considerations 571

D.1 SDRAM Basics 572

D.1.1 SDRAM Refresh 573

D.2 Clocking 574

D.3 SDRAM Setup 575

D.4 Summary 580

D.4.1 Suggestions for Additional Reading 580

Appendix E Open Source Resources 581

Source Repositories and Developer Information 582

Mailing Lists 582

Linux News and Developments 583

Open Source Legal Insight and Discussion 583

Appendix F Sample BDI-2000 Configuration File 585

Index 593

Read More Show Less

Preface

Embedded Linux Primer

Preface

Although many good books cover Linux, none brings together so many dimensions of information and advice specifically targeted to the embedded Linux developer. Indeed, there are some very good books written about the Linux kernel, Linux system administration, and so on. You will find references right here in this book to many of the ones that I consider to be at the top of their categories.

Much of the material presented in this book is motivated by questions I've received over the years from development engineers, in my capacity as an embedded Linux consultant and my present role as a Field Application Engineer for Monta Vista Software, the leading vendor of embedded Linux distributions.

Embedded Linux presents the experienced software engineer with several unique challenges. First, those with many years of experience with legacy real-time operating systems (RTOSes) find it difficult to transition their thinking from those environments to Linux. Second, experienced application developers often have difficulty understanding the relative complexities of a cross-development environment.

Although this is a primer, intended for developers new to embedded Linux, I am confident that even developers who are experienced in embedded Linux will find some useful tips and techniques that I have learned over the years.

Practical Advice for the Practicing Embedded Developer

This book contains my view of what an embedded engineer needs to know to get up to speed fast in an embedded Linux environment. Instead of focusing on Linux kernel internals, the kernel chapter in this book focuses on the project nature of the kernel and leaves the internals to the other excellent texts on the subject. You will learn the organization and layout of the kernel source tree. You will discover the binary components that make up a kernel image, and how they are loaded and what purpose they serve on an embedded system. One of my favorite figures in the book is Figure 5-1, which schematically illustrates the build process of a composite kernel image.

In the pages of this book, you will learn how the build system works and how to incorporate into the Linux kernel your own custom changes that are required for your own projects. You will discover the mechanism used to drive the configuration of different architectures and features within the Linux kernel source tree and, more important, how to modify this system to customize it to your own requirements. We also cover in detail the kernel command-line mechanism. You will learn how it works, how to configure the kernel's runtime behavior for your requirements, and how to extend this functionality to your own project. You will learn how to navigate the kernel source code and how to configure the kernel for specific tasks related to an embedded system. You will learn many useful tips and tricks for your embedded project, from bootloaders, system initialization, file systems, and Flash memory to advanced kernel- and application-debugging techniques.

Intended Audience

This book is intended for programmers with a working knowledge of programming in C. I assume that you have a rudimentary understanding of local area networks and the Internet. You should understand and recognize an IP address and how it is used on a simple local area network. I also assume that you have an understanding of hexadecimal and octal numbering systems, and their common usage in a text such as this.

Several advanced concepts related to C compiling and linking are explored, so you will benefit from having at least a cursory understanding of the role of the linker in ordinary C programming. Knowledge of the GNU make operation and semantics will also prove beneficial.

What This Book Is Not

This book is not a detailed hardware tutorial. One of the difficulties the embedded developer faces is the huge variety of hardware devices in use today. The user manual for a modern 32-bit processor with some integrated peripherals can easily exceed 1,000 pages. There are no shortcuts. If you need to understand a hardware device from a programmer's point of view, you will need to spend plenty of hours in your favorite reading chair with hardware data sheets and reference guides, and many more hours writing and testing code for these hardware devices!

This is also not a book about the Linux kernel or kernel internals. In this book, you won't learn about the intricacies of the Memory Management Unit (MMU) used to implement Linux's virtual memory-management policies and procedures; there are already several good books on this subject. You are encouraged to take advantage of the "Suggestions for Additional Reading" section found at the end of every chapter.

Conventions Used

Filenames and code statements are presented in Courier. Commands issued by the reader are indicated in bold Courier. New terms or important concepts are presented in italics.

When you see a pathname preceded with three dots, this references a well-known but unspecified top-level directory. The top-level directory is context dependent but almost universally refers to a top-level Linux source directory. For example, .../arch/ppc/kernel/setup.c refers to the setup.c file located in the architecture branch of a Linux source tree. The actual path might be something like ~/sandbox/linux.2.6.14/arch/ppc/kernel/setup.c.

Organization of the Book

Chapter 1, "Introduction," provides a brief look at the factors driving the rapid adoption of Linux in the embedded environment. Several important standards and organizations relevant to embedded Linux are introduced.

Chapter 2, "Your First Embedded Experience," introduces the reader to many concepts related to embedded Linux upon which we build in later chapters.

In Chapter 3, "Processor Basics," we present a high-level look at the more popular processors and platforms that are being used to build embedded Linux systems. We examine selected products from many of the major processor manufacturers. All of the major architecture families are represented.

Chapter 4, "The Linux Kernel—A Different Perspective," examines the Linux kernel from a slightly different perspective. Instead of kernel theory or internals, we look at its structure, layout, and build construction so you can begin to learn your way around this large software project and, more important, learn where your own customization efforts must be focused. This includes detailed coverage of the kernel build system.

Chapter 5, "Kernel Initialization," details the Linux kernel's initialization process. You will learn how the architecture- and bootloader-specific image components are concatenated to the image of the kernel proper for downloading to Flash and booting by an embedded bootloader. The knowledge gained here will help you customize the Linux kernel to your own embedded application requirements.

Chapter 6, "System Initialization," continues the detailed examination of the initialization process. When the Linux kernel has completed its own initialization, application programs continue the initialization process in a predetermined manner. Upon completing Chapter 6, you will have the necessary knowledge to customize your own userland application startup sequence.

Chapter 7, "Bootloaders," is dedicated to the booloader and its role in an embedded Linux system. We examine the popular open-source bootloader U-Boot and present a porting example. We briefly introduce additional bootloaders in use today so you can make an informed choice about your particular requirements.

Chapter 8, "Device Driver Basics," introduces the Linux device driver model and provides enough background to launch into one of the great texts on device drivers, listed as "Suggestions for Additional Reading" at the end of the chapter.

Chapter 9, "File Systems," presents the more popular file systems being used in embedded systems today. We include coverage of the JFFS2, an important embedded file system used on Flash memory devices. This chapter includes a brief introduction on building your own file system image, one of the more difficult tasks the embedded Linux developer faces.

Chapter 10, "MTD Subsystem," explores the Memory Technology Devices (MTD) subsystem. MTD is an extremely useful abstraction layer between the Linux file system and hardware memory devices, primarily Flash memory.

Chapter 11, "BusyBox," introduces BusyBox, one of the most useful utilities for building small embedded systems. We describe how to configure and build BusyBox for your particular requirements, along with detailed coverage of system initialization unique to a BusyBox environment. Appendix C, "BusyBox Commands," lists the available BusyBox commands from a recent BusyBox release.

Chapter 12, "Embedded Development Environment," takes a detailed look at the unique requirements of a typical cross-development environment. Several techniques are presented to enhance your productivity as an embedded developer, including the powerful NFS root mount development configuration.

Chapter 13, "Development Tools," examines many useful development tools. Debugging with gdb is introduced, including coverage of core dump analysis. Many more tools are presented and explained, with examples including strace, ltrace, top, and ps, and the memory profilers mtrace and dmalloc. The chapter concludes with an introduction to the more important binary utilities, including the powerful readelf utility.

Chapter 14, "Kernel Debugging Techniques," provides a detailed examination of many debugging techniques useful for debugging inside the Linux kernel. We introduce the use of the kernel debugger KGDB, and present many useful debugging techniques using the combination of gdb and KGDB as debugging tools. Included is an introduction to using hardware JTAG debuggers and some tips for analyzing failures when the kernel won't boot.

Chapter 15, "Debugging Embedded Linux Applications," moves the debugging context from the kernel to your application programs. We continue to build on the gdb examples from the previous two chapters, and we present techniques for multithreaded and multiprocess debugging.

Chapter 16, "Porting Linux," introduces the issues related to porting Linux to your custom board. We walk through a simple example and highlight the steps taken to produce a working Linux kernel on a custom PowerPC board. Several important concepts are presented that have trapped many newcomers to Linux kernel porting. Together with the techniques presented in Chapters 13 and 14, you should be ready to tackle your own custom board port after reading this chapter.

Chapter 17, "Linux and Real Time," provides an introduction to one of the more exciting developments in embedded Linux: configuring for real time via the CONFIG_RT option. We cover the features available with RT and how they can be used in a design. We also present techniques for measuring latency in your application configuration.

The appendixes cover the GNU Public License, U-Boot Configurable Commands, BusyBox Commands, SDRAM Interface Considerations, resources for the open source developer, and a sample configuration file for one of the more popular hardware JTAG debuggers, the BDI-2000.

Follow Along

You will benefit most from this book if you can divide your time between the pages of this book and your favorite Linux workstation. Grab an old x86 computer to experiment on an embedded system. Even better, if you have access to a single-board computer based on another architecture, use that. You will benefit from learning the layout and organization of a very large code base (the Linux kernel), and you will gain significant knowledge and experience as you poke around the kernel and learn by doing.

Look at the code and try to understand the examples produced in this book. Experiment with different settings, configuration options, and hardware devices. Much can be gained in terms of knowledge, and besides, it's loads of fun!

GPL Copyright Notice

Portions of open-source code reproduced in this book are copyrighted by a large number of individual and corporate contributors. The code reproduced here has been licensed under the terms of the GNU Public License or GPL.

Appendix A contains the text of the GNU General Public License.

© Copyright Pearson Education. All rights reserved.

Read More Show Less

Customer Reviews

Be the first to write a review
( 0 )
Rating Distribution

5 Star

(0)

4 Star

(0)

3 Star

(0)

2 Star

(0)

1 Star

(0)

Your Rating:

Your Name: Create a Pen Name or

Barnes & Noble.com Review Rules

Our reader reviews allow you to share your comments on titles you liked, or didn't, with others. By submitting an online review, you are representing to Barnes & Noble.com that all information contained in your review is original and accurate in all respects, and that the submission of such content by you and the posting of such content by Barnes & Noble.com does not and will not violate the rights of any third party. Please follow the rules below to help ensure that your review can be posted.

Reviews by Our Customers Under the Age of 13

We highly value and respect everyone's opinion concerning the titles we offer. However, we cannot allow persons under the age of 13 to have accounts at BN.com or to post customer reviews. Please see our Terms of Use for more details.

What to exclude from your review:

Please do not write about reviews, commentary, or information posted on the product page. If you see any errors in the information on the product page, please send us an email.

Reviews should not contain any of the following:

  • - HTML tags, profanity, obscenities, vulgarities, or comments that defame anyone
  • - Time-sensitive information such as tour dates, signings, lectures, etc.
  • - Single-word reviews. Other people will read your review to discover why you liked or didn't like the title. Be descriptive.
  • - Comments focusing on the author or that may ruin the ending for others
  • - Phone numbers, addresses, URLs
  • - Pricing and availability information or alternative ordering information
  • - Advertisements or commercial solicitation

Reminder:

  • - By submitting a review, you grant to Barnes & Noble.com and its sublicensees the royalty-free, perpetual, irrevocable right and license to use the review in accordance with the Barnes & Noble.com Terms of Use.
  • - Barnes & Noble.com reserves the right not to post any review -- particularly those that do not follow the terms and conditions of these Rules. Barnes & Noble.com also reserves the right to remove any review at any time without notice.
  • - See Terms of Use for other conditions and disclaimers.
Search for Products You'd Like to Recommend

Recommend other products that relate to your review. Just search for them below and share!

Create a Pen Name

Your Pen Name is your unique identity on BN.com. It will appear on the reviews you write and other website activities. Your Pen Name cannot be edited, changed or deleted once submitted.

 
Your Pen Name can be any combination of alphanumeric characters (plus - and _), and must be at least two characters long.

Continue Anonymously

    If you find inappropriate content, please report it to Barnes & Noble
    Why is this product inappropriate?
    Comments (optional)