0% found this document useful (0 votes)
558 views31 pages

Booting Android: Bootloaders, Fastboot and Boot Images

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
558 views31 pages

Booting Android: Bootloaders, Fastboot and Boot Images

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
  • Overview
  • Image Files
  • Typical Flash Memory Layout
  • The Bootloader
  • Booting Android
  • The Android Bootloader
  • Android Boot and Recovery Images
  • Boot Sequence
  • Reverse-engineering a Boot Image
  • Extracting Files from a Ramdisk
  • Creating a New Ramdisk
  • Creating a New Boot Image
  • Fastboot
  • Flash Memory Devices
  • Raw NAND Flash
  • SD and eMMC
  • SD Cards and Other Removable Media

Booting Android

Bootloaders, fastboot and boot images

Booting Android 1 Copyright © 2011-2016, 2net Ltd


License

These slides are available under a Creative Commons Attribution-ShareAlike 3.0


license. You can read the full text of the license here
[Link]
You are free to

• copy, distribute, display, and perform the work

• make derivative works

• make commercial use of the work

Under the following conditions

• Attribution: you must give the original author credit

• Share Alike: if you alter, transform, or build upon this work, you may distribute
the resulting work only under a license identical to this one (i.e. include this
page exactly as it is)

• For any reuse or distribution, you must make clear to others the license terms of
this work

Booting Android 2 Copyright © 2011-2016, 2net Ltd


About Chris Simmonds
• Consultant and trainer
• Author of Mastering Embedded Linux
Programming
• Working with embedded Linux since 1999
• Android since 2009
• Speaker at many conferences and
workshops
"Looking after the Inner Penguin" blog at [Link]

[Link]

[Link]

Booting Android 3 Copyright © 2011-2016, 2net Ltd


Overview

• Android system images: boot, recovery, system,


userdata and cache
• Android "boot blobs"
• Bootloaders for Android
• Fastboot
• Flash memory and flash filesystems

Booting Android 4 Copyright © 2011-2016, 2net Ltd


Image files

• A typical build for an Android device produces five


image files in out/target/product/<product>
Image Description
[Link] Kernel + ramdisk used for normal boot
[Link] Kernel + ramdisk used to boot into recovery mode
[Link] File system image for /system
[Link] File system image for /data
[Link] File system image for /cache

Booting Android 5 Copyright © 2011-2016, 2net Ltd


Typical flash memory layout
Bootloader

misc (optional - used during OTA update)

Boot kernel + ramdisk

Recovery kernel + ramdisk

/system - read-only file system

/data - read/write file system

/cache - read/write file system

Booting Android 6 Copyright © 2011-2016, 2net Ltd


The bootloader
• All systems need a bootloader
• Responsible for:
• Early hardware initialisation

• Load and boot kernel and initial ram filesystem

• System maintenance, including loading and flashing


new kernel and system images
• Example: U-Boot
• Open source

• Used in many dev boards (BeagleBone, Raspberry


Pi) and in many shipping products
• [Link]

Booting Android 7 Copyright © 2011-2016, 2net Ltd


Booting Android
• It is possible to boot Android using a normal
bootloader such as U-Boot
• However, most devices include Android-specific
features:
• Support normal and recovery boot modes

• Ability to load kernel + ramdisk blobs ([Link] and


[Link])
• The fastboot protocol

• Example: LK (Little Kernel)


• git://[Link]/kernel/[Link]

• Supports many Qualcomm-based devices as well as


rudimentary support for BeagleBoard and PC-x86

Booting Android 8 Copyright © 2011-2016, 2net Ltd


The Android bootloader

• Pre JB 4.2, AOSP had source for a simple bootloader


in bootable/bootloader/legacy
• Used in early handsets (Android Dev Phone, HTC
Dream)
• Not updated since the Eclair release

• Some of this code may have found its way into


proprietary bootloaders

Booting Android 9 Copyright © 2011-2016, 2net Ltd


Android boot and recovery images

• The files [Link] and [Link] are created by the


tool mkbootimg (the code is in system/core/mkbootimg)
• They contain a compressed kernel, the kernel
command line and, optionally, a ramdisk in the
normal Linux compressed cpio format
• Most Android bootloaders can read and load these
images into memory
• The format is defined in bootimg.h

Booting Android 10 Copyright © 2011-2016, 2net Ltd


Boot and recovery image format

From system/core/mkbootimg/bootimg.h
struct boot_img_hdr {
ramdisk unsigned char magic[8]; // "ANDROID!"
image unsigned kernel_size;
(compressed unsigned kernel_addr;
unsigned ramdisk_size;
cpio) unsigned ramdisk_addr;
unsigned second_size; // 2nd image: not used
unsigned second_addr;
unsigned tags_addr;
unsigned page_size; // typically 2048
unsigned unused[2];
unsigned char name[16]; // product name
unsigned char cmdline[512]; // kernel cmdline
Kernel unsigned id[8]; // timestamp/checksum/etc
image unsigned char extra_cmdline[1024];
(zImage) };

Header

Booting Android 11 Copyright © 2011-2016, 2net Ltd


Boot sequence
Power
on

Boot recovery Boot normal


Bootloader

Load normal
kernel and ramdisk

Load recovery
kernel and ramdisk Run /init
Read init*.rc
Mount file systems
Start services

Recovery Normal
mode mode

Booting Android 12 Copyright © 2011-2016, 2net Ltd


Reverse-engineering a boot image
• Sometimes it is useful to extract the files from a boot
or recovery image
• There are numerous tools to do so, for example
boot-extract
[Link]
$ boot-extract [Link]
Boot header
flash page size 2048
kernel size 0x432358
kernel load addr 0x10008000
ramdisk size 0x173740
ramdisk load addr 0x11000000
name
cmdline
zImage extracted
ramdisk offset 4403200 (0x433000)
[Link] extracted
$ ls
[Link] [Link] zImage

Booting Android 13 Copyright © 2011-2016, 2net Ltd


Extracting files from a ramdisk

• The ramdisk is just a compressed cpio archive


• Extract the files like so:
$ zcat [Link] | cpio -i
5665 blocks
$ ls
charger [Link] property_contexts
...

Booting Android 14 Copyright © 2011-2016, 2net Ltd


Creating a new ramdisk

• Do the following
$ cd some-directory
$ find . | cpio -H newc --owner root:root -ov > ∼/[Link]
$ cd ∼
$ gzip [Link]

• The end result will be [Link]

Booting Android 15 Copyright © 2011-2016, 2net Ltd


Creating a new boot image

• You can create a boot or recovery image using the


mkbootimg command
• For example:
$ mkbootimg --kernel zImage --ramdisk [Link] \
--base 0x10000000 --pagesize 2048 -o [Link]

• --base is used by mkbootimg to calculate the kernel


and ramdisk load addresses as follows:
• kernel_addr = base + 0x00008000

• ramdisk_addr = base + 0x01000000

Booting Android 16 Copyright © 2011-2016, 2net Ltd


Fastboot

• Fastboot is a USB protocol and a command language


for various maintenance and development tasks
• Fastboot protocol v0.4 is defined in:
• bootable/bootloader/legacy/fastboot_protocol.txt
(up to JB 4.1)
• system/core/fastboot/fastboot_protocol.txt (JB 4.3
and later)
NOTE: fastboot is not about the speed of booting; it is about making
the development process simpler (and faster)

Booting Android 17 Copyright © 2011-2016, 2net Ltd


Booting into the bootloader

• On a typical Android device you can boot into the


bootloader by:
• powering on while pressing various buttons (Google
for details)
• from a running device, typing:
$ adb reboot-bootloader

• Once the device has booted into the bootloader you


can use the fastboot command on the development
machine to communicate with it

Booting Android 18 Copyright © 2011-2016, 2net Ltd


fastboot commands (1/3)

Basic commands
Command Description
devices List devices attached that will accept fast-
boot commands
getvar Get a variable
continue Continue boot process as normal
reboot Reboot device
reboot-bootloader Reboot back into bootloader

Booting Android 19 Copyright © 2011-2016, 2net Ltd


fastboot commands (2/3)
Flashing commands

Command Description
erase <partition> Erase <partition>
flash <partition> Erase and program <partition>
with <partition>.img of current
product
flash <partition> <filename> Erase and program <partition>
with <filename>
flashall Erase and program [Link],
[Link] and [Link] of
current product and then reboot
Where
<partition> is one of boot, recovery, system, userdata, cache
current product is $ANDROID_PRODUCT_OUT
Note: the location and size of partitions is hard-coded in the bootloader

Booting Android 20 Copyright © 2011-2016, 2net Ltd


fastboot commands (3/3)

Special commands

Command Description
oem Device-specific operations
boot <kernel> <ramdisk> Load and boot kernel and ramdisk

Example:
$ fastboot -c "kernel command line" boot zImage [Link]

Booting Android 21 Copyright © 2011-2016, 2net Ltd


fastboot variables

The getvar command should return values for at least


these variables:
Variable Meaning
version Version of the protocol: 0.4 is the one doc-
umented
version-bootloader Version string of the Bootloader
version-baseband Version string of the Baseband Software
product Name of the product
serialno Product serial number
secure If "yes" the bootloader requires signed im-
ages

Booting Android 22 Copyright © 2011-2016, 2net Ltd


Unlocking the bootloader
• Most devices ship with the bootloader locked
• fastboot getvar secure returns true

• Unlocking - where it is allowed - is device specific


• For example, on recent Nexus devices you use a
fastboot oem command
$ fastboot oem unlock

• Answer yes to the on-screen prompt


• For security reasons, this wipes the data and cache
partitions

Booting Android 23 Copyright © 2011-2016, 2net Ltd


What goes where?

[Link]: read-only
[Link]:
/app built-in Android apps
read-only
/bin native binaries
ramdisk
/framework Java components of framework
/lib native libraries
...

/init [Link]: read-write


/[Link] /app user-installed Android apps
/data persistent data
/system /dalvik-cache optimised Dex files
/system
/data ...

/cache [Link]: read-write


/backup place to backup up app data
/recovery logs used in recovery mode

Booting Android 24 Copyright © 2011-2016, 2net Ltd


Flash memory devices
• In almost all cases data is stored in flash memory
• There are two main types
• Raw NAND flash, where the chips are accessed
directly by Linux
• Managed flash, which contain an on-chip controller

• Managed flash is the most common


• Examples:
• MMC, SD and MicroSD cards: removeable storage

• eMMC (embedded MMC): same electrical interface


as MMC, but packaged as a chip
• UFS (Universal Flash Storage): similar to eMMC, but
faster and with a SCSI command set
Booting Android 25 Copyright © 2011-2016, 2net Ltd
Raw NAND flash

• NAND flash chips are accessed via the Linux MTD


(Memory Technology Device) drivers
• Partitions are named /dev/block/mtdblockN where N
is the partition number
• /proc/mtd lists the partitions and sizes
# cat / proc / mtd
dev : size erasesize name
mtd0 : 05660000 00020000 " system "
mtd1 : 04000000 00020000 " userdata "
mtd2 : 04000000 00020000 " cache "

Booting Android 26 Copyright © 2011-2016, 2net Ltd


File systems for raw NAND flash

• Flash translation layer implemented in the filesystem


• NAND flash devices require special filesystem
support, such as:
• jffs2 (Journalling Flash File System 2)
• Note: incompatible with the Android run-time (no
writeable mmaped files)!
• yaffs2 (Yet Another Flash File System 2)
• ubifs (Unsorted Block Image File System)
• Most Android devices with NAND flash use yaffs2

Booting Android 27 Copyright © 2011-2016, 2net Ltd


SD and eMMC

• Flash translation layer implemented in the chip


• The controller chip splits flash memory into 512-byte
sectors just like hard drives
• Accessed via the Linux mmcblock driver
• Partition device nodes have names of the form
mmcblk[chip number]p[partition number]
• For example:
/ dev / block / mmcblk0p3 / system
/ dev / block / mmcblk0p8 / data
/ dev / block / mmcblk0p4 / cache

Booting Android 28 Copyright © 2011-2016, 2net Ltd


File systems for eMMC

• eMMC devices "look" like hard drives


• Use the same filesystem types
• The preferred type in most Android devices is ext4
• Alternative: F2FS (Flash Friendly File System)
• Develpoed by Samsung, and deployed on some of
their devices
• Faster file writes than ext4

Booting Android 29 Copyright © 2011-2016, 2net Ltd


SD cards and other removable media

• This includes MMC, SD, microSD and USB flash


drives
• For compatibility with other operating systems they
come pre-formatted with FAT32
• Use the Linux vfat driver

Booting Android 30 Copyright © 2011-2016, 2net Ltd


Delving deeper

• This is an excerpt from my Android Porting class


• If you would like to find out more secrets of Android,
visit [Link] and
book a course

Booting Android 31 Copyright © 2011-2016, 2net Ltd

Booting Android
Bootloaders, fastboot and boot images
Booting Android
1
Copyright © 2011-2016, 2net Ltd
License
These slides are available under a Creative Commons Attribution-ShareAlike 3.0
license. You can read the full text of
About Chris Simmonds
• Consultant and trainer
• Author of Mastering Embedded Linux
Programming
• Working with embedded Linux
Overview
• Android system images: boot, recovery, system,
userdata and cache
• Android "boot blobs"
• Bootloaders for Android
Image files
• A typical build for an Android device produces five
image files in out/target/product/<product>
Image
Description
Typical flash memory layout
Bootloader
Boot kernel + ramdisk
Recovery kernel + ramdisk
/system - read-only file system
/data -
The bootloader
• All systems need a bootloader
• Responsible for:
• Early hardware initialisation
• Load and boot kernel and
Booting Android
• It is possible to boot Android using a normal
bootloader such as U-Boot
• However, most devices include And
The Android bootloader
• Pre JB 4.2, AOSP had source for a simple bootloader
in bootable/bootloader/legacy
• Used in early ha
Android boot and recovery images
• The files boot.img and recovery.img are created by the
tool mkbootimg (the code is in syste

You might also like