Trustworthy Systems

Linux as a boot loader

Authors

Peter Chubb

NICTA, Sydney, Australia
UNSW, Australia

Abstract

Once upon a time, you could put a floppy disk with the Linux kernel on it into a PC and it would boot.

Nowadays, you have to use a separate program (LILO, GRUB, U-Boot, Blob, LART, RedBoot, etc., etc.) to load Linux, set up some parameters, and then start it running.

When you have new hardware, this sucks. You have to port not one but two programs that have intimate knowledge of the hardware. And you generally have to port USB stacks, Network drivers, etc., to an environment that's only used at boot time.

Linux has a feature, kexecboot, that allows a running kernel to replace itself with another. This has been used in the Zaurus OpenEmbedded port to use Linux as a second-stage bootloader.

So here's the plan: to use Linux with a small carefully-crafted initial ramdisk as a generic bootloader. The advantages should be obvious: port drivers only once; have a feature-rich pre-boot environment; not have to learn yet another low-level programming environment, and be able to boot anything (not just Linux) that you can get into the machine's memory.

We currently have a plan, and a body to work on this. By December, we should have something reasonable for people to play with.

In this talk, we'll go through the problems involved in getting from bare hardware to a running system, (i.e., what a bootloader does) and the challenges and experience of making a small, custom linux system that can boot not just Linux, but other operating systems such as L4 or Windows, and that works on a wide variety of platforms (ARM, X86, M68k, etc).

BibTeX Entry

  @misc{Chubb_12_2,
    address          = {Ballarat},
    author           = {Chubb, Peter},
    booktitle        = {Linux.conf.au},
    month            = jan,
    note             = {Talk at linux.conf.au},
    title            = {Linux as a Boot Loader},
    video            = {http://www.youtube.com/watch?v=pteHg54WBbQ&list=PL506C92D3899A6CDA&index=3},
    year             = {2012}
  }

Download