Three main software components participate in system startup: the bootloader, the kernel, and the init process. The bootloader is the first software to run upon startup and is highly dependent on the target's hardware. As we'll see in Chapter 9, there are many bootloaders available for Linux. The bootloader will conduct low-level hardware initialization and thereafter jump to the kernel's startup code.
The early kernel startup code differs greatly between architectures and will conduct initialization of its own before setting up a proper environment for the running of C code. Once this is done, the kernel jumps to the architecture-independent start_kernel( ) function, which initializes the high-level kernel functionality, mounts the root filesystem, and starts the init process.
I will not cover the details of the kernel's internal startup and initialization, because they have already been covered in detail in Chapter 16 of Linux Device Drivers (O'Reilly). Also, Appendix A of Understanding the Linux Kernel (O'Reilly) provides a lengthy description of the startup of PC-based systems from the initial power-on to the execution of the init process. That discussion covers the kernel's internal startup for the x86.
The rest of the system startup is conducted in user space by the init program found on the root filesystem. We will discuss the setup and configuration of the init process in Chapter 6.