GPU turns on when power is applied to Raspberry Pi and ARM CPU is held in reset.
GPU runs the on-chip ROM bootloader; loads first stage bootloader in L2 cache memory.
First Stage Bootloader:
bootcode.bin stored in SD card is the first stage bootloader. bootcode.bin can be compared to UBL bootloader whose primary purpose is to initialize the RAM memory; load and execute 2nd bootloader in RAM. In this case it is start.elf
start.elf is the full fledge operating system for GPU. start.elf loads the “Kernel” in RAM memory along with other configuration parameters from various files (config.txt / cmdline.txt / *.dtb ) and releases the Reset signal on ARM.
Note: kernel.img is the first code executed on ARM, all system initialization and configuration prior to that is performed by GPU.
kernel.img can be any custom program for ARM. It can be simple LED program in assembly to full Linux operating system.
kernel_address is the memory address into which the kernel image is loaded. 32-bit kernels are loaded to address 0x8000 by default, and 64-bit kernels to address 0x80000. If kernel_old is set in “config.txt”, kernels are loaded to the address 0x0.
RAM memory is shared between CPU and GPU. GPU_MEM parameter in “config.txt” file is used to set the RAM memory for GPU. More details at: Memory Options
Device Tree (DT) is used to manage some resource allocation and module loading in firmware. start.elf loader passes Device Tree Blob (DTB) to Kernel to help in initialization of system.
start.elf combines overlays with an appropriate base device tree, and then to pass a fully resolved Device Tree to the Kernel. The base Device Trees are located alongside start.elf in the FAT partition (/boot from Linux).