Product Cover Image

Embedded Linux Primer: A Practical Real-World Approach, 2nd Edition

By Christopher Hallinan

Published by Prentice Hall

Published Date: Oct 26, 2010

More Product Info

Description

This is the Safari online edition of the printed book.

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.

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

 

Purchase Info

ISBN-10: 0-13-706112-9

ISBN-13: 978-0-13-706112-9

Format: Safari PTG

This publication is not currently for sale.