CURRENT BASKET VALUE
£0.00
ABOUT THIS BOOK
Embedded Linux Primer: A Practical Real-World Approach
£43.99

EMBEDDED LINUX PRIMER: A PRACTICAL REAL-WORLD APPROACH

PAPERBACK BY HALLINAN, CHRISTOPHER

£43.99

ISBN
9780137017836
IMPRINT
PRENTICE HALL
 
 
EDITION
2ND EDITION
PUBLISHER
PEARSON EDUCATION (US)
STOCK FOR DELIVERY
New product available - 9780134497204
FORMAT
PAPERBACK
PAGES
656 pages
PUBLICATION DATE
26 OCT 2010

DESCRIPTION

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.

CONTENTS

Foreword for the First Edition xxvForeword for the Second Edition xxviPreface xxviiAcknowledgments for the First Edition xxxiiiAcknowledgments for the Second Edition xxxvAbout the Author xxxviChapter 1 Introduction 11.1 Why Linux 21.2 Embedded Linux Today 31.3 Open Source and the GPL 3 1.3.1 Free Versus Freedom 41.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 71.5 Summary 8 1.5.1 Suggestions for Additional Reading 8Chapter 2 The Big Picture 92.1 Embedded or Not? 10 2.1.1 BIOS Versus Bootloader 112.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 192.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 302.4 Embedded Linux Distributions 32 2.4.1 Commercial Linux Distributions 33 2.4.2 Do-It-Yourself Linux Distributions 332.5 Summary 34 2.5.1 Suggestions for Additional Reading 35Chapter 3 Processor Basics 373.1 Stand-Alone Processors 38 3.1.1 IBM 970FX 39 3.1.2 Intel Pentium M 39 3.1.3 Intel Atom (TM) 40 3.1.4 Freescale MPC7448 40 3.1.5 Companion Chipsets 413.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 (TM) 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 593.3 Other Architectures 593.4 Hardware Platforms 60 3.4.1 CompactPCI 60 3.4.2 ATCA 603.5 Summary 61 3.5.1 Suggestions for Additional Reading 62Chapter 4 The Linux Kernel: A Different Perspective 634.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 684.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 774.3 Kernel Build System 78 4.3.1 The Dot-Config 78 4.3.2 Configuration Editor(s 80 4.3.3 Makefile Targets 834.4 Kernel Configuration 89 4.4.1 Custom Configuration Options 91 4.4.2 Kernel Makefiles 954.5 Kernel Documentation 964.6 Obtaining a Custom Linux Kernel 96 4.6.1 What Else Do I Need 974.7 Summary 97 4.7.1 Suggestions for Additional Reading 98Chapter 5 Kernel Initialization 995.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 1065.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 1145.3 Kernel Command-Line Processing 115 5.3.1 The __setup Macro 1165.4 Subsystem Initialization 122 5.4.1 The *__initcall Macros 1225.5 The init Thread 125 5.5.1 Initialization Via initcalls 126 5.5.2 initcall_debug 127 5.5.3 Final Boot Steps 1275.6 Summary 129 5.6.1 Suggestions for Additional Reading 130Chapter 6 User Space Initialization 1316.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 1376.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 1406.3 The init Process 140 6.3.1 inittab 143 6.3.2 Sample Web Server Startup Script 1456.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 1526.5 Using initramfs 153 6.5.1 Customizing initramfs 1546.6 Shutdown 1566.7 Summary 156 6.7.1 Suggestions for Additional Reading 157Chapter 7 Bootloaders 1597.1 Role of a Bootloader 1607.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 1657.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 1747.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 1857.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 1937.6 Other Bootloaders 194 7.6.1 Lilo 194 7.6.2 GRUB 195 7.6.3 Still More Bootloaders 1977.7 Summary 197 7.7.1 Suggestions for Additional Reading 198Chapter 8 Device Driver Basics 2018.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 2118.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 2168.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 2208.4 Bringing It All Together 2228.5 Building Out-of-Tree Drivers 2238.6 Device Drivers and the GPL 2248.7 Summary 225 8.7.1 Suggestions for Additional Reading 226Chapter 9 File Systems 2279.1 Linux File System Concepts 228 9.1.1 Partitions 2299.2 ext2 230 9.2.1 Mounting a File System 232 9.2.2 Checking File System Integrity 2339.3 ext3 2359.4 ext4 2379.5 ReiserFS 2389.6 JFFS2 239 9.6.1 Building a JFFS2 Image 2409.7 cramfs 2429.8 Network File System 244 9.8.1 Root File System on NFS 2469.9 Pseudo File Systems 248 9.9.1 /proc File System 249 9.9.2 sysfs 2529.10 Other File Systems 2559.11 Building a Simple File System 2569.12 Summary 258 9.12.1 Suggestions for Additional Reading 259Chapter 10 MTD Subsystem 26110.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 26710.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 27610.3 MTD Utilities 279 10.3.1 JFFS2 Root File System 28110.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 28710.5 Summary 287 10.5.1 Suggestions for Additional Reading 288Chapter 11 BusyBox 28911.1 Introduction to BusyBox 290 11.1.1 BusyBox Is Easy 29111.2 BusyBox Configuration 291 11.2.1 Cross-Compiling BusyBox 29311.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 30211.4 Summary 303 11.4.1 Suggestions for Additional Reading 304Chapter 12 Embedded Development Environment 30512.1 Cross-Development Environment 306 12.1.1 Hello World Embedded 30712.2 Host System Requirements 311 12.2.1 Hardware Debug Probe 31112.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 32012.4 Summary 322 12.4.1 Suggestions for Additional Reading 323Chapter 13 Development Tools 32513.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 33113.2 Data Display Debugger 33313.3 cbrowser/cscope 33513.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 35313.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 36013.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 36413.7 Summary 364 13.7.1 Suggestions for Additional Reading 365Chapter 14 Kernel Debugging Techniques 36714.1 Challenges to Kernel Debugging 36814.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 38014.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 40914.4 Hardware-Assisted Debugging 410 14.4.1 Programming Flash Using a JTAG Probe 411 14.4.2 Debugging with a JTAG Probe 41314.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 42014.6 Summary 421 14.6.1 Suggestions for Additional Reading 422Chapter 15 Debugging Embedded Linux Applications 42315.1 Target Debugging 42415.2 Remote (Cross) Debugging 424 15.2.1 gdbserver 42715.3 Debugging with Shared Libraries 429 15.3.1 Shared Library Events in GDB 43115.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 44115.5 Additional Remote Debug Options 442 15.5.1 Debugging Using a Serial Port 442 15.5.2 Attaching to a Running Process 44215.6 Summary 443 15.6.1 Suggestions for Additional Reading 444Chapter 16 Open Source Build Systems 44516.1 Why Use a Build System? 44616.2 Scratchbox 447 16.2.1 Installing Scratchbox 447 16.2.2 Creating a Cross-Compilation Target 44816.3 Buildroot 451 16.3.1 Buildroot Installation 451 16.3.2 Buildroot Configuration 451 16.3.3 Buildroot Build 45216.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 46316.5 Summary 464 16.5.1 Suggestions for Additional Reading 464Chapter 17 Linux and Real Time 46517.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 46717.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 47317.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 47717.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 48417.5 Summary 485 17.5.1 Suggestion for Additional Reading 485Chapter 18 Universal Serial Bus 48718.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 49418.2 Configuring USB 495 18.2.1 USB Initialization 49718.3 sysfs and USB Device Naming 50018.4 Useful USB Tools 502 18.4.1 USB File System 502 18.4.2 Using usbview 504 18.4.3 USB Utils (lsusb 50718.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 51518.6 USB Debug 516 18.6.1 usbmon 517 18.6.2 Useful USB Miscellanea 51818.7 Summary 519 18.7.1 Suggestions for Additional Reading 519Chapter 19 udev 52119.1 What Is udev? 52219.2 Device Discovery 52319.3 Default udev Behavior 52519.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 53519.5 Loading Platform Device Drivers 53819.6 Customizing udev Behavior 540 19.6.1 udev Customization Example: USB Automounting 54019.7 Persistent Device Naming 541 19.7.1 udev Helper Utilities 54219.8 Using udev with busybox 545 19.8.1 busybox mdev 545 19.8.2 Configuring mdev 54719.9 Summary 548 19.9.1 Suggestions for Additional Reading 548Appendix A GNU Public License 549Preamble 550Terms and Conditions for Copying, Distribution, and Modification 551No Warranty 555Appendix B U-Boot Configurable Commands 557Appendix C BusyBox Commands 561Appendix D SDRAM Interface Considerations 571D.1 SDRAM Basics 572 D.1.1 SDRAM Refresh 573D.2 Clocking 574D.3 SDRAM Setup 575D.4 Summary 580 D.4.1 Suggestions for Additional Reading 580Appendix E Open Source Resources 581Source Repositories and Developer Information 582Mailing Lists 582Linux News and Developments 583Open Source Legal Insight and Discussion 583Appendix F Sample BDI-2000 Configuration File 585Index 593