万本电子书0元读

万本电子书0元读

顶部广告

Mastering Embedded Linux Programming电子书

售       价:¥

6人正在读 | 0人评论 9.8

作       者:Chris Simmonds

出  版  社:Packt Publishing

出版时间:2015-12-29

字       数:302.2万

所属分类: 进口书 > 外文原版书 > 电脑/网络

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
Harness the power of Linux to create versatile and robust embedded solutions About This Book Create efficient and secure embedded devices using Linux Minimize project costs by using open source tools and programs Explore each component technology in depth, using sample implementations as a guide Who This Book Is For This book is ideal for Linux developers and system programmers who are already familiar with embedded systems and who want to know how to create best-in-class devices. A basic understanding of C programming and experience with systems programming is needed. What You Will Learn Understand the role of the Linux kernel and select an appropriate role for your application Use Buildroot and Yocto to create embedded Linux systems quickly and efficiently Create customized bootloaders using U-Boot Employ perf and ftrace to identify performance bottlenecks Understand device trees and make changes to accommodate new hardware on your device Write applications that interact with Linux device drivers Design and write multi-threaded applications using POSIX threads Measure real-time latencies and tune the Linux kernel to minimize them In Detail Mastering Embedded Linux Programming takes you through the product cycle and gives you an in-depth de*ion of the components and options that are available at each stage. You will begin by learning about toolchains, bootloaders, the Linux kernel, and how to configure a root filesystem to create a basic working device. You will then learn how to use the two most commonly used build systems, Buildroot and Yocto, to speed up and simplify the development process. Building on this solid base, the next section considers how to make best use of raw NAND/NOR flash memory and managed flash eMMC chips, including mechanisms for increasing the lifetime of the devices and to perform reliable in-field updates. Next, you need to consider what techniques are best suited to writing applications for your device. We will then see how functions are split between processes and the usage of POSIX threads, which have a big impact on the responsiveness and performance of the final device The closing sections look at the techniques available to developers for profiling and tracing applications and kernel code using perf and ftrace. Style and approach This book is an easy-to-follow and pragmatic guide consisting of an in-depth analysis of the implementation of embedded devices. Each topic has a logical approach to it; this coupled with hints and best practices helps you understand embedded Linux better.
目录展开

Mastering Embedded Linux Programming

Table of Contents

Mastering Embedded Linux Programming

Credits

Foreword

About the Author

About the Reviewers

www.PacktPub.com

Support files, eBooks, discount offers, and more

Why subscribe?

Free access for Packt account holders

Preface

What this book covers

What you need for this book

Who this book is for

Conventions

Reader feedback

Customer support

Downloading the example code

Errata

Piracy

Questions

1. Starting Out

Selecting the right operating system

The players

Project lifecycle

The four elements of embedded Linux

Open source

Licenses

Hardware for embedded Linux

Hardware used in this book

The BeagleBone Black

QEMU

Software used in this book

Summary

2. Learning About Toolchains

What is a toolchain?

Types of toolchain - native versus cross toolchain

CPU architectures

Choosing the C library

Finding a toolchain

Building a toolchain using crosstool-NG

Installing crosstool-NG

Selecting the toolchain

Anatomy of a toolchain

Finding out about your cross compiler

The sysroot, library, and header files

Other tools in the toolchain

Looking at the components of the C library

Linking with libraries: static and dynamic linking

Static libraries

Shared libraries

Understanding shared library version numbers

The art of cross compiling

Simple makefiles

Autotools

An example: SQLite

Package configuration

Problems with cross compiling

Summary

3. All About Bootloaders

What does a bootloader do?

The boot sequence

Phase 1: ROM code

Phase 2: SPL

Phase 3: TPL

Booting with UEFI firmware

Moving from bootloader to kernel

Introducing device trees

Device tree basics

The reg property

Phandles and interrupts

Device tree include files

Compiling a device tree

Choosing a bootloader

U-Boot

Building U-Boot

Installing U-Boot

Using U-Boot

Environment variables

Boot image format

Loading images

Booting Linux

Automating the boot with U-Boot scripts

Porting U-Boot to a new board

Kconfig and U-Boot

Board-specific files

Configuration header files

Building and testing

Falcon mode

Barebox

Getting Barebox

Building Barebox

Summary

4. Porting and Configuring the Kernel

What does the kernel do?

Choosing a kernel

Kernel development cycle

Stable and long term support releases

Vendor support

Licensing

Building the kernel

Getting the source

Understanding kernel configuration

Using LOCALVERSION to identify your kernel

Kernel modules

Compiling

Compiling the kernel image

Compiling device trees

Compiling modules

Cleaning kernel sources

Booting your kernel

BeagleBone Black

QEMU

Kernel panic

Early user space

Kernel messages

Kernel command line

Porting Linux to a new board

With a device tree

Without a device tree

Additional reading

Summary

5. Building a Root Filesystem

What should be in the root filesystem?

Directory layout

Staging directory

POSIX file access permissions

File ownership permissions in the staging directory

Programs for the root filesystem

The init program

Shell

Utilities

BusyBox to the rescue!

Building BusyBox

ToyBox – an alternative to BusyBox

Libraries for the root filesystem

Reducing size by stripping

Device nodes

The proc and sysfs filesystems

Mounting filesystems

Kernel modules

Transfering the root filesystem to the target

Creating a boot ramdisk

Standalone ramdisk

Booting the ramdisk

Booting with QEMU

Booting the BeagleBone Black

Mounting proc

Building a ramdisk cpio into the kernel image

Another way to build a kernel with ramdisk

The old initrd format

The init program

Configuring user accounts

Adding user accounts to the root filesystem

Starting a daemon process

A better way of managing device nodes

An example using devtmpfs

An example using mdev

Are static device nodes so bad after all?

Configuring the network

Network components for glibc

Creating filesystem images with device tables

Putting the root filesytem onto an SD card

Mounting the root filesystem using NFS

Testing with QEMU

Testing with BeagleBone Black

Problems with file permissions

Using TFTP to load the kernel

Additional reading

Summary

6. Selecting a Build System

No more rolling your own embedded Linux

Build systems

Package formats and package managers

Buildroot

Background

Stable releases and support

Installing

Configuring

Running

Creating a custom BSP

U-Boot

Linux

Build

Adding your own code

Overlay

Adding a package

License compliance

The Yocto Project

Background

Stable releases and support

Installing the Yocto Project

Configuring

Building

Running

Layers

BitBake and recipes

Customizing images via local.conf

Writing an image recipe

Creating an SDK

License audit

Further reading

Summary

7. Creating a Storage Strategy

Storage options

NOR flash

NAND flash

Managed flash

MultiMediaCard and secure digital cards

eMMC

Other types of managed flash

Accessing flash memory from the bootloader

U-Boot and NOR flash

U-Boot and NAND flash

U-Boot and MMC, SD and eMMC

Accessing flash memory from Linux

Memory technology devices

MTD partitions

MTD device drivers

The MTD character device, mtd

The MTD block device, mtdblock

Logging kernel oops to MTD

Simulating NAND memory

The MMC block driver

Filesystems for flash memory

Flash translation layers

Filesystems for NOR and NAND flash memory

JFFS2

Summary nodes

Clean markers

Creating a JFFS2 filesystem

YAFFS2

Creating a YAFFS2 filesystem

UBI and UBIFS

UBI

UBIFS

Filesystems for managed flash

Flashbench

Discard and TRIM

Ext4

F2FS

FAT16/32

Read-only compressed filesystems

squashfs

Temporary filesystems

Making the root filesystem read-only

Filesystem choices

Updating in the field

Granularity: file, package, or image?

Atomic image update

Further reading

Summary

8. Introducing Device Drivers

The role of device drivers

Character devices

Block devices

Network devices

Finding out about drivers at runtime

Getting information from sysfs

The devices: /sys/devices

The drivers: /sys/class

The block drivers: /sys/block

Finding the right device driver

Device drivers in user-space

GPIO

Handling interrupts from GPIO

LEDs

I2C

SPI

Writing a kernel device driver

Designing a character device interface

Anatomy of a device driver

Compile and load

Loading kernel modules

Discovering hardware configuration

Device trees

Platform data

Linking hardware with device drivers

Additional reading

Summary

9. Starting up - the init Program

After the kernel has booted

Introducing the init programs

BusyBox init

Buildroot init scripts

System V init

inittab

The init.d scripts

Adding a new daemon

Starting and stopping services

systemd

Building systemd with the Yocto Project and Buildroot

Introducing targets, services, and units

Units

Services

Targets

How systemd boots the system

Adding your own service

Adding a watchdog

Implications for embedded Linux

Further reading

Summary

10. Learning About Processes and Threads

Process or thread?

Processes

Creating a new process

Terminating a process

Running a different program

Daemons

Inter-process communication

Message-based IPC

Unix (or local) sockets

FIFOs and named pipes

POSIX message queues

Summary of message-based IPC

Shared memory-based IPC

POSIX shared memory

Threads

Creating a new thread

Terminating a thread

Compiling a program with threads

Inter-thread communication

Mutual exclusion

Changing conditions

Partitioning the problem

Scheduling

Fairness versus determinism

Timeshare policies

Niceness

Real-time policies

Choosing a policy

Choosing a real-time priority

Further reading

Summary

11. Managing Memory

Virtual memory basics

Kernel space memory layout

How much memory does the kernel use?

User space memory layout

Process memory map

Swap

Swap to compressed memory (zram)

Mapping memory with mmap

Using mmap to allocate private memory

Using mmap to share memory

Using mmap to access device memory

How much memory does my application use?

Per-process memory usage

Using top and ps

Using smem

Other tools to consider

Identifying memory leaks

mtrace

Valgrind

Running out of memory

Further reading

Summary

12. Debugging with GDB

The GNU debugger

Preparing to debug

Debugging applications using GDB

Remote debugging using gdbserver

Setting up the Yocto Project

Setting up Buildroot

Starting to debug

Connecting GDB and gdbserver

Setting the sysroot

GDB command files

Overview of GDB commands

Breakpoints

Running and stepping

Information commands

Running to a breakpoint

Debugging shared libraries

The Yocto Project

Buildroot

Other libraries

Just-in-time debugging

Debugging forks and threads

Core files

Using GDB to look at core files

GDB user interfaces

Terminal user interface

Data display debugger

Eclipse

Debugging kernel code

Debugging kernel code with kgdb

A sample debug session

Debugging early code

Debugging modules

Debugging kernel code with kdb

Looking at an oops

Preserving the oops

Additional reading

Summary

13. Profiling and Tracing

The observer effect

Symbol tables and compile flags

Beginning to profile

Profiling with top

Poor man's profiler

Introducing perf

Configuring the kernel for perf

Building perf with the Yocto Project

Building perf with Buildroot

Profiling with perf

Call graphs

perf annotate

Other profilers: OProfile and gprof

Tracing events

Introducing Ftrace

Preparing to use Ftrace

Dynamic Ftrace and trace filters

Trace events

Using LTTng

LTTng and the Yocto Project

LTTng and Buildroot

Using LTTng for kernel tracing

Using Valgrind for application profiling

Callgrind

Helgrind

Using strace to show system calls

Summary

14. Real-time Programming

What is real-time?

Identifying the sources of non-determinism

Understanding scheduling latency

Kernel preemption

The real-time Linux kernel (PREEMPT_RT)

Threaded interrupt handlers

Preemptible kernel locks

Getting the PREEMPT_RT patches

The Yocto Project and PREEMPT_RT

High resolution timers

Avoiding page faults in a real-time application

Interrupt shielding

Measuring scheduling latencies

cyclictest

Using Ftrace

Combining cyclictest and Ftrace

Further reading

Summary

Index

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部