mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
GRUB 0.5 release
This commit is contained in:
1 parent
ae8a5f8069
commit
6239c1ac50
28 files changed
+7484
No files matched your search
@@ -0,0 +1,664 @@
|
||||
<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 zero.
|
||||
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>
|
||||
|
||||
Reference in new issue
Block a user