blob: 0a01ad2bcabb37f8a54e4ee0f12f7a0391df2346 [file] [log] [blame] [raw]
\input texinfo @c -*-texinfo-*-
@setfilename multiboot.info
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
@syncodeindex pg cp
@syncodeindex tp cp
@c
@c This file will be included from grub.texi
@c
@dircategory Kernel
@direntry
* Multiboot Standard: (multiboot). Multiboot Standard
@end direntry
@ifinfo
Copyright @copyright{} 1999 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries a copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).
@end ignore
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end ifinfo
@settitle Multiboot Standard
@titlepage
@finalout
@title The Multiboot Standard
@author Kunihiro Ishiguro
@author OKUJI Yoshinori
@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1999 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end titlepage
@ifinfo
@node Top, Motivation, (dir), (dir)
@comment node-name, next, previous, up
@top Multiboot Standard
This file documents Multiboot Standard, the proposal for the boot
sequence standard. This edition documents version 0.6.
@menu
* Motivation::
* Terminology::
* Scope and Requirements::
* Details::
* Authors::
* Revision History::
* Examples::
* Index::
@detailmenu
--- The Detailed Node Listing ---
Scope and Requirements
* Architecture::
* Operating systems::
* Boot sources::
* Boot-time configuration::
* Convenience to the OS::
* Boot modules::
Details
* OS Image Format::
* Machine State::
* Boot Information Format::
Examples
* Notes on PCs::
* Example OS Code::
* Example Bootloader Code::
@end detailmenu
@end menu
@end ifinfo
@node Motivation, Terminology, Top, Top
@comment node-name, next, previous, up
@chapter Motivation
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 @dfn{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.
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 @emph{not} specify how
boot loaders should work - only how they must interface with the OS
being loaded.
@node Terminology, Scope and Requirements, Motivation, Top
@comment node-name, next, previous, up
@chapter Terminology
Throughout this document, the term @dfn{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 @emph{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 @dfn{MultiBoot compliant};
earlier boot loader stages can be designed in whatever way is most
convenient.
The term @dfn{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.
The term @dfn{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.
@node Scope and Requirements, Details, Terminology, Top
@comment node-name, next, previous, up
@chapter Scope and Requirements
@menu
* Architecture::
* Operating systems::
* Boot sources::
* Boot-time configuration::
* Convenience to the OS::
* Boot modules::
@end menu
@node Architecture, Operating systems, Scope and Requirements, Scope and Requirements
@comment node-name, next, previous, up
@section Architecture
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.
@node Operating systems, Boot sources, Architecture, Scope and Requirements
@comment node-name, next, previous, up
@section Operating systems
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.
@node Boot sources, Boot-time configuration, Operating systems, Scope and Requirements
@comment node-name, next, previous, up
@section Boot sources
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.
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 @dfn{block lists} (e.g. LILO), loading from a special
@dfn{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.
It is hoped that boot loaders will be created that support multiple
loading mechanisms, increasing their portability, robustness, and
user-friendliness.
@node Boot-time configuration, Convenience to the OS, Boot sources, Scope and Requirements
@comment node-name, next, previous, up
@section Boot-time configuration
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.
@node Convenience to the OS, Boot modules, Boot-time configuration, Scope and Requirements
@comment node-name, next, previous, up
@section Convenience to the OS
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 @code{nm} or disassemble OS
images just like normal executables. Specialized tools should not be
needed to create OS images in a @emph{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.
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.
This standard adopts a compromise solution to this problem. MultiBoot
compliant boot images always either (a) are in ELF format, or (b)
contain a @dfn{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.
@node Boot modules, , Convenience to the OS, Scope and Requirements
@comment node-name, next, previous, up
@section Boot modules
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.
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.
@node Details, Authors, Scope and Requirements, Top
@comment node-name, next, previous, up
@chapter Details
There are three main aspects of the boot-loader/OS image interface this
standard must specify:
@enumerate
@item The format of the OS image as seen by the boot loader.
@item The state of the machine when the boot loader starts the OS.
@item The format of the information passed by the boot loader to the OS.
@end enumerate
@menu
* OS Image Format::
* Machine State::
* Boot Information Format::
@end menu
@node OS Image Format, Machine State, Details, Details
@comment node-name, next, previous, up
@section OS Image Format
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.
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 @dfn{multiboot_header}, appear somewhere near the beginning of
the executable file. In general it should come @emph{as early as possible},
and is typically embedded in the beginning of the text segment after the
@emph{real} executable header. It @emph{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:
@example
@group
+-------------------+
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)
+-------------------+
@end group
@end example
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.
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.
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.
If bit 1 in the flags word is set, then information on available memory
via at least the @samp{mem_*} fields of the multiboot_info structure defined
below must be included. If the bootloader is capable of passing a
memory map (the @samp{mmap_*} fields) and one exists, then it must be
included as well.
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.
All of the address fields enabled by flag bit 16 are physical addresses.
The meaning of each is as follows:
@table @code
@item header_addr
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 @dfn{synchronize} the
mapping between OS image offsets and physical memory addresses.
@item load_addr
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.
@item load_end_addr
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.
@item bss_end_addr
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.
@item entry
The physical address to which the boot loader should jump in order to
start running the OS.
@end table
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.
@node Machine State, Boot Information Format, OS Image Format, Details
@comment node-name, next, previous, up
@section Machine State
When the boot loader invokes the 32-bit operating system,
the machine must have the following state:
@itemize @bullet
@item @code{CS} must be a 32-bit read/execute code segment with an offset of 0
and a limit of 0xffffffff.
@item @code{DS}, @code{ES}, @code{FS}, @code{GS}, and @code{SS} must be a 32-bit read/write data segment with
an offset of 0 and a limit of 0xffffffff.
@item 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.).
@item Paging must be turned off.
@item The processor interrupt flag must be turned off.
@item @code{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).
@item @code{EBX} must contain the 32-bit physical address of the multiboot_info
structure provided by the boot loader (see below).
@end itemize
All other processor registers and flag bits are undefined. This includes,
in particular:
@itemize @bullet
@item @code{ESP}: the 32-bit OS must create its own stack as soon as it needs one.
@item @code{GDTR}: Even though the segment registers are set up as described above, the @code{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 @code{GDT}.
@item @code{IDTR}: The OS must leave interrupts disabled until it sets up its own @code{IDT}.
@end itemize
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.
@node Boot Information Format, , Machine State, Details
@comment node-name, next, previous, up
@section Boot Information Format
Upon entry to the OS, the @code{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.
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.
The format of the multiboot_info structure (as defined so far) follows:
@example
@group
+-------------------+
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)
+-------------------+
@end group
@end example
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.
If bit 0 in the multiboot_info.flags word is set, then the @samp{mem_*} fields
are valid. @samp{mem_lower} and @samp{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.
If bit 1 in the multiboot_info.flags word is set, then the @samp{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 @dfn{root} device, but is not required to. The
boot_device field is layed out in four one-byte subfields as follows:
@example
@group
+-------+-------+-------+-------+
| drive | part1 | part2 | part3 |
+-------+-------+-------+-------+
@end group
@end example
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.
The three remaining bytes specify the boot partition. @samp{part1}
specifies the @dfn{top-level} partition number, @samp{part2} specifies a
@dfn{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
@samp{part1} contains the DOS partition number, and @samp{part2} and
@samp{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 @dfn{disklabel} strategy, then
@samp{part1} contains the DOS partition number, @samp{part2} contains the BSD
sub-partition within that DOS partition, and @samp{part3} is 0xFF.
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 @samp{part1} will be 5,
and @samp{part2} and @samp{part3} will both be 0xFF.
If bit 2 of the flags longword is set, the @samp{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.
If bit 3 of the flags is set, then the @samp{mods} fields indicate to
the kernel
what boot modules were loaded along with the kernel image, and where they
can be found. @samp{mods_count} contains the number of modules loaded;
@samp{mods_addr} contains the physical address of the first module structure.
@samp{mods_count} may be zero, indicating no boot modules were loaded, even if
bit 1 of @samp{flags} is set. Each module structure is formatted as follows:
@example
@group
+-------------------+
0 | mod_start |
4 | mod_end |
+-------------------+
8 | string |
+-------------------+
12 | reserved (0) |
+-------------------+
@end group
@end example
The first two fields contain the start and end addresses of the boot module
itself. The @samp{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 @samp{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 @samp{reserved} field
must be set to 0 by the boot loader and ignored by the OS.
@strong{Caution:} Bits 4 & 5 are mutually exclusive.
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:
@example
@group
+-------------------+
28 | tabsize |
32 | strsize |
36 | addr |
40 | reserved (0) |
+-------------------+
@end group
@end example
These indicate where the symbol table from an a.out kernel image can be
found. @samp{addr} is the physical address of the size (4-byte unsigned
long) of an array of a.out-format @dfn{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. @samp{tabsize} is equal to its size
parameter (found at the beginning of the symbol section), and @samp{strsize}
is equal to its size parameter (found at the beginning of the string section)
of the following string table to which the symbol table refers. Note that
@samp{tabsize} may be 0, indicating no symbols, even if bit 4 in the flags
word is set.
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:
@example
@group
+-------------------+
28 | num |
32 | size |
36 | addr |
40 | shndx |
+-------------------+
@end group
@end example
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 @samp{shdr_*} entries
(@samp{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 @samp{shdr_num} may be 0, indicating no symbols,
even if bit 5 in the flags word is set.
If bit 6 in the multiboot_info.flags word is set, then the @samp{mmap_*} fields
are valid, and indicate the address and length of a buffer containing a
memory map of the machine provided by the BIOS. @samp{mmap_addr} is the
address,
and @samp{mmap_length} is the total size of the buffer. The buffer consists of
one or more of the following size/structure pairs (@samp{size} is really used
for skipping to the next pair):
@example
@group
+-------------------+
-4 | size |
+-------------------+
0 | BaseAddrLow |
4 | BaseAddrHigh |
8 | LengthLow |
12 | LengthHigh |
16 | Type |
+-------------------+
@end group
@end example
where @dfn{size} is the size of the associated structure in bytes, which
can be greater than the minimum of 20 bytes. @dfn{BaseAddrLow} is the
lower 32 bits of the starting address, and @dfn{BaseAddrHigh} is the
upper 32 bits, for a total of a 64-bit starting address.
@dfn{LengthLow} is the lower 32 bits of the size of the memory region in
bytes, and @dfn{LengthHigh} is the upper 32 bits, for a total of a
64-bit length. @dfn{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.
The map provided is guaranteed to list all standard RAM that should
be available for normal use.
@node Authors, Revision History, Details, Top
@comment node-name, next, previous, up
@chapter Authors
@example
Bryan Ford
Computer Systems Laboratory
University of Utah
Salt Lake City, UT 84112
(801) 581-4280
baford@@cs.utah.edu
@end example
@example
Erich Stefan Boleyn
924 S.W. 16th Ave, #202
Portland, OR, USA 97205
(503) 226-0741
erich@@uruk.org
@end example
We would also like to thank the many other people have provided comments,
ideas, information, and other forms of support for our work.
@node Revision History, Examples, Authors, Top
@comment node-name, next, previous, up
@chapter Revision History
@example
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
@end example
@node Examples, Index, Revision History, Top
@comment node-name, next, previous, up
@chapter Examples
NOTE: The following items are not part of the standards document, but
are included for prospective OS and bootloader writers.
@menu
* Notes on PCs::
* Example OS Code::
* Example Bootloader Code::
@end menu
@node Notes on PCs, Example OS Code, Examples, Examples
@comment node-name, next, previous, up
@section Notes on PCs
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 @emph{highly} recommended
that bootloaders perform a thorough memory probe.
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
@uref{file:bios_mapping}BIOS Device Mapping Techniques.
In reference to bit 6 of the multiboot_info.flags parameter, it is
important to note that the data structure used there (starting with
@samp{BaseAddrLow}) is the data returned by the @uref{file:mem64mb} INT 15h,
AX=E820h - Query System Address Map 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.
@node Example OS Code, Example Bootloader Code, Notes on PCs, Examples
@comment node-name, next, previous, up
@section Example OS Code
@strong{Caution:} 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
@ref{Example Bootloader Code} section below.
The Mach 4 distribution, available by anonymous FTP from
@url{ftp://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:
@example
mach4-i386/include/mach/machine/multiboot.h
@end example
This distribution also contains code implementing a @dfn{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 @dfn{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:
@example
mach4-i386/boot
mach4-i386/boot/bsd
mach4-i386/boot/linux
@end example
The Mach kernel itself in this distribution contains code that demonstrates
how to create a compliant OS. The following files are of primary
relevance:
@example
mach4-i386/kernel/i386at/boothdr.S
mach4-i386/kernel/i386at/model_dep.c
@end example
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
@url{ftp://kahlua.cs.utah.edu:/private/boot}.
@node Example Bootloader Code, , Example OS Code, Examples
@comment node-name, next, previous, up
@section Example Bootloader Code
The GRUB bootloader project @url{http://www.uruk.org/grub/} will be
fully Multiboot-compliant, supporting all required and optional features
present in this standard.
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 public release area
@url{ftp://ftp.uruk.org/public/grub/} .
@node Index, , Examples, Top
@comment node-name, next, previous, up
@unnumbered Index
@printindex cp
@contents
@bye