Create your own
Lesson illustration

ARM Boot Flow: Artifact and Address Mapping from ROM to PID 1

Welcome. This module moves from the bootable minimal systems you will build later into the machinery that makes an ARM Linux platform reachable at all. The immediate objective is not to memorize a vendor-specific boot sequence. It is to learn to create two debugging artifacts that remain useful across boards:

  1. a boot-artifact map, showing which binary or filesystem component owns each stage of execution; and
  2. an address map, showing where each component is stored, loaded, executed, and handed off.

For an automotive or industrial gateway, these maps are foundational engineering evidence. They prevent a common class of bring-up failures: a boot artifact may be valid by itself, yet fail because it was loaded at the wrong address, overwrote a live component, was paired with the wrong DTB, or led Linux to the wrong root filesystem.


Think in artifacts, not simply “the bootloader”

A Linux boot is not one program calling another in the ordinary application sense. Each stage establishes just enough hardware and memory state for a later stage, then transfers control. The earlier stage is often no longer usable after that transfer, and its RAM can sometimes be reused.

At a high level, a conventional ARM Linux boot contains these responsibilities:

StageTypical ownerMain responsibilityWhy the next stage is needed
Boot ROMSoC vendor, immutable silicon ROMSamples boot configuration, selects a boot source, loads an initial artifact, and may authenticate itROM is deliberately small and cannot contain board-specific DRAM training, storage policy, or interactive recovery features
TPL, if presentBoard bootloader buildPerforms the absolute minimum initialization when SRAM constraints are extremeMakes room for an SPL-sized stage
SPLUsually a reduced U-Boot buildInitializes clocks, pin multiplexing, PMIC interfaces, and external DRAM; loads larger firmwareIt is small enough to run before normal DRAM is available
U-Boot ProperFull U-BootInitializes richer peripherals, interprets boot policy, loads kernel artifacts, and can offer a consoleIt has enough space for drivers, filesystems, networking, scripts, and diagnostics
Linux kernelLinuxEstablishes kernel virtual memory, drivers, scheduling, VFS, and mounts a root filesystemKernel initialization creates the environment in which user processes can run
PID 1/sbin/init, BusyBox init, or systemdStarts userspace services and establishes the operational systemThis becomes the top-level userspace supervisor

TPL is optional. It appears on platforms where even the normal SPL does not fit in usable on-chip SRAM or where a vendor’s boot design needs an additional miniature stage. Do not add it to a map merely because U-Boot supports it. Record it only if the board’s actual boot artifacts include it.

The architecture becomes more interesting on multicore SoCs such as TI K3 AM62x. One processor domain can provide security, power, clock, and resource-management services while the Cortex-A53 cluster ultimately runs U-Boot and Linux. Therefore, a good map identifies which processor executes each artifact, not only the artifact filename.

Embedded Linux Booting Process (Multi-Stage Bootloaders, Kernel, Filesystem)

Watch “Embedded Linux Booting Process (Multi-Stage Bootloaders, Kernel, Filesystem)” from Pentester Academy TV for a concise generic model of the handoffs. The example uses AM335x rather than AM62x, but the distinction among ROM, a DRAM-initializing first-stage loader, U-Boot, kernel, root filesystem, and init is directly transferable.

Watch the full sequence. Focus on the reason an SRAM-resident first-stage loader is necessary: the ROM cannot normally load a full bootloader into DRAM until some board-specific software has initialized the DRAM controller. Treat the exact artifact name “MLO” as platform-specific; the staged responsibility is the important part.

A useful discipline is to separate four ideas that documentation often conflates under the word address:

Address or locationMeaningExample question
Storage locationPersistent location on SD, eMMC, OSPI NOR, NAND, or network serverWhich partition, filename, or flash offset contains tispl.bin?
Load addressRAM destination selected while copying an artifact from storageWhere does U-Boot place the DTB before launching Linux?
Entry addressAddress at which a CPU begins executing an imageWhich address does the handoff jump to after a successful load?
Runtime addressAddress used while code is executing, sometimes after relocation or virtual-memory translationWhere does relocated U-Boot execute? At what virtual address does Linux run?

These may coincide, but they do not have to. In particular:

  • U-Boot Proper may be loaded at one physical address and relocate itself before operating normally.
  • The kernel image may be loaded to one physical region, then establish page tables and execute in a kernel virtual-address region.
  • A FIT image is a container held in RAM; its kernel, DTB, and optional initramfs members have their own metadata and effective placements.
  • A block root filesystem normally has a storage location, but it is not copied as one contiguous RAM object. The kernel mounts it and reads file pages as needed.
  • An initramfs is different: it is supplied as an archive in memory, then unpacked by the kernel into an in-memory root filesystem.

The AM62x example: processors, firmware, and named boot artifacts

The following AM62x diagram is useful because it shows that boot is coordinated across processor domains. The security-management subsystem begins with Secure ROM; TI Foundational Security firmware provides critical services; the R5 device-management domain participates in loading and system control; and the A53 cluster reaches TF-A, SPL, U-Boot, and finally Linux.

AM62x boot coordination across the M4 security-management subsystem, R5 device-management processor, and Cortex-A53 application cores. The diagram emphasizes that TIFS provides security and system services while the A53 path ultimately runs SPL, U-Boot, and Linux.

On the AM62x platform, three externally visible boot files are central to the normal TI U-Boot flow:

  • tiboot3.bin
  • tispl.bin
  • u-boot.img

Those filenames are not generic U-Boot names. They describe a TI K3 packaging and staging design. A map that writes only “SPL” and “U-Boot” loses important information, because it cannot tell an engineer which file to inspect, replace, sign, or locate on the boot medium.

AM62 Platforms — Das U-Boot unknown version documentation

Read the AM62 platform documentation from Das U-Boot to connect the generic multi-stage model to TI’s actual artifact names, processor roles, and an A53 SPL DDR layout.

First, in “Boot Flow,” read the TIFS role. Note that security, power, clock, interrupt, DMA, and resource management are not all performed by the A53 application cores. Next, in “Target Images,” read the artifact list. Notice the distinction among GP, HS-FS, and HS-SE device variants; secure-device packaging is not interchangeable with general-purpose-device packaging. Finally, find “A53 SPL DDR Memory Layout” and study the SPL layout. Read the table row by row, especially the separation among SPL text, stack, global data, malloc region, BSS, and blobs. Then read the start of “Switch Setting for Boot Mode” to connect boot-mode pins and power-on reset with the first storage source selected by ROM.

A practical AM62x boot-artifact map

The table below is a reasoning map, not a flash layout that should be copied blindly onto a board. It tracks ownership and handoff responsibilities. Exact packaging differs with device lifecycle, boot medium, SDK release, secure-boot configuration, and whether features such as OP-TEE are enabled.

Boot phasePersistent artifact or resident firmwareExecuting processor domainTypical working memoryMain action and handoff
Reset and bootstrapOn-chip Boot ROMSecurity-management domainImmutable ROM plus limited internal memorySamples boot-mode configuration, establishes minimal state, selects a boot source, and obtains the first vendor-defined boot artifact
Security and device managementTIFS and device-management firmwareSecurity enclave and device-management MCU domainProtected or MCU-local memoryProvides security, clock, power, resource, and device-management services requested by later software
First mutable boot artifacttiboot3.binTypically the K3 R5 boot pathR5-accessible execution memoryContinues early platform bring-up and obtains the next packaged stage
A53 early loadertispl.bin, containing the relevant A53 SPL and associated firmware payloadsCortex-A53Initially constrained execution context, then DDR after initializationPerforms the A53-side low-level work required before full U-Boot can operate
Secure monitor, when usedTF-A, commonly its BL31 componentCortex-A53 at EL3Reserved secure/runtime regionEstablishes secure-monitor behavior and coordinates transition to secure-world and non-secure-world software
Secure OS, when usedOP-TEE, commonly BL32Cortex-A53 secure worldReserved secure DRAMProvides Trusted Execution Environment services while Linux runs non-securely
Full boot manageru-boot.imgCortex-A53 non-secure worldDDR, often after self-relocationSelects boot targets, loads Linux boot artifacts, sets boot arguments, and transfers control to the kernel
Linux boot setImage, DTB, optionally initramfs; often bundled as fitImageCortex-A53 non-secure worldDDR load regions specified by U-Boot and image metadataKernel receives the DTB and optional initramfs, initializes the OS, and mounts its root filesystem
Operational userspaceRoot filesystem plus its /sbin/init or equivalentLinux-scheduled processes on A53Kernel-managed page cache and user virtual memoryKernel starts PID 1, which starts the product’s service model

Two distinctions in this table matter for later secure-boot and OTA design:

  1. A filename is not necessarily an execution image. tispl.bin, for example, is a boot package that can contain several components needed at that stage.
  2. The boot medium is not necessarily the root filesystem. A board may load early artifacts from an eMMC boot partition but mount its root filesystem from the eMMC user area, NVMe, SD card, or network storage. An A/B update design later makes these choices explicit.

Building the address map without creating false confidence

An address map is not a list of hexadecimal numbers. It is a claim about which memory ranges are simultaneously occupied. To make that claim safely, record each artifact’s:

  • storage source;
  • physical load address;
  • entry address;
  • expected size;
  • whether it remains resident after handoff;
  • relocation destination, if applicable;
  • reserved-memory or secure-memory constraints;
  • lifetime during the boot sequence.

Represent a memory region for artifact as:

where is its physical start address and is its loaded size. For two artifacts that must coexist in RAM, the required condition is:

A map that contains only start addresses cannot establish this condition. A kernel loaded at a seemingly sensible address can still overwrite a DTB, an initramfs, OP-TEE, U-Boot’s relocation region, or a DMA buffer if its actual size is not considered.

AM62x reference addresses and their limits

TI’s AM62x documentation provides a valuable set of default load locations. They are configuration data, not an architectural guarantee for every board:

Component documented by TIDefault load locationInterpretation for your map
TF-A image0x70000000Record as a protected/resident firmware region in the applicable configuration
OP-TEE image0x9e800000Treat as reserved secure-world memory; Linux and U-Boot payload placement must respect it
U-Boot or Linux image0x80080000A documented default input/load base whose actual owner depends on boot phase and configuration
DTB0x82000000A documented DTB placement that must be checked against kernel size and other simultaneous objects

3.10. ARM Trusted Firmware-A — Processor SDK AM62x Documentation

Read TI’s TF-A overview to understand why TF-A is a resident EL3 component rather than merely another file loaded by U-Boot, then use its default-address table as source material for an address map.

In “Overview,” read the TF-A handoff description. Then locate the “Default load locations” table immediately below the build headings. Copy the four addresses into your own map, but annotate each with the SDK release, board configuration, and source document rather than treating it as a universal AM62x memory map.

There is an intentional-looking tension in the supplied documentation: the AM62x A53 SPL layout places SPL text at 0x80080000, while the TF-A documentation lists 0x80080000 as the default U-Boot/Linux image location. This is precisely why a temporal boot map is essential.

These uses can be valid if they occur in different lifetimes. SPL text can occupy a region during the early DDR-init phase, then later be overwritten after it has handed control to a stage that no longer needs the SPL code. They would be invalid if both artifacts had to remain alive there simultaneously.

The A53 SPL layout is more detailed than a typical high-level boot diagram:

A53 SPL DDR regionAddress rangeWhy it belongs in the address map
Empty lower region0x80000000 to 0x80080000Shows the boundary before SPL text
SPL text0x80080000 to 0x800d8000Code currently executing in this phase
Bitmap image area0x80200000 to 0x80b77660Demonstrates that non-code payloads may reserve significant RAM
Stack0x80b77660 to 0x80b77e60Must never be overwritten during SPL execution
Global data0x80b77e60 to 0x80b78000Holds U-Boot SPL state
SPL malloc area0x80b78000 to 0x80b80000Temporary allocator region
BSS0x80c80000 to 0x80d00000Zero-initialized SPL data
Blobs0x80d00000 to 0x80d00400Small payload region recorded by the platform layout

The listed layout has gaps. Do not assume every gap is automatically safe for a kernel, DTB, or initramfs. Some may be reserved by the board configuration, display handoff, firmware, U-Boot relocation policy, device tree reserved-memory nodes, or an updated SDK.


A complete map for a normal Linux boot

The following format is suitable for a design document, bring-up notebook, or repository artifact. The entries shown as discover from board build must come from your particular U-Boot configuration, FIT image, generated DTB, and serial log.

ItemStorage locationPhysical load / execution locationLifetimeEvidence to record
Boot ROMOn-chip immutable ROMSoC-defined ROM address spaceFrom reset until first transferSoC technical reference manual and boot-mode configuration
tiboot3.binROM-selected boot device locationDevice-specific R5 execution contextEarly bootBoot medium layout, ROM log, TI image-build output
TIFSPackaged by TI boot flowSecurity enclave memoryRemains active while platform runsFirmware version, boot log, vendor documentation
Device-management firmwarePackaged stage, configuration-dependentR5 or dedicated management MCU memoryTypically remains activeFirmware version and platform boot diagram
A53 SPL in tispl.binBoot medium file or offsetEarly A53 DDR/SRAM layoutUntil it loads full U-BootSPL linker configuration and boot log
TF-APackaged with A53 boot artifactsDefault reference: 0x70000000Resident EL3 monitorTF-A build configuration and reserved-memory entries
OP-TEE, if enabledPackaged with A53 boot artifactsDefault reference: 0x9e800000Resident secure OSOP-TEE configuration and DTB reserved memory
U-Boot Properu-boot.imgLoad address plus later relocation addressActive until kernel transfer; may leave data reservedU-Boot bdinfo, linker configuration, serial log
Kernel Image or FIT memberFAT/ext4 boot partition, flash area, TFTP, or other boot targetU-Boot-selected RAM address; then kernel runtime mappingsKernel survives for system lifetimeFIT metadata, U-Boot environment, boot log
Board DTBSeparate file or FIT memberU-Boot-selected RAM address; TI reference default 0x82000000Must remain accessible through early kernel parsingFIT metadata, U-Boot environment, /proc/device-tree
Initramfs, if usedEmbedded in kernel or supplied separately/FIT memberRAM archive, later unpackedEarly root filesystem phase; may be discarded after switch_rootFIT metadata, kernel command line, boot log
Root filesystemBlock partition, network root, or initramfsNo fixed whole-filesystem RAM address for block-backed rootfsMounted through VFSKernel root= arguments, /etc/fstab, mount output
PID 1 executableRoot filesystem or initramfsLinux user virtual memoryProcess lifetime, normally until shutdownps, service manager logs, rootfs contents

The kernel handoff boundary

By the time U-Boot transfers control to Linux, it must have selected a compatible combination of:

  • a kernel image;
  • a DTB matching the actual board and enabled hardware;
  • an optional initramfs;
  • kernel command-line arguments;
  • a root filesystem source, unless the initramfs itself is the intended root.

For ARM64, the essential conceptual handoff is that the kernel receives the physical address of the flattened device tree in register x0. The DTB is not just an inventory of peripherals. It also commonly carries /chosen/bootargs, memory descriptions, reserved-memory regions, and references that determine which hardware drivers can safely initialize.

A mismatch can produce distinctive failures:

SymptomLikely mapping or handoff issue
U-Boot resets or hangs immediately after loading an imageLoad address overwrote U-Boot’s live stack, relocation area, or another required firmware object
Kernel starts but stops before console outputIncorrect console configuration, bad DTB, or early memory conflict
Kernel reports an inaccessible root deviceWrong root= argument, missing storage driver, incorrect DTB, or invalid partition reference
No working init foundRootfs mounted but lacks a valid init program, its dynamic loader, or required libraries
Kernel boots but a peripheral is absentWrong DTB, missing pinctrl/clock/interrupt data, or a U-Boot DTB modification issue
Secure-world or firmware failure during early bootA protected region was overwritten, or firmware packaging and addresses disagree

A FIT image helps keep compatible artifacts together. It can package a kernel, one or more DTBs, an initramfs, hashes, and signatures. However, it does not eliminate address planning. The FIT itself occupies RAM while U-Boot inspects it, and its component metadata must still be consistent with reserved regions and the boot command used.


How to validate the map on real hardware

When you begin using the AM62x board, treat serial output as primary evidence. Copy the complete power-on boot log into the private implementation repository and extract only non-sensitive, sanitized excerpts for the public showcase.

At the U-Boot prompt, the most useful evidence will usually include:

bdinfo
env print bootcmd bootargs
env print loadaddr fdtaddr fdt_addr_r kernel_addr_r ramdisk_addr_r

Variable names differ among U-Boot configurations. The purpose is not to expect every variable above, but to discover the addresses and boot policy that the installed configuration actually uses.

For a FIT-based boot flow, U-Boot commands such as iminfo can expose image metadata. For a separate DTB, U-Boot’s fdt commands can identify the DTB currently selected in RAM. Later, once Linux reaches userspace, these commands help close the evidence chain:

cat /proc/cmdline
mount
ps -p 1 -o pid,comm,args
dmesg

Together, these answers establish:

  • what command line the kernel received;
  • which root filesystem actually mounted;
  • what program became PID 1;
  • whether the kernel detected the intended memory, storage, and device-tree configuration.

For the portfolio repository, a strong public artifact is a sanitized docs/boot-artifact-map.md containing:

  • a stage-and-responsibility table;
  • a memory map with documented source references;
  • a boot-media layout diagram without credentials or signing material;
  • sanitized serial-log excerpts;
  • assumptions and configuration revision identifiers.

Keep exact production flash offsets, signing configuration, certificates, key identifiers, and provisioning notes in the private repository. The public version should demonstrate the method and the engineering decisions without disclosing security-sensitive implementation details.


Key takeaways

A reliable ARM boot map records more than a familiar sequence of names:

  • Boot ROM is immutable, boot-source aware, and constrained; it starts the mutable boot chain but does not replace it.
  • TPL and SPL exist to solve the pre-DRAM problem. On AM62x, the staged flow spans security, R5/device-management, and A53 domains.
  • The AM62x normal boot artifacts are named tiboot3.bin, tispl.bin, and u-boot.img; these names should appear in a board-specific map.
  • Storage offsets, load addresses, entry addresses, and runtime addresses are different facts.
  • Address safety depends on both range size and lifetime. Reusing an address can be legitimate after handoff, but overlapping live regions is a boot failure.
  • A block root filesystem is mounted, not loaded as one RAM binary; the kernel starts PID 1 from that filesystem or from an initramfs-based root.
  • Serial logs, U-Boot environment data, FIT metadata, linker settings, DTB reserved-memory nodes, and Linux runtime evidence together turn a diagram into an auditable map.

Next, you will move inside the bootloader itself: locating temporary stack setup, board_init_f, DDR initialization, relocation, and board_init_r in U-Boot startup code.

Can't find a good explanation? Sign up and we'll make it for you

Sign up