diff options
Diffstat (limited to 'en/devices/bootloader/partitions-images.html')
-rw-r--r-- | en/devices/bootloader/partitions-images.html | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/en/devices/bootloader/partitions-images.html b/en/devices/bootloader/partitions-images.html new file mode 100644 index 00000000..7f171fef --- /dev/null +++ b/en/devices/bootloader/partitions-images.html @@ -0,0 +1,240 @@ +<html devsite> + <head> + <title>Partitions and Images</title> + <meta name="project_path" value="/_project.yaml" /> + <meta name="book_path" value="/_book.yaml" /> + </head> + <body> + <!-- + Copyright 2017 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + + +<h2 id="partitions">Partitions</h2> +<p> +Android devices include several partitions that serve different functions in the +boot process. To support <a href="/devices/tech/ota/ab/">A/B +updates</a>, the device will need one slot per partition for +<code>boot</code>, <code>system</code>, <code>vendor</code>, and +<code>radio</code>. +</p> +<ul> +<li><strong>boot</strong>: The <code>boot</code> partition contains a kernel +image and a RAM disk combined via <code>mkbootimg</code>. In order to flash the +kernel directly without flashing a new boot partition, a virtual partition can +be used: <ul> + <li><strong>kernel</strong>: The virtual <code>kernel</code> partition +overwrites only the kernel (zImage, zImage-dtb, Image.gz-dtb) by writing the new +image over the old one. To do this, it determines the start location of the +existing kernel image in eMMC and copies to that location, keeping in mind that +the new kernel image may be larger than the existing one. The bootloader can +either make space by moving any data following it or abandoning the operation +with an error. If the development kernel supplied is incompatible, you may need +to update the dtb partition if present, or vendor or system partition with +associated kernel modules. + <li><strong>ramdisk</strong>: The virtual <code>ramdisk</code> partition +overwrites only the RAM disk by writing the new image over the old one. To do +this, it determines the start location of the existing <code>ramdisk.img</code> +in eMMC and copies to that location, keeping in mind that the new RAM disk maybe +be larger than the existing one. The bootloader can either make space by moving +any data following it or abandon the operation with an error.</ul> +<li><strong>system</strong>: The <code>system</code> partition mainly contains +the Android framework. +<li><strong>recovery</strong>: The <code>recovery</code> partition stores the +recovery image, booted during the OTA process. If the device supports <a +href="/devices/tech/ota/ab/">A/B updates</a>, +recovery can be a RAM disk contained in the boot image rather than a separate +image. +<li><strong>cache</strong>: The <code>cache</code> partition stores temporary +data and is optional if a device uses A/B updates. The cache partition doesn't +need to be writable from the bootloader, only erasable. The size depends on the +device type and the availability of space on userdata. Currently 50MB-100MB +should be ok. +<li><strong>misc</strong>: The <code>misc</code> partition is used by recovery +and is 4KB or larger. +<li><strong>userdata</strong>: The <code>userdata</code> partition contains +user-installed applications and data, including customization data. +<li><strong>metadata</strong>: The <code>metadata</code> partition is used when +device is encrypted and is 16MB or larger. +<li><strong>vendor</strong>: The <code>vendor</code> partition contains any +binary that is not distributable to the Android Open Source Project (AOSP). If +there is no proprietary information, this partition may be omitted. +<li><strong>radio</strong>: The <code>radio</code> partition contains the radio +image. This partition is only necessary for devices that include a radio that +have radio-specific software in a dedicated partition. +<li><strong>tos</strong>: The <code>tos</code> partition stores the binary image +of the Trusty OS and is only used if the device includes Trusty.</li> +</li></ul> +<h2 id="flow">Flow</h2> +<p> +Here is how the bootloader operates: +</p><ol> +<li>The bootloader gets loaded first. +<li>The bootloader initializes memory. +<li>If <a href="/devices/bootloader/flashing-updating#a-b-updates">A/B +updates</a> are used, determine the current slot to boot. +<li>Determine whether recovery mode should be booted instead as described in <a +href="/devices/bootloader/flashing-updating#supporting-updates">Supporting +updates</a>. +<li>The bootloader loads the image, which contains the kernel and RAM disk (and +in <a href="/devices/architecture/treble">Treble</a> even more). +<li>The bootloader starts loading the kernel into memory as a self-executable +compressed binary. +<li>The kernel decompresses itself and starts executing into memory. +<li>From there on, older devices load <code>init</code> from the RAM disk and +newer devices load it from the <code>/system</code> partition. +<li>From <code>/system</code>, <code>init</code> launches and starts mounting +all the other partitions, such as <code>/vendor</code>, <code>/oem</code>, and +<code>/odm</code>, and then starts executing code to start the device</li> +</ol> +<h2 id="images">Images</h2> +<p> +The bootloader relies upon these images. +</p> +<h3 id="kernel-images">Kernel images</h3> +<p> +Kernel images are created in a standard Linux format, such as zImage, Image, or +Image.gz. Kernel images can be flashed independently, combined with RAM disk +images, and flashed to the boot partition or booted from memory. When creating +kernel images, concatenated device-tree binaries are recommended over using a +separate partition for the device tree. When using multiple Device Tree Blobs +(DTBs) for different board revisions, concatenate multiple DTBs in descending +order of board revision. +</p> +<h3 id="ram-disk-images">RAM disk images</h3> +<p> +RAM disks should contain a root file system suitable for mounting as a rootfs. +RAM disk images are combined with kernel images using mkbootfs and then flashed +into the boot partition. +</p> +<h3 id="boot-images">Boot images</h3> +<p> +Boot images should contain a kernel and RAM disk combined using an unmodified +<code>mkbootimg</code>. +</p> +<p> +The <code>mkbootimg</code> implementation can be found at: <code><a +href="https://android.googlesource.com/platform/system/core/+/master/mkbootimg">system/core/mkbootimg</a></code> +</p> +<p> +The bootloader reads the <code><a +href="https://android.googlesource.com/platform/system/core/+/master/mkbootimg/bootimg.h">bootimg.h</a></code> +header file generated by mkbootimg and updates the kernel header to contain the +correct location and size of the RAM disk in flash, base address of the kernel, +command line parameters, and more. The bootloader then appends the command line +specified in the boot image to the end of the bootloader-generated command +line. + +<h3 id="file-system-images-system-userdata-recovery">File system images (system, +userdata, recovery)</h3> +<h4 id="sparse-image-format">YAFFS2 image format</h4> +<p> +If using raw NAND storage, these images must be YAFFS2, generated by an unmodified mkyaffs2image, as found in the Android Open Source Project (AOSP) at <a href="https://android.googlesource.com/platform/external/yaffs2/+/master/yaffs2/utils/" class="external"><code>external/yaffs2/yaffs2/utils</code></a>. They have the format: +<pre> +<code> +| 2k bytes of data| yaffs extra data | padding | | 0 2048 | 0 64 | variable| +</code> +</pre> +<p> +The bootloader is responsible for consuming these images and relocating the +yaffs extra data into the appropriate location in the out-of-band area for the +given nand hardware. If software ECC is required, the bootloader should also +do that computation at this time. +</p> +<h4 id="sparse-image-format">Sparse image format</h4> +<p> +The sparse image format should be supported. It is described in the document +"ext4 compressed images" and in <code><a +href="https://android.googlesource.com/platform/system/core/+/master/libsparse/sparse_format.h">system/core/libsparse/sparse_format.h</a></code>; +it is implemented in: <code><a +href="https://android.googlesource.com/platform/system/core/+/master/libsparse/sparse_read.cpp">system/core/libsparse/sparse_read.cpp</a></code> +</p> +<p> +If using a block-based storage device, ext4 or f2fs should be supported. To +quickly transfer and flash large, empty ext4 file systems (userdata), store the +image in a sparse format that contains information about which areas of the file +system can be left unwritten. The file format is written by the +<code>mke2fs</code> utility that is also used to create the images the file +format is read and flashed by the bootloader. See the sections below for +attributes: +</p> +<p> + +<h5 id="file-format">File format</h5> +<ul> +<li>All fields are unsigned little-endian +<li>The file contains a file header, followed by a series of chunks +<li>The file header, chunk header, and chunk data are all multiples of 4 bytes +long</li></ul> +<h5 id="header">Header</h5> +<ul> +<li>32-bit magic: 0xed26ff3a +<li>16-bit major version (0x1) - reject images with higher major versions +<li>16-bit minor version (0x0) - allow images with higher minor versions +<li>16-bit file header size in bytes (28 in v1.0) +<li>16-bit chunk header size in bytes (12 in v1.0) +<li>32-bit block size in bytes, must be multiple of 4 +<li>32-bit total blocks in output file +<li>32-bit total chunks in input file</li></ul> +<p> +32-bit CRC32 checksum of original data, counting "don't care" as 0 Standard +802.3 polynomial, use a public domain table implementation +</p> +<h5 id="chunk">Chunk</h5> +<ul> +<li>16-bit chunk type: + <ul> + <li>0xCAC1 raw + <li>0xCAC2 fill + <li>0xCAC3 don't care + </ul> +<li>16 bits reserved (write as 0, ignore on read) +<li>32-bit chunk size in blocks in output image +<li>32-bit total size in bytes of chunk input file including chunk header and +data</li></ul> +<h5 id="data">Data</h5> +<ul> +<li> for raw, raw data, size in blocks * block size in bytes +<li> for fill, 4 bytes of fill data</li></ul> +<h5 id="implementing-the-writer">Implementing the writer</h5> +<p> +The <code>mke2fs</code> utility already knows what areas of the image need +to be written, and will encode "don't care" chunks between them. Another tool, +<code>img2simg</code>, will convert regular (non-sparse) images to sparse +images. Regular images have no information about "don't care" areas; the best a +conversion can do is look for blocks of repeated data to reduce the resulting +image size. +</p> +<h5 id="implementing-the-reader">Implementing the reader</h5> +<p> +Readers should reject images with unknown major versions and should accept images +with unknown minor versions. Readers may reject images with chunk sizes they do +not support. +</p> +<p> +Once the major version is validated, the reader should ignore chunks with unknown +type fields. It should skip over the chunk in the file using the "chunk size in +file" and skip "chunk size in blocks" blocks on the output. +</p> +<p> +A Cyclic Redundancy Check - 802.3 CRC32 - should be calculated for the data that +will be written to disk. Any area that is not written (don't care, or a skipped +chunk), should be counted as 0s in the CRC. The total number of blocks written +or skipped should be compared against the "total blocks" field in the header. +The tool <code>simg2img</code> will convert the sparse image format to a +standard image, which will lose the sparse information. +</p> +</body> +</html> |