Bootstrap System for i386
Boot modules:
The new Mach boot mechanism introduces the concept of "boot modules".
Basically, any number of "boot modules" can be thrown together to create
a single boot image. That boot image is what LILO or whatever loads,
and when the system starts up, all of the boot modules will be already
in memory and immediately available. At least one of those modules is the
microkernel itself; others may be device drivers, other kernel modules,
user-level servers (e.g. the bootstrap code), etc. Currently only the
kernel itself and the single server bootstrap program go into the boot
image, but that'll probably change soon. I'd like to be able to get rid
of the server bootstrap code entirely, and simply embed the appropriate
server(s) directly into the boot image: for example, the LITES, or the
basic Hurd administration servers (exec, proc, etc.) and a file server
for the root filesystem. Eventually it should be possible (though optional)
to throw an entire root filesystem snapshot into the boot image, so upon
startup you can get a Unix shell and a minimal set of utilities without
depending on the successful initialization of any devices other than
the console.
The exact structure of a boot module and a boot image is by nature somewhat
system-dependent. On the i386, a boot module is a relocatable object file
created with the `mkbmod' script. A boot module must contain no external
references (all externs must be resolved), and usually must have all
symbols stripped, leaving only relocations to be fixed up. To facilitate
debugging of boot modules, _one_ boot module in a boot image may be left
unstripped; you can tell `mkbmod' to leave a boot module unstripped by giving
it the `-no-strip' option.
Creating boot modules:
The `mkbmod' program assumes when it creates boot modules that certain
entry points exist in the object. It links a bootmodule specific
runtime that calls the routine `mach_bmod_init' at boot
time. (Actually, the kernel calls this routine by following pointers
stored in the boot module header.) This init routine returns
information about the object file that `kernel/kern/bootstrap.c' uses
to execute the module in a thread.
Encapsulating user-level programs in boot modules:
The `mkubmod' command takes a more conventionally linked program (a
linked executable) and adds this `mach_bmod_init' routine to it. This allows
the kernel to load some arbitrary linked executable into a user-level Mach task
and start it running before any personality servers are available.
The executable you give to `mkubmod' can be in any of the standard i386 a.out
variants that Mach understands, including:
- CMU Mach/UX ZMAGIC
- NetBSD ZMAGIC
- Linux ZMAGIC
- FreeBSD QMAGIC
Once your program is compiled and linked, use mkubmod to embed it in a
bmod object and you can add it to your larger boot image.
Boot images:
A boot image is simply a set of boot modules glued together with the
`mkbootimage' script, with some extra header/trailer code linked in with it
(see mach4-i386/boot/bootimage_*), with all relocations fixed, and with
a LILO-compatible boot sector and setup program tacked onto the front.
Boot module installation:
All boot modules created, along with the auxiliary stuff needed to create
boot images, gets thrown into the directory /lib/mach-boot.
The idea is that some or all of the boot modules in .../lib/mach-boot
will be glued together into a single boot image to be placed on the
root filesystem in `/' or `/boot' or whatever. The boot modules and
other files used in constructing boot images don't themselves need
to be available immediately on bootup, so they can be located in the
"usual" places, even shared among multiple machines. Eventually, the
mach-boot directory will probably contain a whole slew of boot modules
(e.g. both uniprocessor and SMP kernels, various device drivers, file system
servers for various file system formats, etc.). You will then be able to
type something like `mkbootimage -o /boot/machboot /usr/lib/mach-boot/*.bmod'
and get a fully functional, generic boot image with "all" the possible
features and device drivers; or you might include only specific modules
to get a stripped-down image.