Whenever we switched on the system it automatically invokes BIOS, BIOS will check all the connected hardware that they are ready to use and working properly. Once the post is completed the BIOS must determine which devices are candidates for boot. When a boot device is found, the first-stage boot loader is loaded into RAM and executed. This boot loader is 512 bytes in length (a single sector), containing both program code and a small partition table. The first 446 bytes are the primary boot loader, which contains both executable code and error message text. The next sixty-four bytes are the partition table, which contains a record for each of four partitions (sixteen bytes each). The MBR ends with two bytes that are defined as the magic number (0xAA55). The magic number serves as a validation check of the MBR.
The job of the primary boot loader is to find and load the secondary boot loader (stage 2). It does this by looking through the partition table for an active partition. When it finds an active partition, it scans the remaining partitions in the table to ensure that they’re all inactive. When this is verified, the active partition’s boot record is read from the device into RAM and executed.
Stage 2 boot loader
The secondary, or second-stage, boot loader could be more aptly called the kernel loader. The task at this stage is to load the Linux kernel and optional initial RAM disk.
The first- and second-stage boot loaders combined are called Linux Loader (LILO) or GRand Unified Bootloader (GRUB) in the x86 PC environment. Because LILO has some disadvantages that were corrected in GRUB.
The great thing about GRUB is that it includes knowledge of Linux file systems. Instead of using raw sectors on the disk, as LILO does, GRUB can load a Linux kernel from an ext2 or ext3 file system. It does this by making the two-stage boot loader into a three-stage boot loader. Stage 1 (MBR) boots a stage 1.5 boot loader that understands the particular file system containing the Linux kernel image. Examples include
reiserfs_stage1_5(to load from a Reiser journaling file system) or
e2fs_stage1_5(to load from an ext2 or ext3 file system). When the stage 1.5 boot loader is loaded and running, the stage 2 boot loader can be loaded.
With stage 2 loaded, GRUB can, upon request, display a list of available kernels (defined in
/etc/grub.conf, with soft links from
/etc/grub.conf). You can select a kernel and even amend it with additional kernel parameters. Optionally, you can use a command-line shell for greater manual control over the boot process.
With the second-stage boot loader in memory, the file system is consulted, and the default kernel image and
initrdimage are loaded into memory. With the images ready, the stage 2 boot loader invokes the kernel image.
During the boot of the kernel, the initial-RAM disk (
initrd) that was loaded into memory by the stage 2 boot loader is copied into RAM and mounted. This
initrdserves as a temporary root file system in RAM and allows the kernel to fully boot without having to mount any physical disks. Since the necessary modules needed to interface with peripherals can be part of the
initrd, the kernel can be very small, but still support a large number of possible haifrdware configurations. After the kernel is booted, the root file system is pivoted (via
pivot_root) where the
initrdroot file system is unmounted and the real root file system is mounted.
initrdfunction allows you to create a small Linux kernel with drivers compiled as loadable modules. These loadable modules give the kernel the means to access disks and the file systems on those disks, as well as drivers for other hardware assets. Because the root file system is a file system on a disk, the
initrdfunction provides a means of bootstrapping to gain access to the disk and mount the real root file system. In an embedded target without a hard disk, the
initrdcan be the final root file system, or the final root file system can be mounted via the Network File System (NFS).
After this kernel will execute the binary /sbin/init which will become process no 1 and always has a pid of 1, so it is the parent of all process.
Init first run the the /etc/rc.d/rc.sysinit script that mount the /proc file system, set the system time, enable virtual memory activating and mounting the swap partition, sets the host name verify root f/s and if no problem mount it, verify other f/s and mount it as specified in /etc/fstab and execute other system specific tasks.
The init command than runs the /etc/inittab script which describes how the system should be setup in each run level. /etc/inittab sets the default runlevel . Next the init command sets t source function library /etc/rc.d/init.d/functions for the system. This spell out how to start or kill a prog.
The init program start all the background processes by looking in the appropriate rc directory for the run-level specified as default in /etc/inittab
Posted by Nijakat Ali