663 lines
29 KiB
HTML
663 lines
29 KiB
HTML
<HTML>
|
|
|
|
<HEAD>
|
|
<TITLE>Multiboot Standard</TITLE>
|
|
</HEAD>
|
|
|
|
<BODY>
|
|
|
|
<CENTER><H1>Multiboot Standard</H1></CENTER>
|
|
<CENTER><H3>Version 0.6</H3></CENTER>
|
|
|
|
<HR>
|
|
|
|
<H2>Contents</H2>
|
|
|
|
<UL>
|
|
<LI> <A HREF="#motivation">Motivation</A>
|
|
<LI> <A HREF="#terminology">Terminology</A>
|
|
<LI> <A HREF="#scope">Scope and Requirements</A>
|
|
<LI> <A HREF="#details">Details</A>
|
|
<LI> <A HREF="#author">Authors</A>
|
|
<LI> <B>NOTE: The following items are not part of the standards document,
|
|
but are included for prospective OS and bootloader writers.</B>
|
|
<LI> <A HREF="#notes">Notes on PCs</A>
|
|
<LI> <A HREF="#example_os">Example OS Code</A>
|
|
<LI> <A HREF="#example_boot">Example Bootloader Code</A>
|
|
</UL>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="motivation">Motivation</A></H2>
|
|
|
|
Every OS ever created tends to have its own boot loader. Installing a new
|
|
OS on a machine generally involves installing a whole new set of boot
|
|
mechanisms, each with completely different install-time and boot-time user
|
|
interfaces. Getting multiple operating systems to coexist reliably on one
|
|
machine through typical "chaining" mechanisms can be a nightmare. There is
|
|
little or no choice of boot loaders for a particular operating system - if
|
|
the one that comes with the OS doesn't do exactly what you want, or doesn't
|
|
work on your machine, you're screwed.<P>
|
|
|
|
While we may not be able to fix this problem in existing commercial
|
|
operating systems, it shouldn't be too difficult for a few people in the
|
|
free OS communities to put their heads together and solve this problem for
|
|
the popular free operating systems. That's what this standard aims for.
|
|
Basically, it specifies an interface between a boot loader and a operating
|
|
system, such that any complying boot loader should be able to load any
|
|
complying operating system. This standard does NOT specify how boot
|
|
loaders should work - only how they must interface with the OS being
|
|
loaded.<P>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="terminology">Terminology</A></H2>
|
|
|
|
Throughout this document, the term "boot loader" means whatever program or
|
|
set of programs loads the image of the final operating system to be run on
|
|
the machine. The boot loader may itself consist of several stages, but
|
|
that is an implementation detail not relevant to this standard. Only the
|
|
"final" stage of the boot loader - the stage that eventually transfers
|
|
control to the OS - needs to follow the rules specified in this document
|
|
in order to be "MultiBoot compliant"; earlier boot loader stages can be
|
|
designed in whatever way is most convenient.<P>
|
|
|
|
The term "OS image" is used to refer to the initial binary image that the
|
|
boot loader loads into memory and transfers control to to start the OS.
|
|
The OS image is typically an executable containing the OS kernel.<P>
|
|
|
|
The term "boot module" refers to other auxiliary files that the boot loader
|
|
loads into memory along with the OS image, but does not interpret in any
|
|
way other than passing their locations to the OS when it is invoked.<P>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="scope">Scope and Requirements</A></H2>
|
|
|
|
<H3>Architectures</H3>
|
|
|
|
This standard is primarily targetted at PC's, since they are the most
|
|
common and have the largest variety of OS's and boot loaders. However, to
|
|
the extent that certain other architectures may need a boot standard and do
|
|
not have one already, a variation of this standard, stripped of the
|
|
x86-specific details, could be adopted for them as well.<P>
|
|
|
|
<H3>Operating systems</H3>
|
|
|
|
This standard is targetted toward free 32-bit operating systems that can be
|
|
fairly easily modified to support the standard without going through lots of
|
|
bureaucratic rigmarole. The particular free OS's that this standard is
|
|
being primarily designed for are Linux, FreeBSD, NetBSD, Mach, and VSTa.
|
|
It is hoped that other emerging free OS's will adopt it from the start, and
|
|
thus immediately be able to take advantage of existing boot loaders. It
|
|
would be nice if commercial operating system vendors eventually adopted
|
|
this standard as well, but that's probably a pipe dream.<P>
|
|
|
|
<H3>Boot sources</H3>
|
|
|
|
It should be possible to write compliant boot loaders that
|
|
load the OS image from a variety of sources, including floppy disk, hard
|
|
disk, and across a network.<P>
|
|
|
|
Disk-based boot loaders may use a variety of techniques to find the
|
|
relevant OS image and boot module data on disk, such as by interpretation
|
|
of specific file systems (e.g. the BSD/Mach boot loader), using
|
|
precalculated "block lists" (e.g. LILO), loading from a special "boot
|
|
partition" (e.g. OS/2), or even loading from within another operating
|
|
system (e.g. the VSTa boot code, which loads from DOS). Similarly,
|
|
network-based boot loaders could use a variety of network hardware and
|
|
protocols.<P>
|
|
|
|
It is hoped that boot loaders will be created that support multiple loading
|
|
mechanisms, increasing their portability, robustness, and
|
|
user-friendliness.<P>
|
|
|
|
<H3>Boot-time configuration</H3>
|
|
|
|
It is often necessary for one reason or another for the user to be able to
|
|
provide some configuration information to the OS dynamically at boot time.
|
|
While this standard should not dictate how this configuration information
|
|
is obtained by the boot loader, it should provide a standard means for the
|
|
boot loader to pass such information to the OS.<P>
|
|
|
|
<H3>Convenience to the OS</H3>
|
|
|
|
OS images should be easy to generate. Ideally, an OS image should simply
|
|
be an ordinary 32-bit executable file in whatever file format the OS
|
|
normally uses. It should be possible to 'nm' or disassemble OS images just
|
|
like normal executables. Specialized tools should not be needed to create
|
|
OS images in a "special" file format. If this means shifting some work
|
|
from the OS to the boot loader, that is probably appropriate, because all
|
|
the memory consumed by the boot loader will typically be made available
|
|
again after the boot process is created, whereas every bit of code in the
|
|
OS image typically has to remain in memory forever. The OS should not have
|
|
to worry about getting into 32-bit mode initially, because mode switching
|
|
code generally needs to be in the boot loader anyway in order to load OS
|
|
data above the 1MB boundary, and forcing the OS to do this makes creation
|
|
of OS images much more difficult.<P>
|
|
|
|
Unfortunately, there is a horrendous variety of executable file formats
|
|
even among free Unix-like PC-based OS's - generally a different format for
|
|
each OS. Most of the relevant free OS's use some variant of a.out format,
|
|
but some are moving to ELF. It is highly desirable for boot loaders not to
|
|
have to be able to interpret all the different types of executable file
|
|
formats in existence in order to load the OS image - otherwise the boot
|
|
loader effectively becomes OS-specific again.<P>
|
|
|
|
This standard adopts a compromise solution to this problem.
|
|
MultiBoot compliant boot images always either (a) are in ELF format, or (b)
|
|
contain a "magic MultiBoot header", described below, which allows the boot
|
|
loader to load the image without having to understand numerous a.out
|
|
variants or other executable formats. This magic header does not need
|
|
to be at the very beginning of the executable file, so kernel images can
|
|
still conform to the local a.out format variant in addition to being
|
|
MultiBoot compliant.<P>
|
|
|
|
<H3>Boot modules</H3>
|
|
|
|
Many modern operating system kernels, such as those of VSTa and Mach, do
|
|
not by themselves contain enough mechanism to get the system fully
|
|
operational: they require the presence of additional software modules at
|
|
boot time in order to access devices, mount file systems, etc. While these
|
|
additional modules could be embedded in the main OS image along with the
|
|
kernel itself, and the resulting image be split apart manually by the OS
|
|
when it receives control, it is often more flexible, more space-efficient,
|
|
and more convenient to the OS and user if the boot loader can load these
|
|
additional modules independently in the first place.<P>
|
|
|
|
Thus, this standard should provide a standard method for a boot loader to
|
|
indicate to the OS what auxiliary boot modules were loaded, and where they
|
|
can be found. Boot loaders don't have to support multiple boot modules,
|
|
but they are strongly encouraged to, because some OS's will be unable to
|
|
boot without them.<P>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="details">Details</H2>
|
|
|
|
There are three main aspects of the boot-loader/OS image interface this
|
|
standard must specify:<P>
|
|
|
|
<UL>
|
|
<LI>The format of the OS image as seen by the boot loader.
|
|
<LI>The state of the machine when the boot loader starts the OS.
|
|
<LI>The format of the information passed by the boot loader to the OS.
|
|
</UL>
|
|
|
|
<H3>OS Image Format</H3>
|
|
|
|
An OS image is generally just an ordinary 32-bit executable file in the
|
|
standard format for that particular OS, except that it may be linked at a
|
|
non-default load address to avoid loading on top of the PC's I/O region
|
|
or other reserved areas, and of course it can't use shared libraries or
|
|
other fancy features. Initially, only images in a.out format are
|
|
supported; ELF support will probably later be specified in the standard.<P>
|
|
|
|
Unfortunately, the exact meaning of the text, data, bss, and entry fields
|
|
of a.out headers tends to vary widely between different executable flavors,
|
|
and it is sometimes very difficult to distinguish one flavor from another
|
|
(e.g. Linux ZMAGIC executables and Mach ZMAGIC executables). Furthermore,
|
|
there is no simple, reliable way of determining at what address in memory
|
|
the text segment is supposed to start. Therefore, this standard requires
|
|
that an additional header, known as a 'multiboot_header', appear somewhere
|
|
near the beginning of the executable file. In general it should come "as
|
|
early as possible", and is typically embedded in the beginning of the text
|
|
segment after the "real" executable header. It _must_ be contained
|
|
completely within the first 8192 bytes of the executable file, and must be
|
|
longword (32-bit) aligned. These rules allow the boot loader to find and
|
|
synchronize with the text segment in the a.out file without knowing
|
|
beforehand the details of the a.out variant. The layout of the header is
|
|
as follows:<P>
|
|
|
|
<pre>
|
|
+-------------------+
|
|
0 | magic: 0x1BADB002 | (required)
|
|
4 | flags | (required)
|
|
8 | checksum | (required)
|
|
+-------------------+
|
|
8 | header_addr | (present if flags[16] is set)
|
|
12 | load_addr | (present if flags[16] is set)
|
|
16 | load_end_addr | (present if flags[16] is set)
|
|
20 | bss_end_addr | (present if flags[16] is set)
|
|
24 | entry_addr | (present if flags[16] is set)
|
|
+-------------------+
|
|
</pre>
|
|
|
|
All fields are in little-endian byte order, of course. The first field is
|
|
the magic number identifying the header, which must be the hex value
|
|
0x1BADB002.<P>
|
|
|
|
The flags field specifies features that the OS image requests or requires
|
|
of the boot loader. Bits 0-15 indicate requirements; if the boot loader
|
|
sees any of these bits set but doesn't understand the flag or can't fulfill
|
|
the requirements it indicates for some reason, it must notify the user and
|
|
fail to load the OS image. Bits 16-31 indicate optional features; if any
|
|
bits in this range are set but the boot loader doesn't understand them, it
|
|
can simply ignore them and proceed as usual. Naturally, all
|
|
as-yet-undefined bits in the flags word must be set to zero in OS
|
|
images. This way, the flags fields serves for version control as well as
|
|
simple feature selection.<P>
|
|
|
|
If bit 0 in the flags word is set, then all boot modules loaded along with
|
|
the OS must be aligned on page (4KB) boundaries. Some OS's expect to be
|
|
able to map the pages containing boot modules directly into a paged address
|
|
space during startup, and thus need the boot modules to be page-aligned.<P>
|
|
|
|
If bit 1 in the flags word is set, then information on available memory
|
|
via at least the 'mem_*' fields of the multiboot_info structure defined
|
|
below must be included. If the bootloader is capable of passing a memory
|
|
map (the 'mmap_*' fields) and one exists, then it must be included as
|
|
well.<P>
|
|
|
|
If bit 16 in the flags word is set, then the fields at offsets 8-24 in the
|
|
multiboot_header are valid, and the boot loader should use them instead of
|
|
the fields in the actual executable header to calculate where to load the
|
|
OS image. This information does not need to be provided if the kernel
|
|
image is in ELF format, but it should be provided if the images is in a.out
|
|
format or in some other format. Compliant boot loaders must be able to
|
|
load images that either are in ELF format or contain the load address
|
|
information embedded in the multiboot_header; they may also directly
|
|
support other executable formats, such as particular a.out variants, but
|
|
are not required to.<P>
|
|
|
|
All of the address fields enabled by flag bit 16 are physical addresses.
|
|
The meaning of each is as follows:<P>
|
|
|
|
<UL>
|
|
<LI><B>header_addr</B> -- Contains the address corresponding to the
|
|
beginning of the multiboot_header - the physical memory location at which
|
|
the magic value is supposed to be loaded. This field serves to "synchronize"
|
|
the mapping between OS image offsets and physical memory addresses.
|
|
<LI><B>load_addr</B> -- Contains the physical address of the beginning
|
|
of the text segment. The offset in the OS image file at which to start
|
|
loading is defined by the offset at which the header was found, minus
|
|
(header_addr - load_addr). load_addr must be less than or equal to
|
|
header_addr.
|
|
<LI><B>load_end_addr</B> -- Contains the physical address of the end of the
|
|
data segment. (load_end_addr - load_addr) specifies how much data to load.
|
|
This implies that the text and data segments must be consecutive in the
|
|
OS image; this is true for existing a.out executable formats.
|
|
<LI><B>bss_end_addr</B> -- Contains the physical address of the end of
|
|
the bss segment. The boot loader initializes this area to zero, and
|
|
reserves the memory it occupies to avoid placing boot modules and other
|
|
data relevant to the OS in that area.
|
|
<LI><B>entry</B> -- The physical address to which the boot loader should
|
|
jump in order to start running the OS.
|
|
</UL>
|
|
|
|
The checksum is a 32-bit unsigned value which, when added to
|
|
the other required fields, must have a 32-bit unsigned sum of zero.<P>
|
|
|
|
<H3>Machine State</H3>
|
|
|
|
When the boot loader invokes the 32-bit operating system,
|
|
the machine must have the following state:<P>
|
|
|
|
<UL>
|
|
<LI>CS must be a 32-bit read/execute code segment with an offset of 0
|
|
and a limit of 0xffffffff.
|
|
<LI>DS, ES, FS, GS, and SS must be a 32-bit read/write data segment with
|
|
an offset of 0 and a limit of 0xffffffff.
|
|
<LI>The address 20 line must be usable for standard linear 32-bit
|
|
addressing of memory (in standard PC hardware, it is wired to
|
|
0 at bootup, forcing addresses in the 1-2 MB range to be mapped to the
|
|
0-1 MB range, 3-4 is mapped to 2-3, etc.).
|
|
<LI>Paging must be turned off.
|
|
<LI>The processor interrupt flag must be turned off.
|
|
<LI>EAX must contain the magic value 0x2BADB002; the presence of this value
|
|
indicates to the OS that it was loaded by a MultiBoot-compliant boot
|
|
loader (e.g. as opposed to another type of boot loader that the OS can
|
|
also be loaded from).
|
|
<LI>EBX must contain the 32-bit physical address of the multiboot_info
|
|
structure provided by the boot loader (see below).
|
|
</UL>
|
|
|
|
All other processor registers and flag bits are undefined. This includes,
|
|
in particular:<P>
|
|
|
|
<UL>
|
|
<LI>ESP: the 32-bit OS must create its own stack as soon as it needs one.
|
|
<LI>GDTR: Even though the segment registers are set up as described above,
|
|
the GDTR may be invalid, so the OS must not load any segment registers
|
|
(even just reloading the same values!) until it sets up its own GDT.
|
|
<LI>IDTR: The OS must leave interrupts disabled until it sets up its own IDT.
|
|
</UL>
|
|
|
|
However, other machine state should be left by the boot loader in "normal
|
|
working order", i.e. as initialized by the BIOS (or DOS, if that's what
|
|
the boot loader runs from). In other words, the OS should be able to make
|
|
BIOS calls and such after being loaded, as long as it does not overwrite
|
|
the BIOS data structures before doing so. Also, the boot loader must leave
|
|
the PIC programmed with the normal BIOS/DOS values, even if it changed them
|
|
during the switch to 32-bit mode.<P>
|
|
|
|
<H3>Boot Information Format</H3>
|
|
|
|
Upon entry to the OS, the EBX register contains the physical address of
|
|
a 'multiboot_info' data structure, through which the boot loader
|
|
communicates vital information to the OS. The OS can use or ignore any
|
|
parts of the structure as it chooses; all information passed by the boot
|
|
loader is advisory only.<P>
|
|
|
|
The multiboot_info structure and its related substructures may be placed
|
|
anywhere in memory by the boot loader (with the exception of the memory
|
|
reserved for the kernel and boot modules, of course). It is the OS's
|
|
responsibility to avoid overwriting this memory until it is done using it.<P>
|
|
|
|
The format of the multiboot_info structure (as defined so far) follows:<P>
|
|
|
|
<pre>
|
|
+-------------------+
|
|
0 | flags | (required)
|
|
+-------------------+
|
|
4 | mem_lower | (present if flags[0] is set)
|
|
8 | mem_upper | (present if flags[0] is set)
|
|
+-------------------+
|
|
12 | boot_device | (present if flags[1] is set)
|
|
+-------------------+
|
|
16 | cmdline | (present if flags[2] is set)
|
|
+-------------------+
|
|
20 | mods_count | (present if flags[3] is set)
|
|
24 | mods_addr | (present if flags[3] is set)
|
|
+-------------------+
|
|
28 - 40 | syms | (present if flags[4] or flags[5] is set)
|
|
+-------------------+
|
|
44 | mmap_length | (present if flags[6] is set)
|
|
48 | mmap_addr | (present if flags[6] is set)
|
|
+-------------------+
|
|
</pre>
|
|
|
|
The first longword indicates the presence and validity of other fields in
|
|
the multiboot_info structure. All as-yet-undefined bits must be set to
|
|
zero by the boot loader. Any set bits that the OS does not understand
|
|
should be ignored. Thus, the flags field also functions as a version
|
|
indicator, allowing the multiboot_info structure to be expanded in the
|
|
future without breaking anything.<P>
|
|
|
|
If bit 0 in the multiboot_info.flags word is set, then the 'mem_*' fields
|
|
are valid. 'mem_lower' and 'mem_upper' indicate the amount of lower and upper
|
|
memory, respectively, in kilobytes. Lower memory starts at address 0, and
|
|
upper memory starts at address 1 megabyte. The maximum possible
|
|
value for lower memory is 640 kilobytes. The value returned for upper
|
|
memory is maximally the address of the first upper memory hole minus
|
|
1 megabyte. It is not guaranteed to be this value.<P>
|
|
|
|
If bit 1 in the multiboot_info.flags word is set, then the 'boot_device'
|
|
field is valid, and indicates which BIOS disk device the boot loader loaded
|
|
the OS from. If the OS was not loaded from a BIOS disk, then this field
|
|
must not be present (bit 3 must be clear). The OS may use this field as a
|
|
hint for determining its own "root" device, but is not required to. The
|
|
boot_device field is layed out in four one-byte subfields as follows:<P>
|
|
|
|
<pre>
|
|
+-------+-------+-------+-------+
|
|
| drive | part1 | part2 | part3 |
|
|
+-------+-------+-------+-------+
|
|
</pre>
|
|
|
|
The first byte contains the BIOS drive number as understood by the BIOS
|
|
INT 0x13 low-level disk interface: e.g. 0x00 for the first floppy disk or
|
|
0x80 for the first hard disk.<P>
|
|
|
|
The three remaining bytes specify the boot partition. 'part1' specifies
|
|
the "top-level" partition number, 'part2' specifies a "sub-partition" in
|
|
the top-level partition, etc. Partition numbers always start from zero.
|
|
Unused partition bytes must be set to 0xFF. For example, if the disk is
|
|
partitioned using a simple one-level DOS partitioning scheme, then 'part1'
|
|
contains the DOS partition number, and 'part2' and 'part3' are both 0xFF.
|
|
As another example, if a disk is partitioned first into DOS partitions, and
|
|
then one of those DOS partitions is subdivided into several BSD partitions
|
|
using BSD's "disklabel" strategy, then 'part1' contains the DOS partition
|
|
number, 'part2' contains the BSD sub-partition within that DOS partition,
|
|
and 'part3' is 0xFF.<P>
|
|
|
|
DOS extended partitions are indicated as partition numbers starting from 4
|
|
and increasing, rather than as nested sub-partitions, even though the
|
|
underlying disk layout of extended partitions is hierarchical in nature.
|
|
For example, if the boot loader boots from the second extended partition
|
|
on a disk partitioned in conventional DOS style, then 'part1' will be 5,
|
|
and 'part2' and 'part3' will both be 0xFF.<P>
|
|
|
|
If bit 2 of the flags longword is set, the 'cmdline' field is valid, and
|
|
contains the physical address of the the command line to be passed to the
|
|
kernel. The command line is a normal C-style null-terminated string.<P>
|
|
|
|
If bit 3 of the flags is set, then the 'mods' fields indicate to the kernel
|
|
what boot modules were loaded along with the kernel image, and where they
|
|
can be found. 'mods_count' contains the number of modules loaded;
|
|
'mods_addr' contains the physical address of the first module structure.
|
|
'mods_count' may be zero, indicating no boot modules were loaded, even if
|
|
bit 1 of 'flags' is set. Each module structure is formatted as follows:<P>
|
|
|
|
<pre>
|
|
+-------------------+
|
|
0 | mod_start |
|
|
4 | mod_end |
|
|
+-------------------+
|
|
8 | string |
|
|
+-------------------+
|
|
12 | reserved (0) |
|
|
+-------------------+
|
|
</pre>
|
|
|
|
The first two fields contain the start and end addresses of the boot module
|
|
itself. The 'string' field provides an arbitrary string to be associated
|
|
with that particular boot module; it is a null-terminated ASCII string,
|
|
just like the kernel command line. The 'string' field may be 0 if there is
|
|
no string associated with the module. Typically the string might be a
|
|
command line (e.g. if the OS treats boot modules as executable programs),
|
|
or a pathname (e.g. if the OS treats boot modules as files in a file
|
|
system), but its exact use is specific to the OS. The 'reserved' field
|
|
must be set to 0 by the boot loader and ignored by the OS.<P>
|
|
|
|
NOTE: Bits 4 & 5 are mutually exclusive.<P>
|
|
|
|
If bit 4 in the multiboot_info.flags word is set, then the following
|
|
fields in the multiboot_info structure starting at byte 28 are valid:<P>
|
|
|
|
<pre>
|
|
+-------------------+
|
|
28 | tabsize |
|
|
32 | strsize |
|
|
36 | addr |
|
|
40 | reserved (0) |
|
|
+-------------------+
|
|
</pre>
|
|
|
|
These indicate where the symbol table from an a.out kernel image can be
|
|
found. 'addr' is the physical address of the size (4-byte unsigned
|
|
long) of an array of a.out-format 'nlist' structures, followed immediately
|
|
by the array itself, then the size (4-byte unsigned long) of a set of
|
|
null-terminated ASCII strings (plus sizeof(unsigned long) in this case),
|
|
and finally the set of strings itself. 'tabsize' is equal to it's size
|
|
parameter (found at the beginning of the symbol section), and 'strsize'
|
|
is equal to it's size parameter (found at the beginning of the string section)
|
|
of the following string table to which the symbol table refers. Note that
|
|
'tabsize' may be 0, indicating no symbols, even if bit 4 in the flags
|
|
word is set.<P>
|
|
|
|
If bit 5 in the multiboot_info.flags word is set, then the following
|
|
fields in the multiboot_info structure starting at byte 28 are valid:<P>
|
|
|
|
<pre>
|
|
+-------------------+
|
|
28 | num |
|
|
32 | size |
|
|
36 | addr |
|
|
40 | shndx |
|
|
+-------------------+
|
|
</pre>
|
|
|
|
These indicate where the section header table from an ELF kernel is, the
|
|
size of each entry, number of entries, and the string table used as the
|
|
index of names. They correspond to the 'shdr_*' entries ('shdr_num', etc.)
|
|
in the Executable and Linkable Format (ELF) specification in the program
|
|
header. All sections are loaded, and the physical address fields
|
|
of the elf section header then refer to where the sections are in memory
|
|
(refer to the i386 ELF documentation for details as to how to read the
|
|
section header(s)). Note that 'shdr_num' may be 0, indicating no symbols,
|
|
even if bit 5 in the flags word is set.<P>
|
|
|
|
If bit 6 in the multiboot_info.flags word is set, then the 'mmap_*' fields
|
|
are valid, and indicate the address and length of a buffer containing a
|
|
memory map of the machine provided by the BIOS. 'mmap_addr' is the address,
|
|
and 'mmap_length' is the total size of the buffer. The buffer consists of
|
|
one or more of the following size/structure pairs ('size' is really used
|
|
for skipping to the next pair):<P>
|
|
|
|
<pre>
|
|
+-------------------+
|
|
-4 | size |
|
|
+-------------------+
|
|
0 | BaseAddrLow |
|
|
4 | BaseAddrHigh |
|
|
8 | LengthLow |
|
|
12 | LengthHigh |
|
|
16 | Type |
|
|
+-------------------+
|
|
</pre>
|
|
|
|
where 'size' is the size of the associated structure in bytes, which can
|
|
be greater than the minimum of 20 bytes. 'BaseAddrLow' is the lower 32
|
|
bits of the starting address, and 'BaseAddrHigh' is the upper 32 bits,
|
|
for a total of a 64-bit starting address. 'LengthLow' is the lower 32 bits
|
|
of the size of the memory region in bytes, and 'LengthHigh' is the upper 32
|
|
bits, for a total of a 64-bit length. 'Type' is the variety of address
|
|
range represented, where a value of 1 indicates available RAM, and all
|
|
other values currently indicated a reserved area.<P>
|
|
|
|
The map provided is guaranteed to list all standard RAM that should
|
|
be available for normal use.<P>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="author">Authors</A></H2>
|
|
|
|
<pre>
|
|
Bryan Ford
|
|
Computer Systems Laboratory
|
|
University of Utah
|
|
Salt Lake City, UT 84112
|
|
(801) 581-4280
|
|
baford@cs.utah.edu
|
|
|
|
Erich Stefan Boleyn
|
|
924 S.W. 16th Ave, #202
|
|
Portland, OR, USA 97205
|
|
(503) 226-0741
|
|
erich@uruk.org
|
|
</pre>
|
|
|
|
We would also like to thank the many other people have provided comments,
|
|
ideas, information, and other forms of support for our work.<P>
|
|
|
|
<H3>Revision History</H3>
|
|
|
|
<pre>
|
|
Version 0.6 3/29/96 (a few wording changes, header checksum, and
|
|
clarification of machine state passed to the OS)
|
|
Version 0.5 2/23/96 (name change)
|
|
Version 0.4 2/1/96 (major changes plus HTMLification)
|
|
Version 0.3 12/23/95
|
|
Version 0.2 10/22/95
|
|
Version 0.1 6/26/95
|
|
</pre>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="notes">Notes on PCs</A></H2>
|
|
|
|
In reference to bit 0 of the multiboot_info.flags parameter,
|
|
if the bootloader
|
|
in question uses older BIOS interfaces, or the newest ones are not
|
|
available (see description about bit 6), then a maximum of either
|
|
15 or 63 megabytes of memory may be reported. It is HIGHLY recommended
|
|
that bootloaders perform a thorough memory probe.<P>
|
|
|
|
In reference to bit 1 of the multiboot_info.flags parameter, it is
|
|
recognized that determination of which BIOS drive maps to which
|
|
OS-level device-driver is non-trivial, at best. Many kludges have
|
|
been made to various OSes instead of solving this problem, most of
|
|
them breaking under many conditions. To encourage the use of
|
|
general-purpose solutions to this problem, here are 2
|
|
<A HREF=bios_mapping.txt>BIOS Device Mapping Techniques</A>.<P>
|
|
|
|
In reference to bit 6 of the multiboot_info.flags parameter, it is
|
|
important to note that the data structure used there
|
|
(starting with 'BaseAddrLow') is the data returned by the
|
|
<A HREF=mem64mb.html>INT 15h, AX=E820h
|
|
- Query System Address Map</A> call. More information
|
|
on reserved memory regions is defined on that web page.
|
|
The interface here is meant to allow a bootloader to
|
|
work unmodified with any reasonable extensions of the BIOS interface,
|
|
passing along any extra data to be interpreted by the OS as desired.<P>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME="example_os">Example OS Code</A> (from Bryan Ford)</H2>
|
|
|
|
EDITOR'S NOTE: These examples are relevant to the Proposal version 0.5,
|
|
which is basically identical except for the multiboot OS header, which was
|
|
missing the checksum. A patch to bring Mach4 UK22 up to version 0.6 is
|
|
available in the GRUB FTP area mentioned in the
|
|
<A HREF="#example_boot">Example Bootloader Code</A> section below.<P>
|
|
|
|
The Mach 4 distribution, available by anonymous FTP from
|
|
flux.cs.utah.edu:/flux, contains a C header file that defines the
|
|
MultiBoot data structures described above; anyone is welcome to rip it
|
|
out and use it for other boot loaders and OS's:<P>
|
|
|
|
<pre>
|
|
mach4-i386/include/mach/machine/multiboot.h
|
|
</pre>
|
|
|
|
This distribution also contains code implementing a "Linux boot adaptor",
|
|
which collects a MultiBoot-compliant OS image and an optional set of boot
|
|
modules, compresses them, and packages them into a single traditional Linux
|
|
boot image that can be loaded from LILO or other Linux boot loaders. There
|
|
is also a corresponding "BSD boot adaptor" which can be used to wrap a
|
|
MultiBoot kernel and set of modules and produce an image that can be loaded
|
|
from the FreeBSD and NetBSD boot loaders. All of this code can be used as-is
|
|
or as a basis for other boot loaders. These are the directories of primary
|
|
relevance:<P>
|
|
|
|
<pre>
|
|
mach4-i386/boot
|
|
mach4-i386/boot/bsd
|
|
mach4-i386/boot/linux
|
|
</pre>
|
|
|
|
The Mach kernel itself in this distribution contains code that demonstrates
|
|
how to create a compliant OS. The following files are of primary
|
|
relevance:<P>
|
|
|
|
<pre>
|
|
mach4-i386/kernel/i386at/boothdr.S
|
|
mach4-i386/kernel/i386at/model_dep.c
|
|
</pre>
|
|
|
|
Finally, I have created patches against the Linux 1.2.2 and FreeBSD 2.0
|
|
kernels, in order to make them compliant with this proposed standard.
|
|
These patches are available in kahlua.cs.utah.edu:/private/boot.<P>
|
|
|
|
<HR>
|
|
|
|
<H2><A NAME"example_boot">Example Bootloader Code</A> (from Erich Boleyn)</H2>
|
|
|
|
The <A HREF=http://www.uruk.org/grub/>GRUB</A> bootloader project
|
|
will be fully
|
|
Multiboot-compliant, supporting all required and optional
|
|
features present in this standard.<P>
|
|
|
|
A final release has not been made, but both the GRUB beta release
|
|
(which is quite stable) and a patch for Multiboot version 0.6 for
|
|
Mach4 UK22 are available in the GRUB
|
|
<A HREF=ftp://ftp.uruk.org/public/grub/>public release</A>
|
|
area.<P>
|
|
|
|
<HR>
|
|
|
|
<A HREF=mailto:erich@uruk.org><I>erich@uruk.org</I></A><P>
|
|
|
|
</BODY>
|
|
</HTML>
|