blob: 85852dd969d7ce6e98dc71b4475298ae956066cc [file] [log] [blame] [view]
# zbi
This library contains the definitions for the Zircon Boot Image (ZBI) format.
A Zircon Boot Image consists of a container header followed by boot items.
Each boot item has a header (zbi_header_t) and then a payload of
`zbi_header_t.length bytes`, which can be any size. `The zbi_header_t.type`
field indicates how to interpret the payload. Many types specify an additional
type-specific header that begins a variable-sized payload.
`zbi_header_t.length` does not include the `zbi_header_t` itself, but does
include any type-specific headers as part of the payload. All fields in all
header formats are little-endian.
Padding bytes appear after each item as needed to align the payload size up to
a `ZBI_ALIGNMENT` (8-byte) boundary. This padding is not reflected in the
`zbi_header_t.length` value.
A bootable ZBI can be booted by a Zircon-compatible boot loader. It contains one
`ZBI_TYPE_KERNEL_{ARCH}` boot item that must come first, followed by any number
of additional boot items whose number, types, and details much comport with that
kernel's expectations.
A partial ZBI cannot be booted, and is only used during the build process. It
contains one or more boot items and can be combined with a kernel and other
ZBIs to make a bootable ZBI.
ZBI_TYPE_STORAGE_* types represent an image that might otherwise appear on some
block storage device, i.e. a RAM disk of some sort. All zbi_header_t fields
have the same meanings for all these types. The interpretation of the payload
(after possible decompression) is indicated by the specific `zbi_header_t.type`
value.
**Note:** The ZBI_TYPE_STORAGE_* types are not a long-term stable ABI.
- Items of these types are always packed for a specific version of the
kernel and userland boot services, often in the same build that compiles
the kernel.
- These item types are **not** expected to be synthesized or
examined by boot loaders.
- New versions of the `zbi` tool will usually retain the ability to
read old formats and non-default switches to write old formats, for
diagnostic use.
## Maintenance & Evolution
### ABI Stability
The ZBI definitions form the contract between a bootloader and the kernel so
must remain ABI backwards-compatible. Failure to do so would result in undefined
behavior when devices update their kernel to the new ABI but their bootloader
still uses the old ABI (or vice-versa).
It is generally infeasible to update all bootloaders and kernels to a new ABI in
lockstep, not only due to the proliferation of boards running Fuchsia, but also
because many boards do not support firmware A/B/R without which it is impossible
to guarantee atomic updates to both the bootloader and kernel.
### API Stability
API stability is not required. These definitions are not exported to Fuchsia
application developers so will not break any out-of-tree builds if e.g. a
constant name is updated.
They are exported in the Firmware SDK for firmware developers, but firmware
does not expect to automatically roll new SDK builds; any uprev to a new SDK
is an intentional action that expects some porting work.