|  | \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 |