235
Team Emertxe Embedded Operating System Linux

Embedded Linux on ARM

Embed Size (px)

Citation preview

Page 1: Embedded Linux on ARM

Team Emertxe

Embedded Operating SystemLinux

Page 2: Embedded Linux on ARM

Contents

Page 3: Embedded Linux on ARM

Embedded Operating System - LinuxContents

● Embedded Systems Introduction

● Linux as Embedded Operating System

● Embedded Development and its Environment

● Overview of the Target – Peripherals and Interfacing

● Booting Sequences

● Embedded Linux Kernel

● File Systems

Page 4: Embedded Linux on ARM

Linux as Embedded OS

Page 5: Embedded Linux on ARM

Embedded Linux

● Open Source & Free Software Fundamentals

● Why to choose Linux

● Architecture

● Choices to Make

Page 6: Embedded Linux on ARM

Open SourceHow it all started?

● With GNU (GNU is not UNIX)

● Richard Stallman made the initial announcement in 1983, Free Software Foundation (FSF) got formed during 1984

● Volunteer driven GNU started developing multiple projects, but making it as an operating system was always a challenge

● During 1991 a Finnish Engineer Linus Torvalds developed core OS functionality, called it as “Linux Kernel”

● Linux Kernel got licensed under GPL, which laid strong platform for the success of Open Source

● Rest is history!

Page 7: Embedded Linux on ARM

● Multiple Linux distributions started emerging around the Kernel

● Some applications became platform independent

● Community driven software development started picking up

● Initially seen as a “geek-phenomenon”, eventually turned out to be an engineering marvel

● Centered around Internet

● Building a business around open source started becoming viable

● Redhat set the initial trend in the OS business

Open SourceHow it evolved?

Page 8: Embedded Linux on ARM

OS Databases Server/Cloud Enterprise

Consumer Education CMS eCommerce

Open SourceWhere it stands now?

Page 9: Embedded Linux on ARM

● 4 Freedoms

– Copy,

– Study,

– Change,

– Use

● The above freedom are for both commercial and non-commercial use

● Free Software Licenses – GNU GPL and GNU FDL

Free SoftwareWhat does it mean?

Page 10: Embedded Linux on ARM

● Quality and Reliability of Code

● Availability of Code

● Hardware Support

● Communication Protocols and Software Stds

● Available Tools

● Community Support

● Licensing

● Vendor Independence

● Cost

Embedded LinuxWhy Choose!

Page 11: Embedded Linux on ARM

● Modularity and Structure

● Readability of Code

● Extensibility

● Configurable

● Predictability

● Error Recovery

● Longevity

Embedded LinuxWhy Choose! – Quality and Reliability of Code

Page 12: Embedded Linux on ARM

● ARM

– Suits well for Embedded

– Include THUMB – reduce code bandwidth

– High density code than PPC, x86.

● Power PC

– Intended for PC

– Have become popular in embedded

● Strong ARM

– Faster CPU – Higher Performance

– PDAs, Setup box etc.,

● MIPS

And many more !!

Embedded LinuxPorted Architectures

Page 13: Embedded Linux on ARM

● Which kernel to use?

● Which development environment:

● Which compiler, debugger, dev boards?

● Which drivers and libraries?

● Support and training?

Embedded LinuxChoices to Make

Page 14: Embedded Linux on ARM

Target Development & Environment

Page 15: Embedded Linux on ARM

Embedded Development & Environment

● Typical System Components

● Hardware Tools and Interfacing

● Software Environments Tools

● Toolchains

Page 16: Embedded Linux on ARM

Typical System Components

Hardware

Boot Loaders

Operating System

Libraries

Applications

Tools

Page 17: Embedded Linux on ARM

Embedded Development & EnvironmentHardware Tools and Interfacing

Possible Connections

Serial

Network

USB

JTAG

Emulators

OTA

Page 18: Embedded Linux on ARM

Embedded Development & EnvironmentSoftware Environment Tools

Serial

Network

minicom

gtkterm

TFTP

NFS

Page 19: Embedded Linux on ARM

ToolchainIntroduction

Page 20: Embedded Linux on ARM

ToolchainIntroduction

● Set of applications used to perform a complex task or to create a product, which is typically another computer program or a system of programs.

● Tools are linked (or chained) together by specific stages

● Output or resulting environment state of each tool becomes the input or starting environment for the next one

● By default the host contains some development tools which ate called as native toolchain

Page 21: Embedded Linux on ARM

ToolchainIntroduction

● When you use these tool the code generation would be for native architecture (say x86)

● In case of developing embedded systems these toolchains does not serve the purpose

● The targets some times might have the following restrictions too!

– Less memory footprints

– Slow compared to host

– You may not wish to have in a developed system finally

● So cross compiling toolchain are used

Page 22: Embedded Linux on ARM

ToolchainIntroduction - Flow

NativeTools

Cross CompilingTools

Page 23: Embedded Linux on ARM

ToolchainComponents

Page 24: Embedded Linux on ARM

ToolchainComponents

Compiler

Binary Utilities

C / C++ Libraries

Kernel Headers

Debuggers

Page 25: Embedded Linux on ARM

ToolchainComponents – GCC

● Abbreviated as GNU Compiler Collection, one of the famous free software compiler

● Can compile many programming languages and generate code for many different types of architecture

Page 26: Embedded Linux on ARM

ToolchainComponents – Binary Utilities

● Set of programming tools for creating and managing binary programs, object files, libraries, profile data, and assembly source code

● Includes an assembler, linker and several other software tools

● Often used with a compiler and libraries to design programs for Linux

● GNU Binary Utilities are called binutils

Page 27: Embedded Linux on ARM

ToolchainComponents – binutils

● as - the assembler, that generates binary code from assembler source code

● ld - the linker

● ar, ranlib - to generate .a archives, used for libraries

● objdump, readelf, size, nm, strings - to inspect binaries. Very useful analysis tools !

● strip - to strip useless parts of binaries in order to reduce their size

Page 28: Embedded Linux on ARM

ToolchainComponents - Libraries

● The C library is an essential component which provides interface between the applications and the kernel

● Provides macros, type definitions, and functions for tasks like string handling, mathematical computations, input/output processing, memory allocation and several other operating system services

Page 29: Embedded Linux on ARM

ToolchainComponents - Libraries

● Several C libraries are available: glibc, uClibc, dietlibc, etc

● The selection of the library has to be made while generation the toolchain as gcc is compiled against the selected library

● Some common used libraries

– glibc

– uclibc

Page 30: Embedded Linux on ARM

ToolchainComponents – Libraries - glibc

● C library from the GNU project

● Good performance optimization, standards compliance and portability

● Well maintained and used on all GNU / Linux host systems

● Require large memory footprint making it not suitable for small embedded systems

● Used in systems that run many different kernels and different hardware architectures

● License: LGPL

● Website: http://www.gnu.org/software/libc/

Page 31: Embedded Linux on ARM

ToolchainComponents – Libraries - uclibc

● Smaller than the GNU C Library, but nearly all applications supported by glibc also work perfectly with uClibc

● Recommended for lower footprint embedded systems

● Excellent configuration options at the cost of ABI differences for different configurations

● Features can be enabled or disabled according to space requirements

● Works on most embedded architectures with embedded Linux

● Focus on size rather than performance with less compile time

Page 32: Embedded Linux on ARM

ToolchainComponents – Libraries - uclibc

Page 33: Embedded Linux on ARM

ToolchainComponents – Libraries - uclibc

● Created for support uclinux, a Linux for MMU less system

● Actively maintained, large developer and user base

● Used on a large number of production embedded products, including consumer electronic devices

Page 34: Embedded Linux on ARM

ToolchainComponents – Kernel Headers

● The compiled applications and the libraries sometimes need to interact with the kernel

● So the Linux kernel need to expose the available interfaces for the libraries and applications to use, like

– System calls and its numbers

– MACRO definitions

– Data structures, etc.

Page 35: Embedded Linux on ARM

ToolchainComponents – Kernel Headers

● Therefore, compiling the C library requires kernel headers, and many applications also require them.

● You may find these in <linux/...> and <asm/...> and a few other directories corresponding to the ones visible in include/ in the kernel sources

● Compatibility with running kernel has to be considered

Page 36: Embedded Linux on ARM

ToolchainBuilding

Page 37: Embedded Linux on ARM

ToolchainBuilding

● Toolchain building is one of the time consuming process

● A very clear picture of the system architecture is sometimes required

● We might have to identify three systems in this case, like

– Build System – which is used to create the toolchain

– Host – which will be used to execute the created toolchain

– Target – which will execute the binaries created by the toolchain

● So by considering the above points some possible build options are provided in next slide

Page 38: Embedded Linux on ARM

ToolchainBuilding

● Possible Build System

● Build Considerations

● Toolchain Build Possibilities

– Prebuilt

– Home Built

– Automated Tools

● Crosstool NG● Buildroot

Page 39: Embedded Linux on ARM

ToolchainBuilding – Build Systems

Native Build Cross Build

Canadian BuildCross Native Build

Page 40: Embedded Linux on ARM

ToolchainBuilding - Considerations

● Before building the toolchain following decisions have to be made

– Which library to be used?

– What version of the components to selected?

– Certain important configurations like● Architecture features like floating point● ABI selections● Networking features etc.,

● So you might have to put good amount of time in investigations

Page 41: Embedded Linux on ARM

ToolchainBuilding – Pre-built

● Get a pre-built open toolchain either from a web or from your hardware vendor

● This is the easiest solution, as the toolchain is already built, and has supposedly been tested by the vendor

● The drawback is that you don't have flexibility on your toolchain features (which C library? hard-float or soft-float? which ABI?)

Page 42: Embedded Linux on ARM

ToolchainBuilding – Home Built

● Building toolchain from scratch is one of the tiring and time consuming task which might go upto several weeks.

● Several information to be know. Lots of components to be considered to build.

● Proper decision on the components and its configuration have to be made

● Need kernel headers and C library sources

● There are version dependency issues, patches required to make something work etc.

● The order of build is to be known, but have complete freedom of choice

Page 43: Embedded Linux on ARM

ToolchainBuilding – Home Built

● Can get some idea from the crosstool matrix by Kegel (Note this is outdated)

Page 44: Embedded Linux on ARM

ToolchainBuilding – Automated Tools

● Lots of open community has built several scripts or more elaborate systems to ease the process of building a toolchain

● More easy procedure since no need of breaking your heads on dependency resolutions

● Provides easy configuration mechanism

● Recipes and patches needed to build a toolchain made of particular versions of the various components are shared and easily available

● Some common automated tools are discussed in following slides

Page 45: Embedded Linux on ARM

ToolchainBuilding – Automated Tools – Crosstool-NG

● Updated version of Crosstool, with a kernel-like menuconfig like configuration system

● Supports uClibc, glibc, eglibc, hard and soft float, many architectures

● Support different target OS: Linux, bare metal

● Debug facilities like native and cross gdb, gdb server

● Actively maintained

● Targeted at building toolchains

● http://crosstool-ng.org/

Page 46: Embedded Linux on ARM

ToolchainBuilding – Automated Tools – Buildroot

● Buildroot is a set of Makefiles and patches that makes it easy to generate a complete embedded Linux system

● Generates root file system images ready to be used

● Complete build system based on the Linux Kernel configuration system and supports a wide range of target architectures

● It automates the building process of your embedded system and eases the cross-compilation process

● Supports multiple filesystem types for the root filesystem image

Page 47: Embedded Linux on ARM

ToolchainBuilding – Automated Tools – Buildroot

● Can generate an (e)glibc or uClibc cross-compilation toolchain, or re-use your existing glibc, eglibc or uClibc cross-compilation toolchain

● Supports several hundreds of packages for userspace applications and libraries

● http://buildroot.uclibc.org

Page 48: Embedded Linux on ARM

BuildrootIntroduction

Page 49: Embedded Linux on ARM

BuildrootIntroduction

● Buildroot is a set of Makefiles and patches that makes it easy to generate a complete embedded Linux system

● Generates root file system images ready to be used

● Complete build system based on the Linux Kernel configuration system and supports a wide range of target architectures

● It automates the building process of your embedded system and eases the cross-compilation process

● Supports multiple filesystem types for the root filesystem image

Page 50: Embedded Linux on ARM

BuildrootIntroduction

● Can generate an (e)glibc or uClibc cross-compilation toolchain, or re-use your existing glibc, eglibc or uClibc cross-compilation toolchain

● Supports several hundreds of packages for userspace applications and libraries

● http://buildroot.uclibc.org

Page 51: Embedded Linux on ARM

BuildrootConfiguration

Page 52: Embedded Linux on ARM

BuildrootConfiguration

● Download buildroot package from http://buildroot.uclibc.org

● Untar the package and change directory to buildroot

$ tar xvf buildroot-<year>-<month>.tar.bz2

$ cd buildroot-<year>-<month>

● Buildroot supports Linux kernel like configuration options like menuconfig, xconfig etc.,

● To configure type

$ make menuconfig

● You should get a curses based configurator

Page 53: Embedded Linux on ARM

BuildrootConfiguration

● Select the target architecture you want to work with

● You may select the toolchain components like

– kernel headers

– binutils

– uclibc

– gcc etc.,

● You can ignore selecting these components buy selecting the target architecture, but the default selected components would be used while building

Page 54: Embedded Linux on ARM

BuildrootBuilding

Page 55: Embedded Linux on ARM

BuildrootBuilding

● To start the build process just type

$ make

● Make sure you don't use make -jN option. Instead you can use BR2_JLEVEL option to run compilation of each individual package with make -jN

● BR2_JLEVEL can be set while configuration at

Build options Number of jobs to run simultaneously→

Page 56: Embedded Linux on ARM

BuildrootBuilding

● The make command will generally perform:

– Download source files (as required)

– Configure, build and install the cross compilation toolchain, or simply import an external toolchain

– Configure, build and install selected target packages

– Build kernel, bootloader images if selected

– Create the root filesystem in selected format

● Buildroot output is stored in a single directory named output/ which will be found in the root directory of buildroot

Page 57: Embedded Linux on ARM

BuildrootBuilding - Output

● The left side shows contents the output directory of the buildroot folder

● This directory contains several subdirectories

● The following slides discuss its contents

images

build

staging

buildroot-<YYYY>.<MM>

target

host

output

Page 58: Embedded Linux on ARM

BuildrootBuilding - Output

● All the built images like kernel, bootloader, filesystem are stored here

● These are the files you need to put on the target system

images

build

staging

buildroot-<YYYY>.<MM>

target

host

output

Page 59: Embedded Linux on ARM

BuildrootBuilding - Output

● All the components are built here (this includes tools needed by Buildroot on the host and packages compiled for the target)

● Contains one sub directory for each of these components

images

build

staging

buildroot-<YYYY>.<MM>

target

host

output

Page 60: Embedded Linux on ARM

BuildrootBuilding - Output

● Contains a hierarchy similar to a root filesystem hierarchy

● Contains the headers and libraries of the cross-compilation toolchain and all the userspace packages selected for the target

● This directory is not intended to be the root filesystem for the target: it contains a lot of development files, unstripped binaries and libraries that make it far too big for an embedded system

● These development files are used to compile libraries and applications for the target that depend on other libraries

images

build

staging

buildroot-<YYYY>.<MM>

target

host

output

Page 61: Embedded Linux on ARM

BuildrootBuilding - Output

● Contains almost the complete root filesystem for the target: everything needed is present except the device files in /dev/ and It doesn’t have the correct permissions

● Therefore, this directory should not be used on your target

● Instead, you should use one of the images built in the images/ directory

● If you need an extracted image of the root filesystem for booting over NFS, then use the tarball image generated in images/ and extract it as root

● Contains only the files and libraries needed to run the selected target applications: the development files (headers, etc.) are not present, the binaries are stripped

images

build

staging

buildroot-<YYYY>.<MM>

target

host

output

Page 62: Embedded Linux on ARM

BuildrootBuilding - Output

● Contains the installation of tools compiled for the host that are needed for the proper execution of Buildroot, including the cross-compilation toolchain

images

build

staging

buildroot-<YYYY>.<MM>

target

host

output

Page 63: Embedded Linux on ARM

BuildrootMore Infos!!

● http://buildroot.uclibc.org/downloads/manual/manual.html

Page 64: Embedded Linux on ARM

Target Overview

Page 65: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Target Overview

● Know your Target Controller

● Target Architecture

● Target Board

Page 66: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Target Overview - Target Controller

● ARM920T

– 200MIPS at 180MHz, MMU

– 16KB Inst & Data Cache

– ICE

● Memories

– 128 ROM, 16 KB SRAM

– EBI

– SDRAM, SM,CF, NOR, NAND

● Ethernet MAX 10/100

● USB 2.0 FS Host

● USB 2.0 FS Device

● MCI

● SSC

● USART

– Smart Card

– RS485, RS232

– IrDA

– Modem

● I2C, SPI

● Debug Unit

Page 67: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Target Overview - Target Architecture

Page 68: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Target Overview - Base Board

Page 69: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Target Overview - Application Board

Page 70: Embedded Linux on ARM

Booting Sequences

Page 71: Embedded Linux on ARM

Booting SequenceLinux as general

System Start-up BIOS / Boot Monitor

Stage 1 Boot Loader Master Boot Record

Stage 2 Boot Loader LILO, GRUB, etc

Kernel Linux

Init User Application

Page 72: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Booting Sequence

● Controller's Booting Sequence

● Boot Loader Stages

Page 73: Embedded Linux on ARM

EmxDev Boards – EmxARM9A03Booting Sequence - Controller's Boot Sequence

DeviceSetup

SPIData Flash

ParallelBoot

OR

Download fromData Flash

Download fromEEPROM

Download from8 bit Device

DBGU SerialDownload

USB DownloadDFU Protocol

RUN

RUN

RUN

RUN

RUN

TWIEEPROM Boot

Page 74: Embedded Linux on ARM

● Stage 1 Boot Loader

● Stage 2 Boot Loader

EmxDev Boards – EmxARM9A03Booting Sequence – Boot Loader Stages

Page 75: Embedded Linux on ARM

● Pointer to Stage 2 Boot Loader

EmxDev Boards – EmxARM9A03Booting Sequence – Stage 1 Boot Loader

ROM(ROM Code)

SRAM

Memory(serial / parallel)

(S1BL)

Stage 2Boot Loader

Kernel

Data

Memory(parallel)

Page 76: Embedded Linux on ARM

● Pointer to Kernel Image

● We use U-Boot as S2BL

EmxDev Boards – EmxARM9A03Booting Sequence – Stage 2 Boot Loader

Memory(parallel)

Stage 2Boot Loader

Kernel

Data

Page 77: Embedded Linux on ARM

U-Boot Introduction

Page 78: Embedded Linux on ARM

U-BootIntroduction - General

● The "Universal Bootloader" ("Das U-Boot") is a monitor program

● Free Software: full source code under GPL

● Can get at: //www.denx.de/wiki/U-Boot● Production quality: used as default boot loader by several

board vendors

● Portable and easy to port and to debug

● Many supported architectures: PPC, ARM, MIPS, x86, m68k, NIOS, Microblaze

Page 79: Embedded Linux on ARM

U-BootIntroduction - General

● More than 216 boards supported by public source tree

● Simple user interface: CLI or Hush shell

● Environment variable storing option on different media like EEPROM, Flash etc

● Advanced command supports

Page 80: Embedded Linux on ARM

U-BootIntroduction – Design Principles

● Easy to port to new architectures, new processors, and new boards

● Easy to debug: serial console output as soon as possible

● Features and commands configurable

● As small as possible

● As reliable as possible

Page 81: Embedded Linux on ARM

U-Boot Source Tree

Page 82: Embedded Linux on ARM

U-BootSource Code Browsing

● Untar the U-Boot code

– tar xvf u-boot-<version>.tar.bz2

● Enter the U-Boot directory

– cd u-boot-<version>

● The following slide discuss the contents of the U-Boot directory

Page 83: Embedded Linux on ARM

U-BootSource Tree

● The left side of the slide shows the source content of the U-Boot

● The directory structure might vary depending on the picked version.

● The considered version is

u-boot-2015-01

● Lets us discuss some important directories and files

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 84: Embedded Linux on ARM

U-BootSource Tree

● Machine/arch independent API for external apps

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 85: Embedded Linux on ARM

U-BootSource Tree

● All architecture dependent functions

● CPU specific information

– <core>/cpu.c

– <core>/interrupt.c

– <core>/start.S

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 86: Embedded Linux on ARM

U-BootSource Tree

● Platform, board level files. Eg, atmel, icecube, oxc etc.,

● Contains all board specific initialization

– <boardname>/flash.c

– <boardname>/<boardname>_emac.c

– <boardname>/<boardname>.c

– <boardname>/soc.h

– <boardname>/platform.S

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 87: Embedded Linux on ARM

U-BootSource Tree

● All architecture independent functions

● All the commands

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 88: Embedded Linux on ARM

U-BootSource Tree

● Default configuration files for boards

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 89: Embedded Linux on ARM

U-BootSource Tree

● Partition and device information for disks

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 90: Embedded Linux on ARM

U-BootSource Tree

● You can find all the README files here

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 91: Embedded Linux on ARM

U-BootSource Tree

● Various device drivers files

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 92: Embedded Linux on ARM

U-BootSource Tree

● Contains Makefile for building internal U-Boot fdt

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 93: Embedded Linux on ARM

U-BootSource Tree

● Example code for standalone application

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 94: Embedded Linux on ARM

U-BootSource Tree

● File system directories and codes

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 95: Embedded Linux on ARM

U-BootSource Tree

● Various header files

– configs/<boardname>.h

– <core>.h

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 96: Embedded Linux on ARM

U-BootSource Tree

● Processor specific libraries

– board.c

– <arch>linux.c

– div0.c

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 97: Embedded Linux on ARM

U-BootSource Tree

● Networking related files.

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 98: Embedded Linux on ARM

U-BootSource Tree

● Power On Self Test

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 99: Embedded Linux on ARM

U-BootSource Tree

● Contains the sources for various helper programs

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 100: Embedded Linux on ARM

U-BootSource Tree

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 101: Embedded Linux on ARM

U-BootSource Tree

● Various tools directories and files

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 102: Embedded Linux on ARM

U-BootSource Tree

● Top level make file for Uboot build and configuration

driver

api

arch

board

common

configs

post

scripts

dts

examples

fs

include

lib

test

tools

Makefile

disk net

doc

u-boot-<version>

Page 103: Embedded Linux on ARM

U-Boot Building

Page 104: Embedded Linux on ARM

U-BootBuilding

● The include/configs/ directory contains one configuration file for each supported board

– It defines the CPU type, the peripherals and their configuration, the memory mapping, the Uboot features that should be compiled in, etc.

– It is a simple .h file that sets preprocessor constants. See the README file for the documentation of these constants.

● Assuming that your board is already supported by Uboot, there should be a config corresponding to your board, for example include/configs/at91rm9200ek.h

Page 105: Embedded Linux on ARM

U-BootBuilding

● We need to configure U-Boot for the required board which is generally done as

make <board_name>_config

● The board_name can be found in include/configs/ directory

● The newer version supports kernel like configuration options like make menuconfig

● Compile Uboot, by specifying the cross compiler prefix.

make CROSS_COMPILE=<cross_compile_path>

Page 106: Embedded Linux on ARM

U-BootBuilding

● cross_compile_path could be the command itself if already exported in PATH variable, else you can specify the installation path of command

● For example for arm platform it would look like

make CROSS_COMPILE=arm-linux-

● The result would be u-boot.bin which has to be stored in flash memory (in most of the cases)

● The invocation of the stored image depends on the target architecture. The memory used to store would play the role here

Page 107: Embedded Linux on ARM

U-Boot Introduction

Page 108: Embedded Linux on ARM

U-BootResponsibility

Execute from flash (If configured). Do POST

Relocate to RAM

Setup console for user interaction

Setup device driver for kernel (& RFS) image

Choose the kernel (& RFS) image

Download the kernel (& RFS) image

Choose the kernel (& RFS) imageChoose the kernel (& RFS) image

Setup kernel command line arguments

Jump to kernel start address

Cod

e fl ow

Page 109: Embedded Linux on ARM

U-Boot Important Commands

Page 110: Embedded Linux on ARM

U-BootUtilities

● Environment Variables

● Commands

– Information

– Environment

– Network

– Boot

– Data Transfer

– Memory

Page 111: Embedded Linux on ARM

U-BootEnvironment Variables

● bootcmd : Contains the command that U-Boot will automatically execute at boot time after a configurable delay, if the process is not interrupted

● bootargs : contains the arguments passed to the Linux kernel

● serverip : Server (Host) ip address for network related commands

● ipaddr : Local ip address of the target● ethaddr : MAC address. Will be set once

Page 112: Embedded Linux on ARM

U-BootImportant Environment Variables

● netmask : The network mask to communicate with the server

● bootdelay : Time in seconds to delay the boot process so that the u-boot can be interrupted before executing bootcmd

● autostart : If set the loaded image in memory will be executed automatically

Page 113: Embedded Linux on ARM

U-BootImportant Commands – Information

● help : Help command. Can be used to list all supported built commands

● flinfo : Display flash informations (NOR and SPI Flash)

● nand info : Display NAND flash informations

Page 114: Embedded Linux on ARM

U-BootImportant Commands – Environment

● printenv : Print all set environment variables● setenv : Set the environment variable● saveenv : Save environment variable to configured

memory

Page 115: Embedded Linux on ARM

U-BootImportant Commands – Network

● ping : Checks for network connectivity

Page 116: Embedded Linux on ARM

U-BootImportant Commands – Boot

● boot : Runs the default boot command, stored in bootcmd variable

● bootm : Boot memory. Starts a kernel image loaded at the specified address in RAMExample: bootm <address>

Page 117: Embedded Linux on ARM

U-BootImportant Commands – Data Transfer

● loadb● loads● loady

: Load a file from the serial line to RAM

● tftpboot : Loads a file from the network to RAMExample: tftpboot <address>

Page 118: Embedded Linux on ARM

U-BootImportant Commands – Memory

● erase : Erase the content of NOR flash● protect : Protect the content of NOR flash● cp : Write to NOR flash● nand : Erase, read, write to NAND flash

Page 119: Embedded Linux on ARM

Embedded Linux KernelGeneral Information

Page 120: Embedded Linux on ARM

Embedded Linux KernelGeneral Information

● Where to get?

● Kernel Subsystem

● Source Code Browsing

Page 121: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Where to get?

Note: Snapshot of www.kernel.org. Expect changes on updates

Page 122: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Kernel Subsystem

● Process Scheduler:

– To provide control, fair access of CPU to process, while interacting with HW on time

● Memory Manager:

– To access system memory securely and efficiently by multiple processes. Supports Virtual Memory in case of huge memory requirement

● Virtual File System:

– Abstracts the details of the variety of hardware devices by presenting a common file interface to all devices

Page 123: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Kernel Subsystem

● Network Interface:

– provides access to several networking standards and a variety of network hardware

● Inter Process Communications:

– supports several mechanisms for process-to-process communication on a single Linux system

Page 124: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Untar the Linux kernel code

– tar xvf linux-<version>.<compression_format>

● Enter the Linux kernel directory

– cd linux-<version>

● The following slide discuss the contents of the Linux directory

Page 125: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● The left side of the slide shows the source content of the Linux kernel

● The directory structure might vary depending on the picked version.

● Lets us discuss some important directories and files

init

arch

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

Page 126: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Architecture specific kernel code

● Has sub directories per supported architecture

● Example:

– arm

– powerpc

– X86

● We can also find low level memory management, interrupt handling, early inits, assembly code and much moreinit

arch

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

Page 127: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains core block layer files

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 128: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Cryptographic API for use by kernel itself

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 129: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains system's device drivers

● Sub directories contain classes of device drivers like video drivers, network card drives, low level SCSI drivers etc.,

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 130: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains the device firmwares which will be uploaded to devices with help of drivers

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 131: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● File system related code

● Contains both generic file system code (VFS) and different files system code

● Sub directories of supported file system

● Examples:

– ext2

– ext3

– fat

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 132: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Most of the header files used in the .c file of the kernel source

● It has further sub directories including asm-generic

● Architecture specific header file would be found in arch/<arch>/include/

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Note: File level organization will vary based on different versions of kernel sources

especially architecture and machine related header files

Page 133: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Initialization code for kernel

● Best directory to start with to know on how kernel works

● Has main.c of kernel

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 134: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains kernel's inter process communication code like shared memory, semaphores and other forms

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 135: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Generic kernel level code which can't fit anywhere else

● Contain upper level codes for signal handling, scheduling etc.,

● The architecture specific kernel code will be in arch/<arch_name>/kernel

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 136: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains kernel's library code

● Common string operations, code for debugging and command line parsing code can be found here

● The architecture specific library code will be in arch/<arch_name>/lib

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 137: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains memory management code

● The architecture specific memory management code would be found in arch/<arch_name>/mm

● Example:

– arch/x86/mm/init.c

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 138: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● The kernels networking code

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 139: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Some sample programs

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 140: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains scripts that are used while kernel configuration

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 141: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains code for different security models

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 142: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains all the sound card drivers

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 143: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Certain configuration and testing tools

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 144: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● Contains code that builds a cpio-format archive containing a root file system image, which will be used for early userspace

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 145: Embedded Linux on ARM

Embedded Linux KernelGeneral Information – Source Code Browsing

● This is top level Makefile for the whole source tree

● Contains useful rules and variables like default gcc compilation flags

init

block

crypto

drivers

firmware

scripts

security

ipc

kernel

lib

mm

net

sound

tools

usr

Makefile

fs samples

include

linux-<version>

arch

Page 146: Embedded Linux on ARM

Embedded Linux KernelConfiguration

Page 147: Embedded Linux on ARM

Embedded Linux KernelConfiguration

● The kernel configuration is based on multiple Makefiles

● As discussed already the top level Makefile would be used for this purpose

● The configuration you should know the target. You can find of the target as mentioned below

$ cd linux-<version>

$ make help

● Now you may look for “Configuration targets:” section of the output and decide one

Page 148: Embedded Linux on ARM

Embedded Linux KernelConfiguration

● Once you decide on the target you may try the following command

$ make target

● The modified configurations would be saved on a file called as .config which can be found on the top level of the linux-<version> directory.

● All the target options use the same .config file, so you may use any interchangeably.

Page 149: Embedded Linux on ARM

Embedded Linux KernelConfiguration

● Some most commonly used target are

– make config

– make menuconfig

– make xconfig

● Configuring Architecture specific targets

● Configuring for specific architecture from scratch

Page 150: Embedded Linux on ARM

Embedded Linux KernelConfiguration – make config

user@hostname:linux-<version>$ make configscripts/kconfig/conf --oldaskconfig Kconfig** Linux/<ARCH> <version> Kernel Configuration*Patch physical to virtual translations at runtime (ARCH_PATCH_PHYS_VIRT) [Y/n/?]

● The above image show snap shot typical output of make config command

● Updates current config utilizing a line-oriented program

● No user friendly approach. Could be used if you have limited host installations

● The problem with this approach is that, It force you to follow an sequence of questions while configuration.

● Have to use “Ctrl C” to exit

Page 151: Embedded Linux on ARM

Embedded Linux KernelConfiguration – make menuconfig

● The above image shows the snapshot of typical output of make menuconfig command

Page 152: Embedded Linux on ARM

Embedded Linux KernelConfiguration – make menuconfig

● Most commonly used method and simple method

● Can be used if graphics is unavailable

● Requires libncurses-dev installation

● Easy to navigate between options, using arrow keys

● Use <Help> to know more on menuconfig

Page 153: Embedded Linux on ARM

Embedded Linux KernelConfiguration – make xconfig

● The above image shows the snapshot of typical output of make xconfig command

Page 154: Embedded Linux on ARM

Embedded Linux KernelConfiguration – make xconfig

● Most commonly used graphical method of configuration

● Easy to use, better search option

● Use Help menu to know more on xconfig

● Requires libqt-dev packages installation

Page 155: Embedded Linux on ARM

Embedded Linux KernelConfiguration – Architecture Specific

● Most preferably used in Embedded Linux configuration

● You can find then at arch/<arch>/configs/

● These files are best possible minimal .config file you can have for your board

● Just type the following on the command to know available target

$ make help

– Now you may look for “Architecture specific targets:” section of the output to look for default configuration for your target architecture

● Now the following command

$ make <controller_name>_defconfig

Page 156: Embedded Linux on ARM

Embedded Linux KernelConfiguration – Architecture Specific

● The previous command would rewrite the existing .config file.

● Now you can use any of the general configuration method to discussed above to configure further if required

● If you feel the you are done and need to preserve your configuration then you can save it by

$ make savedefconfig

● The above line will create a file call defconfig on root of kernel source directory

● Now you can mv it to the config directory by the following command

$ mv defconfig /arch/<arch>/configs/my_defconfig

Page 157: Embedded Linux on ARM

Embedded Linux KernelConfiguration – From Scratch

● Its possible to configure a kernel from scratch without using any default configuration

● It would obvious if your a board vendor where you might have to do for your board

● Point to be kept in mind in this case

– Make sure you alteast select a proper architecture for your board

– Most of the architecture dependent basic things would be set by default, so just leave it as it is, unless you know what you change

– Might have to change certain thing like select a correct device driver for your board

Page 158: Embedded Linux on ARM

Embedded Linux KernelBuilding

Page 159: Embedded Linux on ARM

● Assuming the required configuration are done, The next step would be to compile the kernel.

● Type the following command on the prompt to start the compilation

make

● Can use the below command if you have multicore CPU

make -j

● The above command will speed up your compilation process

● You may even specify the no of jobs you want to run simultaneously based on your CPU configuration

Embedded Linux KernelBuilding - Compilation

Page 160: Embedded Linux on ARM

● Once the compilation is done you will get the kernel image in the following location arch/<arch>/boot

● make install this is rarely used in embedded dev as the kernel image is single file, But still can be done by modifying its behavior arch/<arch>/boot/install.sh

● You can install all the configured modules by the following command

make INSTALL_MOD_PATH=<dir>/ module_install

● The above line direct the module installation on the path provided by the INSTALL_MOD_PATH variable and this is important to avoid installation in host root path

Embedded Linux KernelBuilding - Compilation

Page 161: Embedded Linux on ARM

● Most of the embedded system uses U-Boot as its second stage boot loader

● U-Boot require the kernel image to be converted into a format which it can load. This converted format is called as uImage

● The discussion done here is on how create the uImage from vmlinux

● vmlinux is the output of the kernel compilation which you would find on the root directory of the kernel directory

● vmlinux consists of multiple information like ELF header, COFF and binary

Embedded Linux KernelBuilding – Kernel Image

Page 162: Embedded Linux on ARM

● So it required to extract the binary file from the vmlinux first, Which is done by the following command

arm-linux-objcopy -O binary vimlinux linux.bin

● After extraction the U-Boot header can be added using mkimage command, This is done by the following command

mkimage -A arm -O linux -T kernel -C none -a 20008000 -e 20008000 -n “Embedded Linux” -d linux.bin uImage.arm

● After all the above steps the kernel image is ready for deployment on target

Embedded Linux KernelBuilding - Kernel Image

Page 163: Embedded Linux on ARM

Embedded Linux KernelDeploy

Page 164: Embedded Linux on ARM

Embedded Linux KernelDeploy

● Assuming the host is already configured with TFTP server and Target is running U-Boot with TFTP client

● Copy uImage.arm in /var/lib/tftpboot/

● Copy the kernel image to the target board as mentioned below

U-boot> tftp <TEXTBASE_ADDRESS> uImage.arm

● TEXTBASE_ADDRESS is defined configuring u-boot

● Once the image is transferred you can boot the image as

U-boot> bootm

● Your kernel should be loaded and executed now :)

Page 165: Embedded Linux on ARM

File Systems

Page 166: Embedded Linux on ARM

File Systems

● Introduction

● Building FS from scratch

Page 167: Embedded Linux on ARM

Introduction

Page 168: Embedded Linux on ARM

File SystemsIntroduction

● File system is an approach on how the data can be organized in order to have a meaningful read or write in a system

● File systems provides a very easy way of identifying data like where it begins and ends

● The group of such data can be called as “Files”

● The method used to manage these groups of data can be called as “File systems”

Page 169: Embedded Linux on ARM

File SystemsIntroduction

● There are several kinds file system having different structure and logic, properties of speed, flexibility, security, size and more

● The most commonly used media to store the data are

– Storage Devices

● Magnetic Tapes● Hard Drive● Optical Discs● Flash Memories● RAM (Temporary)

– Network like NFS

– Virtual like procfs

Page 170: Embedded Linux on ARM

File SystemsIntroduction

● An OS can support more than one file system

● In this topic we are going to concentrate on Unix and Unix like file systems

● File systems can be discussed in the following context

– Contents

– Types

– Partitions

Page 171: Embedded Linux on ARM

File System ContentsLinux Directory Structure

Page 172: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● When it is the matter of data, different operating system uses different approaches to organize it

● In Unix and Unix like systems, applications and users see a single global hierarchy of files and directories, which can be composed of several file systems.

● The access of the data are done using a process called as mounting

● The location on where the data should be located called as mount point is to be informed to the OS.

● The following slides discuss about the Linux Directory Structure

Page 173: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● The left side of the slide shows the most important files in Linux system

● The organization of a Linux root file system in terms of directories is well defined by the Filesystem Hierarchy Standard

● Most Linux systems conform to this specification

– Applications expect this organization

– It makes it easier for developers and users as the file system organization is similar in all systems

tmp

sys

usr

var

/bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 174: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Place for most commonly used terminal commands

● Common Linux commands you need to use in single-user modes are located under this directory.

● Commands used by all the users of the system are located here.

● Examples:

– ls

– ping

– grep

– cp

bin

tmp

sys

usr

var

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 175: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Contains files needed to start up the system, including the Linux kernel, a RAM disk image and bootloader configuration files

● Kernel image (only when the kernel is loaded from a file system, not common on non-x86 architectures)

boot

tmp

sys

usr

var

bin

dev

home

media

proc

sbin

etc

lib

mnt

root

Page 176: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Device files

● These include terminal devices, usb, or any device attached to the system.

● Examples:– /dev/tty1

– /dev/usbmon0

dev

tmp

sys

usr

var

bin

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 177: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Contains configuration files required by all programs.

● This also contains startup and shutdown shell scripts used to start/stop individual programs.

● Examples:

– /etc/resolv.conf

– /etc/logrotate.conf

etc

tmp

sys

usr

var

bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 178: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Home directories for all users to store their personal files.

● Example:

– /home/arun

– /home/adilhome

tmp

sys

usr

var

bin

dev

media

proc

sbin

boot

etc

lib

mnt

root

Page 179: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Contains library files that supports the binaries located under /bin and /sbin

● Library file names are either ld* or lib*.so.*

● Examples:

– ld-2.11.1.so

– libncurses.so.5.7

lib

tmp

sys

usr

var

bin

dev

home

media

proc

sbin

boot

etc

mnt

root

Page 180: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Temporary mount directory for removable devices.

● Examples:

– /media/cdrom

– /media/floppy

– /media/cdrecordermedia

tmp

sys

usr

var

bin

dev

home

proc

sbin

boot

etc

lib

mnt

root

Page 181: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Temporary mount directory where sysadmins can mount file systems.

mnt

tmp

sys

usr

var

bin

dev

home

media

proc

sbin

boot

etc

lib

root

Page 182: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Contains information about system process.

● This is a pseudo file system contains information about running process. For example: /proc/{pid} directory contains information about the process with that particular pid.

● This is a virtual file system with text information about system resources. Examples:

– /proc/uptime

proc

tmp

sys

usr

var

bin

dev

home

media

sbin

boot

etc

lib

mnt

root

Page 183: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Root user's home directory

root

tmp

sys

usr

var

bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

Page 184: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Just like /bin, /sbin also contains binary executables

● But, the Linux commands located under this directory are used typically by system administrator, for system maintenance purpose.

● Examples:

– iptables

– reboot

– fdisk

– ifconfig

– swapon

sbin

tmp

sys

usr

var

bin

dev

home

media

proc

boot

etc

lib

mnt

root

Page 185: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Mount point of the sysfs virtual file system

sys

tmp

usr

var

bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 186: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Directory that contains temporary files created by system and users.

● Files under this directory are deleted when system is rebooted.

tmp

sys

usr

var

bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 187: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● Contains binaries, libraries, documentation, and source-code for second level programs.

● /usr/bin contains binary files for user programs. If you can’t find a user binary under /bin, look under /usr/bin. For Examples: at, awk, cc, less, scp

● /usr/sbin contains binary files for system administrators. If you can’t find a system binary under /sbin, look under /usr/sbin. For Examples: atd, cron, sshd, useradd, userdel

● /usr/lib contains libraries for /usr/bin and /usr/sbin

● /usr/local contains users programs that you install from source. For example, when you install apache from source, it goes under /usr/local/apache2 usr

tmp

sys

var

bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 188: Embedded Linux on ARM

File System ContentsLinux Directory Structure

● var stands for variable files.

● Content of the files that are expected to grow can be found under this directory.

● This includes —

– /var/log - system log files

– /var/lib - packages and database files

– /var/mail - emails

– /var/spool - print queues

– /var/lock - lock files

– /var/tmp - temp files needed across reboots

var

tmp

sys

usr

bin

dev

home

media

proc

sbin

boot

etc

lib

mnt

root

Page 189: Embedded Linux on ARM

File System Types

Page 190: Embedded Linux on ARM

File System TypesIntroduction

● Variety of choices available based on

– Speed

– Size

– Reliability

– Access restrictions

● Some types are specifically targeted based on the storage media

● The following slide discuss some of the most commonly used types

Page 191: Embedded Linux on ARM

File System TypesIntroduction

● RAM File Systems

– initrd

– initramfs

● Disk File Systems

– ext2

– ext3

– ext4

– Flash File Systems

● Intro to MTD● JFFS2

Page 192: Embedded Linux on ARM

File System FormatsVariants

● Distributed File Systems

– NFS

● Special Purpose File Systems

– squashfs

Page 193: Embedded Linux on ARM

File System TypesRAM File Systems

Page 194: Embedded Linux on ARM

File System TypesRAM File Systems - initrd

● Abbreviated as initial RAM disk

● RAM based block device with fixed size formatted and mounted like disk at /dev/ram

● The size problem

– Sometimes might be a waste of space if its not fully utilized

– You can extend the limit later on run time as it has to be reformatted

● Requires a file system driver compiled statically into kernel to interpret data at run time

● ext2 format mostly used for creation

Page 195: Embedded Linux on ARM

File System TypesRAM File Systems - initrd

● Typical boot process using initrd is as followed

– Bootloader loads the kernel and initrd into ram

– Kernel converts the initrd into a normal RAM disk and frees the memory used by initrd

– initrd is mounted as read write as root

– /linuxrc is executed (could be a executable, shell script)

– linuxrc mounts the real root file system

– linuxrc places the root file system at the root directory using the pivot_root system call

– The normal boot is done on the root file system (run /sbin/init)

– Initrd file system is removed

Page 196: Embedded Linux on ARM

File System TypesRAM File Systems - initramfs

● Abbreviated as initial RAM file system

● Successor of initrd, with an advantage of flexible size which can grow and shrink and does not need a driver

● Gets integrated with kernel image

● cpio archive of initial file system that gets loaded into memory during Linux startup process

● Kernel mounts the file system and starts init

● Faster booting as the it is loaded at boot time, hence applications can start faster

Page 197: Embedded Linux on ARM

File System TypesRAM File Systems - initramfs

● Could be used as intermediate stage before loading real file system

● The path of file system to be included has to be set while kernel configuration

● The kernel build process would take care of integrating it with the kernel image

● Just search INITRAMFS on the configuration menu to know where to set the path

● Just build the kernel once the path is set

Page 198: Embedded Linux on ARM

File System TypesDisk File Systems

Page 199: Embedded Linux on ARM

File System TypesDisk (Block) File System

● Has ability to store data randomly at addresses in a short amount of time

● Multiple users (or processes) access to various data on the disk without regard to the sequential location of the data

● Disk file systems are usually block-oriented.

● Files in a block-oriented file system are sequences of blocks, often featuring fully random-access read, write, and modify operations

● No erasing required before write

Page 200: Embedded Linux on ARM

File System TypesDisk (Block) File System

● Examples

– Hard drives, floppys, RAM Disks

– Compact Flash, SD Cards

● Though this device are based of flash devices, the integrated controllers take care of the low level handling of data like block devices

Page 201: Embedded Linux on ARM

File System TypesDisk (Block) File System - ext2

● Abbreviated as Second Extended File System

● Matured and stable GNU/Linux file system

● Does not support journaling support or barriers

● Not recommend as for / and /home partitions since it take long time for file system check

● Most compatible choice for /boot partition

● Recommend for very small partitions (say < 5 MB), because other file system types need more space for metadata

● Used to be the default file system in several Linux distribution

Page 202: Embedded Linux on ARM

File System TypesDisk (Block) File System - ext2

● ext2 is still preferred choice of flash based storage due the absence of journal

Page 203: Embedded Linux on ARM

File System TypesDisk (Block) File System – ext3

● Abbreviated as Third Extended File System

● An extension of ext2 with journaling support and write barriers

● Backward compatible with ext2 and extremely stable

● ext2 can be converted to ext3 directly without backup

Page 204: Embedded Linux on ARM

File System TypesDisk (Block) File System – ext4

● Abbreviated as Fourth Extended File System

● Compatible with both ext2 and ext3 and used as default file system in many distributions

● Supports huge individual file data and overall file system size

● ext4 allows unlimited number of sub directories compared to ext3

● Has many new features like

– Journal checksum

– Fast fsck etc.

● Can turn off the Journal feature if required

Page 205: Embedded Linux on ARM

File System TypesDisk (Block) File System - Flash File System

● Flash file system is designed for storing files on flash memory–based storage devices

● They are optimized for the nature and characteristics of flash memory for the following reasons

– Erasing blocks

– Random access

– Wear leveling

● Examples

– NAND and NOR Flashes

● In Linux the flash memories use a device file called MTD for interaction

Page 206: Embedded Linux on ARM

File System TypesFlash File System - MTD

● MTD stands form Memory Technology Device

● Created to have abstraction layer between the hardware specific device drivers and higher-level applications

● MTD helps to use the same API with different flash types and technologies

● MTD does not deal with block devices like MMC, eMMC, SD, Compact Flash etc., Since these are no raw flashes but they have Flash Translation layer. The FTL make these devices look like block devices

Page 207: Embedded Linux on ARM

File System TypesFlash File System - MTD

Page 208: Embedded Linux on ARM

File System TypesFlash File System - MTD

● MTD devices can be looked at /proc/mtd

● Two types of drivers created

– mtdchar drivers● Can be seen in /dev as mtd<n> or mtd<n>ro with major

number 90● Even minor number for rw type and odd minor number for ro

type

– mtdblock drivers● Can be seen in /dev as mtdblock<n> allowing rw in block

level● Does not handle bad block check and any wear-leveling

Page 209: Embedded Linux on ARM

File System TypesFlash File System - MTD

● MTD device are usually partitioned

● These partitions can be used fro different purposes like boot code area, kernel image, data partitions etc

● The MTD partitions can be described by

– Specifying in board device tree

– In kernel code (Hard code)

– Through kernel command line (Modification)

● Each partition becomes a separate MTD device

Page 210: Embedded Linux on ARM

File System TypesFlash File System – MTD - Partitions

● Using Device Tree

Page 211: Embedded Linux on ARM

File System TypesFlash File System – JFFS2

● Abbreviated as Journalling Flash File System 2

● Standard filesystem for MTD flash

● Compression support for zlib, rubin, rtime and lzo

● Better performance, power down reliability, wear leveling and ECC

Page 212: Embedded Linux on ARM

File System TypesDistributed File Systems

Page 213: Embedded Linux on ARM

File System TypesDistributed File System

● A network file system is a file system that acts as a client for a remote file access protocol, providing access to files on a server.

● Data accessed by all users can be kept on a central host, with clients mounting this directory at boot time

● Data consuming large amounts of disk space may be kept on a single host

Page 214: Embedded Linux on ARM

File System TypesSpecial Purpose File Systems

Page 215: Embedded Linux on ARM

File System TypesSpecial Purpose File System

● Sometimes the way we handle data might depend on the requirements

● There some file system types which can offer different features like

– Compressions

– Backups

– Access etc.

Page 216: Embedded Linux on ARM

File System TypesSpecial Purpose File System - squashfs

● Read-only compressed file system for block devices

● Can be used for read only data like binaries, kernel etc

● Very good compression rate and read access performance

● Mostly used in live CDs and live USB distros

● Can support compressions like

– gzip

– LZMA

– LZO etc

Page 217: Embedded Linux on ARM

File System Partitions

Page 218: Embedded Linux on ARM

File System Partitions

● Logically dividing the available storage space into sections that can be accessed independently to one another for

– File management

– Multiple users

– Data Security

– Efficiency and reliability etc.,

● Entire storage can be created as a single partition if required, But multiple partition can help in number of way like dual or multiboot system, swap etc.

Page 219: Embedded Linux on ARM

File System PartitionsLinux System

● Two major partitions

– Data partition – Linux data partition

● A root partition and one pr more data partition

– Swap partition - Expansion of physical memory, extra memory on storage (like virtual RAM)

● Rarely used in embedded system because of the nature of the storage devices used

Page 220: Embedded Linux on ARM

File System PartitionsMount Points

● All partitions are attached to the system via a Mount Point

● A mount point defines the place of a particular data set in a file system

● Usually all the partitions are connected through the root (/) partition

● The / will have empty directories which will be the starting point of partitions

● Some core partitions can be mounted on startup by describing it in /etc/fstab

Page 221: Embedded Linux on ARM

File System PartitionsSchemes – Desktop – Example 1

● One possible Desktop scheme is shown here

● Simplest and standard one to have

● Partition for OS which get mounted as / (root)

● Data partition mounted as /home

● Augment to RAM, referred and mounted as swap

/(root)

/home

swap

Hard D

r ive

Page 222: Embedded Linux on ARM

File System PartitionsSchemes - Desktop – Example 2

● Similar to previous one with a separate boot partition which will contain the boot images

/(root)

/home

swap

/boot

Hard D

r ive

Page 223: Embedded Linux on ARM

File System PartitionsSchemes - Embedded – Example 1

● The partition scheme in embedded systems depends on the system architecture

● This scheme shows two stages of boot loaders each in different memories

● Rest all the sections goes in other memory

Bootloader 1

Kernel Image

RFS Image

Bootloader 2

Mem

ory 1M

emory 2

Mem

ory 3

Data

Page 224: Embedded Linux on ARM

File System PartitionsSchemes - Embedded – Example 2

● This scheme shows stage 1 of boot loader in different memory

● Rest all the sections including stage 2 boot loader goes in other memory

Bootloader 1

Kernel Image

RFS Image

Bootloader 2

Mem

ory 1M

emory 2

Data

Page 225: Embedded Linux on ARM

File System PartitionsSchemes - Embedded – Example 3

● This scheme shows all the contents share in a single memory Bootloader 1

Kernel Image

RFS Image

Bootloader 2

Mem

ory 1

Data

Page 226: Embedded Linux on ARM

File SystemsBuilding from scratch

● File systems can be created manually but

– Would be time consuming

– Lots of dependencies

– Lots of components have to be integrated like binaries, libraries, scripts, configuration files etc.

– Customization for embedded would be challenging

– Many more..

● So BusyBox is an alternative solution

Page 227: Embedded Linux on ARM

BusyBoxIntroduction

Page 228: Embedded Linux on ARM

BusyBoxIntroduction

● Often called as the Swiss Army Knife of Embedded Linux

● BusyBox combines tiny versions of many common UNIX utilities into a single small executable

● It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc

● Written with size-optimization and limited resources in mind

Page 229: Embedded Linux on ARM

BusyBoxIntroduction

● The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; with expected functionality and behave very much like their GNU counterparts

● Provides a fairly complete environment for any small or embedded system

● Extremely modular so you can easily include or exclude commands (or features) at compile time

● This makes it easy to customize your embedded systems

● Sizes less than < 500 KB (statically compiled with uClibc) or less than 1 MB (statically compiled with glibc)

Page 230: Embedded Linux on ARM

BusyBoxBuilding

Page 231: Embedded Linux on ARM

BusyBoxBuilding - Configuration

● Download the latest stable sources from http://busybox.net

● You may try the following targets for configuration

make defconfig

● Configures all options for regular users.

make allnoconfig

● Unselects all options. Good to configure only what you need.

● Linux kernel like configuration, make menuconfig or make xconfig also available

Page 232: Embedded Linux on ARM

BusyBoxBuilding - Compilation

● BusyBox, by specifying the cross compiler prefix.

make CROSS_COMPILE=<cross_compile_path>

● cross_compile_path could be the command itself if already exported in PATH variable, else you can specify the installation path of command

● For example for arm platform it would look like

make CROSS_COMPILE=arm-linux-

● The cross compiler prefix can be set in configuration interface if required

BusyBox Setting Build Option Cross Compiler prefix→ →

Page 233: Embedded Linux on ARM

BusyBoxInstallation

● To install BusyBox just type

make install

● The default installation path would the current directory, will should see _install directory

● The installation path can be customized in configuration if required as mentioned below

BusyBox Setting Installation Option BusyBox installation → →prefixs

● The installation directory will contain Linux like directory structure with symbolic links to busybox executable

Page 234: Embedded Linux on ARM

Stay connected

About us: Emertxe is India’s one of the top IT finishing schools & self learning kits provider. Our primary focus is on Embedded with diversification focus on Java, Oracle and Android areas

Branch office: Corporate Head Office:Emertxe Information Technologies, Emertxe Information Technologies,No-1, 9th Cross, 5th Main, No-83, 1st Floor, Farah Towers,Jayamahal Extension, MG Road,Bangalore, Karnataka 560046 Bangalore, Karnataka 560001

T: +91 809555 7333 (M), +91 80 4128 9576 E: [email protected]

https://www.facebook.com/Emertxe https://twitter.com/EmertxeTweet https://www.slideshare.net/EmertxeSlides

Page 235: Embedded Linux on ARM

Thank You