The raspberry has an unchangeable firmware into the SoC (System on Chip). This SoC has been designed by Broadcom and in the case of the Raspberry Pi B+ is the BCM2835. This BCM2835 has a CPU ARM 1176JZF-S at 700Mhz, and a GPU Broadcom VideoCore IV, a DSP and an SDRAM memory of 512MiB shared with the GPU and USB controller. Broadcom has integrated the firmware in the boot, but it's not open source.
1. When the raspberry Pi is initialized the first time, the ARM core is OFF and the GPU core is ON. Int his point the SDARM is disabled.
2. The GPU start the first step of the bootloader, which is stored in the ROM's SoC. This first step of the bootloader is in charge of mounting the FAT32 partition, reading the SD card and loading the second step of the bootloader bootcode.bin into the L2 cache to run it. This task is scheduled by SoC and it can not be modified.
3. Once executed the bootcode.bin, this prepares and init the GPU firmware start.elf.
4. The GPU firmware start.elf initializes the ARM core and the file fixup.dat makes the necessary partition in the SDRAM, in charge of distributing memory resources between the CPU and the GPU.
5. Finally, the Linux kernel in executed.
The firmware that is stored in a ROM within the SoC, is scheduled to start bootcode.bin from SD card, is why not being able to modify, the Raspberry Pi can not boot from another medium other than the memory card.
Another feature that we can observe is that it starts beginning with the GPU and not the CPU, as in a normal PC. The GPU Raspberry Pi runs a very simple "operating system" that needs to function and is called VCOS (Video Core Operating System) and it communicates with Linux. It is rare, but it is so in fact not only the GPU handles graphics and initiate, but also controls the system clock and audio.
At first it may seem that being closed we can not do anything to set the start, but it is not. A config.txt file is read by the GPU after starting the ARM core, it some configurations or instructions that the SoC will continue during startup and which of course can be modified (dedicated memory, memory refresh, disable are the access to L2 cache, touch the CMA settings, enable or disable the LED of the camera, change the video mode settings, codecs, overclocking, boot options, ...).
Interesting links: