The boot loader is the program invoked by the BIOS to load the image of an operating system kernel into RAM. Let’s briefly sketch how boot loaders work in IBM’s PC architecture.
To boot from a floppy disk, the instructions stored in its first sector are loaded in RAM and executed; these instructions copy all the remaining sectors containing the kernel image into RAM.
Booting from a hard disk is done differently. The first sector of the hard disk, named the Master Boot Record (MBR), includes the partition table[138] and a small program, which loads the first sector of the partition containing the operating system to be started. Some operating systems, such as Microsoft Windows 98, identify this partition by means of an active flag included in the partition table;[139] following this approach, only the operating system whose kernel image is stored in the active partition can be booted. As we shall see later, Linux is more flexible because it replaces the rudimentary program included in the MBR with a sophisticated program such as LILO or GRand Unified Bootloader (GRUB) that allows users to select the operating system to be booted.
The only way to store a Linux kernel on a single floppy disk is to compress the kernel image. As we shall see, compression is done at compile time and decompression is done by the loader.
If the Linux kernel is loaded from a floppy disk, the boot loader is
quite simple. It is coded in the
arch/i386/boot/bootsect.S
assembly language
file. When a new kernel image is produced by compiling the kernel
source, the executable code yielded by this assembly language file is
placed at the beginning of the kernel image file. Thus, it is very
easy to produce a bootable floppy by copying the Linux kernel image
to the floppy disk starting from the first sector of the disk. When
the BIOS loads the first sector of the floppy disk into memory, it
actually copies the code of the boot loader.
The boot loader, which is invoked by the BIOS by jumping to physical
address 0x00007c00
, performs the following
operations:
Moves itself from address 0x00007c00
to address
0x00090000
.
Sets up the Real Mode stack from address
0x00003ff4
. As usual, the stack grows toward lower
addresses.
Sets up the disk parameter table, used by the BIOS to handle the floppy device driver.
Invokes a BIOS procedure to display a “Loading” message.
Invokes a BIOS procedure to load the setup( )
code
of the kernel image from the floppy disk and puts it in RAM starting
from address 0x00090200
.
Invokes a BIOS procedure to load the rest of the kernel image from
the floppy disk and puts the image in RAM starting from either low
address 0x00010000
(for small kernel images
compiled with make zImage
) or high address
0x00100000
(for big kernel images compiled with
make
bzImage
). In the following
discussion, we say that the kernel image is “loaded
low” or “loaded
high” in RAM, respectively. Support for big kernel
images uses essentially the same booting scheme as the other one, but
it places data in different physical memory addresses to avoid
problems with the ISA hole mentioned in Section 2.5.3.
Jumps to the setup( )
code.
In most cases, the Linux kernel is loaded from a hard disk, and a two-stage boot loader is required. The most commonly used Linux boot loader on 80 × 86 systems is named LInux LOader (LILO); corresponding programs exist for other architectures. LILO may be installed either on the MBR (replacing the small program that loads the boot sector of the active partition) or in the boot sector of a (usually active) disk partition. In both cases, the final result is the same: when the loader is executed at boot time, the user may choose which operating system to load.
The LILO boot loader is broken into two parts, since otherwise it is
too large to fit into the MBR. The MBR or the partition boot sector
includes a small boot loader, which is loaded into RAM starting from
address 0x00007c00
by the BIOS. This small program
moves itself to the address 0x0009a000
, sets up
the Real Mode stack (ranging from 0x0009b000
to
0x0009a200
), and loads the second part of the LILO
boot loader into RAM starting from address
0x0009b000
. In turn, this latter program reads a
map of available operating systems from disk and offers the user a
prompt so she can choose one of them. Finally, after the user has
chosen the kernel to be loaded (or let a time-out elapse so that LILO
chooses a default), the boot loader may either copy the boot sector
of the corresponding partition into RAM and execute it or directly
copy the kernel image into RAM.
Assuming that a Linux kernel image must be booted, the LILO boot
loader, which relies on BIOS routines, performs essentially the same
operations as the boot loader integrated into the kernel image
described in the previous section about floppy disks. The loader
displays the “Loading Linux”
message; then it copies the integrated boot loader of the kernel
image to address 0x00090000
, the setup( )
code to address 0x00090200
, and the
rest of the kernel image to address 0x00010000
or
0x00100000
. Then it jumps to the setup( )
code.
18.220.148.149