Bootloader: Difference between revisions
[unchecked revision] | [unchecked revision] |
Content deleted Content added
ported Rolling your own bootloader |
No edit summary |
||
(31 intermediate revisions by 18 users not shown) | |||
Line 1:
A bootloader is a program written to load a more complex [[Kernels|kernel]]. Implementation details are gathered in [[Rolling Your Own Bootloader]]
== What does a
The
* Bring the kernel (and all the kernel needs to bootstrap)
* Provide the kernel with the information it needs to work correctly
* Switch to an environment that the kernel will like
* Transfer control to the kernel
On the x86, the
=== Loading your kernel ===
The bits of your kernel are somewhere on some disk (presumably the booting disk, but this is not mandatory). Question is: where on the disk
All the above options are possible. Maybe the one
What needs to be loaded mainly depends on what's in your kernel. Linux, for instance, requires an
▲The bits of your kernel are somewhere on some disk (presumably the booting disk, but this is not mandatory). Question is: where on the disk ? Is it a regular file on a [[FAT|FAT-formatted]] floppy ? is it a collection of consecutive sectors in the "reserved area" of the FAT12 floppy (in which case you may need a dedicated tool to format the disk and install the kernel on it) ? Or is the floppy simply left unformatted and kernel pasted directly with a disk image tool
▲All the above options are possible. Maybe the one i'd choose myself would be to reserve enough space on a FAT12 floppy to store the list of sectors used by the kernel file. The "advantage" of being fully-FAT12 is that you don't need to re-write the bootsector everytime you rewrite the kernel.
▲What needs to be loaded mainly depends on what's in your kernel. Linux, for instance, requires an additionnal 'initrd' file that will contain the 'initialization process' (as user level). If your kernel is modular and if Filesystems are understood by some modules, you need to load the modules along with the kernel. Same goes for 'microkernel services' like disk/files/memory services, etc.
=== Giving the kernel its information ===
Some kernels require some extra information to run. For example,
In general, anything that involves a BIOS call
=== Establishing an environment ===
Most kernels require protected mode. For these kernels you'll have to
* Enable [[A20 Line|A20]]
* Load a [[GDT]]
* Enter [[Protected mode]]
Line 53 ⟶ 32:
It's common for the loader to keep interrupts disabled (the kernel will enable them later when an IDT is properly set up).
''Note:
== Bootloader design ==
Line 60 ⟶ 39:
=== Single Stage Bootloader ===
A single stage bootloader consists of a single file that is loaded entirely by the BIOS. This image then performs the steps described above to start the kernel.
However, on the x86 you are usually limited to 512 bytes for a first stage (An exception is no-emulation [[El
=== Two-Stage Bootloader ===
Line 71 ⟶ 50:
== Booting multiple OSes ==
The easiest way to boot another OS is a mechanism called chainloading. Windows stores something akin to a second-stage bootloader in the boot sector of the partition it was installed in. When installing Linux, writing e.g. LILO or GRUB to the partition boot sector instead of the MBR is also an option. Now, the thing your MBR bootsector can do is to relocate itself (copying from
You see that with
Taken to the extreme, bootmanagers like that can become as complex as a simple OS, [[GRUB]] being a good example: It offers reading from various filesystems, booting [[Multiboot]] kernels, chainloading, loading
== See Also ==
=== Articles ===
* [[BootProg]] is able to load COM/MZ programs from a FAT12/16/32-formatted media
* [[Bootf]] is a small FAT12 floppy bootloader for protected mode OS images
* [[Gujin]] is a GPLed bootloader for the PC
* [[GRUB]] is a huge, bloated Grand Unified Bootloader, used by many OSes
* [[BOOTBOOT]] for booting 64 bit kernels on BIOS, UEFI, El Torito CDROM etc.
* [[Limine]] is a bootloader capable of natively booting 64-bit kernels and Linux
* [[SysLinux]] is the Linux kernel loader
* [[Rolling Your Own Bootloader]]
=== Threads ===
=== External Links ===
▲You see that with diplaying a menu in some intelligible way and accepting keystrokes, such a multi-option bootloader can get quite complex rather quickly. We didn't even touch the subject of booting from extended partitions, which would require sequentially reading and parsing multiple extended partition tables before printing the menu.
* [http://viralpatel.net/taj/tutorial/hello_world_bootloader.php Writing Hello World Bootloader] ([http://web.archive.org/web/20140729084135/http://viralpatel.net/taj/tutorial/hello_world_bootloader.php Cached version])
* [http://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdf "Writing a Bootloader from Scratch"] from Carnegie Mellon Computer Science Department
[[Category:OS theory]]
▲Taken to the extreme, bootmanagers like that can become as complex as a simple OS, [[GRUB]] being a good example: It offers reading from various filesystems, booting [[Multiboot]] kernels, chainloading, loading initrd [[Ramdisk|ramdisks]] etc. etc.
[[Category:Booting]]
[[Category:Bootloaders]]
[[de:Bootloader]]
|