Home | History | Annotate | Download | only in docs
      1 \input texinfo @c -*-texinfo-*-
      2 @c -*-texinfo-*-
      3 @c %**start of header
      4 @setfilename multiboot.info
      5 @settitle Multiboot Specification
      6 @c %**end of header
      7 
      8 @c Unify all our little indices for now.
      9 @syncodeindex fn cp
     10 @syncodeindex vr cp
     11 @syncodeindex ky cp
     12 @syncodeindex pg cp
     13 @syncodeindex tp cp
     14 
     15 @footnotestyle separate
     16 @paragraphindent 3
     17 @finalout
     18 
     19 
     20 @dircategory Kernel
     21 @direntry
     22 * Multiboot Specification: (multiboot).		Multiboot Specification.
     23 @end direntry
     24 
     25 @ifinfo
     26 Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu>
     27 Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org>
     28 Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
     29 
     30 Permission is granted to make and distribute verbatim copies of
     31 this manual provided the copyright notice and this permission notice
     32 are preserved on all copies.
     33 
     34 @ignore
     35 Permission is granted to process this file through TeX and print the
     36 results, provided the printed document carries a copying permission
     37 notice identical to this one except for the removal of this paragraph
     38 (this paragraph not being relevant to the printed manual).
     39 
     40 @end ignore
     41 
     42 Permission is granted to copy and distribute modified versions of this
     43 manual under the conditions for verbatim copying, provided also that
     44 the entire resulting derived work is distributed under the terms of a
     45 permission notice identical to this one.
     46 
     47 Permission is granted to copy and distribute translations of this manual
     48 into another language, under the above conditions for modified versions.
     49 @end ifinfo
     50 
     51 @titlepage
     52 @sp 10
     53 @title The Multiboot Specification
     54 @author Yoshinori K. Okuji, Bryan Ford, Erich Stefan Boleyn, Kunihiro Ishiguro
     55 @page
     56 
     57 @vskip 0pt plus 1filll
     58 Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu>
     59 Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org>
     60 Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
     61 
     62 Permission is granted to make and distribute verbatim copies of
     63 this manual provided the copyright notice and this permission notice
     64 are preserved on all copies.
     65 
     66 Permission is granted to copy and distribute modified versions of this
     67 manual under the conditions for verbatim copying, provided also that
     68 the entire resulting derived work is distributed under the terms of a
     69 permission notice identical to this one.
     70 
     71 Permission is granted to copy and distribute translations of this manual
     72 into another language, under the above conditions for modified versions.
     73 @end titlepage
     74 
     75 @finalout
     76 @headings double
     77 
     78 @ifnottex
     79 @node Top
     80 @top Multiboot Specification
     81 
     82 This file documents Multiboot Specification, the proposal for the boot
     83 sequence standard. This edition documents version 0.6.93.
     84 @end ifnottex
     85 
     86 @menu
     87 * Overview::                    
     88 * Terminology::                 
     89 * Specification::               
     90 * Examples::                    
     91 * History::                     
     92 * Index::                       
     93 @end menu
     94 
     95 
     96 @node Overview
     97 @chapter Introduction to Multiboot Specification
     98 
     99 This chapter describes some rough information on the Multiboot
    100 Specification. Note that this is not a part of the specification itself.
    101 
    102 @menu
    103 * Motivation::                  
    104 * Architecture::                
    105 * Operating systems::           
    106 * Boot sources::                
    107 * Boot-time configuration::     
    108 * Convenience to operating systems::  
    109 * Boot modules::                
    110 @end menu
    111 
    112 
    113 @node Motivation
    114 @section The background of Multiboot Specification
    115 
    116 Every operating system ever created tends to have its own boot loader.
    117 Installing a new operating system on a machine generally involves
    118 installing a whole new set of boot mechanisms, each with completely
    119 different install-time and boot-time user interfaces. Getting multiple
    120 operating systems to coexist reliably on one machine through typical
    121 @dfn{chaining} mechanisms can be a nightmare. There is little or no
    122 choice of boot loaders for a particular operating system --- if the one
    123 that comes with the operating system doesn't do exactly what you want,
    124 or doesn't work on your machine, you're screwed.
    125 
    126 While we may not be able to fix this problem in existing commercial
    127 operating systems, it shouldn't be too difficult for a few people in the
    128 free operating system communities to put their heads together and solve
    129 this problem for the popular free operating systems. That's what this
    130 specification aims for. Basically, it specifies an interface between a
    131 boot loader and a operating system, such that any complying boot loader
    132 should be able to load any complying operating system. This
    133 specification does @emph{not} specify how boot loaders should work ---
    134 only how they must interface with the operating system being loaded.
    135 
    136 
    137 @node Architecture
    138 @section The target architecture
    139 
    140 This specification is primarily targeted at @sc{pc}, since they are the
    141 most common and have the largest variety of operating systems and boot
    142 loaders. However, to the extent that certain other architectures may
    143 need a boot specification and do not have one already, a variation of
    144 this specification, stripped of the x86-specific details, could be
    145 adopted for them as well.
    146 
    147 
    148 @node Operating systems
    149 @section The target operating systems
    150 
    151 This specification is targeted toward free 32-bit operating systems
    152 that can be fairly easily modified to support the specification without
    153 going through lots of bureaucratic rigmarole. The particular free
    154 operating systems that this specification is being primarily designed
    155 for are Linux, FreeBSD, NetBSD, Mach, and VSTa. It is hoped that other
    156 emerging free operating systems will adopt it from the start, and thus
    157 immediately be able to take advantage of existing boot loaders. It would
    158 be nice if commercial operating system vendors eventually adopted this
    159 specification as well, but that's probably a pipe dream.
    160 
    161 
    162 @node Boot sources
    163 @section Boot sources
    164 
    165 It should be possible to write compliant boot loaders that load the OS
    166 image from a variety of sources, including floppy disk, hard disk, and
    167 across a network.
    168 
    169 Disk-based boot loaders may use a variety of techniques to find the
    170 relevant OS image and boot module data on disk, such as by
    171 interpretation of specific file systems (e.g. the BSD/Mach boot loader),
    172 using precalculated @dfn{block lists} (e.g. LILO), loading from a
    173 special @dfn{boot partition} (e.g. OS/2), or even loading from within
    174 another operating system (e.g. the VSTa boot code, which loads from
    175 DOS). Similarly, network-based boot loaders could use a variety of
    176 network hardware and protocols.
    177 
    178 It is hoped that boot loaders will be created that support multiple
    179 loading mechanisms, increasing their portability, robustness, and
    180 user-friendliness.
    181 
    182 
    183 @node Boot-time configuration
    184 @section Configure an operating system at boot-time
    185 
    186 It is often necessary for one reason or another for the user to be able
    187 to provide some configuration information to an operating system
    188 dynamically at boot time. While this specification should not dictate
    189 how this configuration information is obtained by the boot loader, it
    190 should provide a standard means for the boot loader to pass such
    191 information to the operating system.
    192 
    193 
    194 @node Convenience to operating systems
    195 @section How to make OS development easier
    196 
    197 OS images should be easy to generate. Ideally, an OS image should simply
    198 be an ordinary 32-bit executable file in whatever file format the
    199 operating system normally uses. It should be possible to @code{nm} or
    200 disassemble OS images just like normal executables. Specialized tools
    201 should not be required to create OS images in a @emph{special} file
    202 format. If this means shifting some work from the operating system to
    203 a boot loader, that is probably appropriate, because all the memory
    204 consumed by the boot loader will typically be made available again after
    205 the boot process is created, whereas every bit of code in the OS image
    206 typically has to remain in memory forever. The operating system should
    207 not have to worry about getting into 32-bit mode initially, because mode
    208 switching code generally needs to be in the boot loader anyway in order
    209 to load operating system data above the 1MB boundary, and forcing the
    210 operating system to do this makes creation of OS images much more
    211 difficult.
    212 
    213 Unfortunately, there is a horrendous variety of executable file formats
    214 even among free Unix-like @sc{pc}-based operating systems --- generally
    215 a different format for each operating system. Most of the relevant free
    216 operating systems use some variant of a.out format, but some are moving
    217 to @sc{elf}. It is highly desirable for boot loaders not to have to be
    218 able to interpret all the different types of executable file formats in
    219 existence in order to load the OS image --- otherwise the boot loader
    220 effectively becomes operating system specific again.
    221 
    222 This specification adopts a compromise solution to this
    223 problem. Multiboot-compliant OS images always contain a magic
    224 @dfn{Multiboot header} (@pxref{OS image format}), which allows the boot
    225 loader to load the image without having to understand numerous a.out
    226 variants or other executable formats. This magic header does not need to
    227 be at the very beginning of the executable file, so kernel images can
    228 still conform to the local a.out format variant in addition to being
    229 Multiboot-compliant.
    230 
    231 
    232 @node Boot modules
    233 @section Boot modules
    234 
    235 Many modern operating system kernels, such as those of VSTa and Mach, do
    236 not by themselves contain enough mechanism to get the system fully
    237 operational: they require the presence of additional software modules at
    238 boot time in order to access devices, mount file systems, etc. While
    239 these additional modules could be embedded in the main OS image along
    240 with the kernel itself, and the resulting image be split apart manually
    241 by the operating system when it receives control, it is often more
    242 flexible, more space-efficient, and more convenient to the operating
    243 system and user if the boot loader can load these additional modules
    244 independently in the first place.
    245 
    246 Thus, this specification should provide a standard method for a boot
    247 loader to indicate to the operating system what auxiliary boot modules
    248 were loaded, and where they can be found. Boot loaders don't have to
    249 support multiple boot modules, but they are strongly encouraged to,
    250 because some operating systems will be unable to boot without them.
    251 
    252 
    253 @node Terminology
    254 @chapter The definitions of terms used through the specification
    255 
    256 @table @dfn
    257 @item must
    258 We use the term @dfn{must}, when any boot loader or OS image needs to
    259 follow a rule --- otherwise, the boot loader or OS image is @emph{not}
    260 Multiboot-compliant.
    261 
    262 @item should
    263 We use the term @dfn{should}, when any boot loader or OS image is
    264 recommended to follow a rule, but it doesn't need to follow the rule.
    265 
    266 @item may
    267 We use the term @dfn{may}, when any boot loader or OS image is allowed
    268 to follow a rule.
    269 
    270 @item boot loader
    271 Whatever program or set of programs loads the image of the final
    272 operating system to be run on the machine. The boot loader may itself
    273 consist of several stages, but that is an implementation detail not
    274 relevant to this specification. Only the @emph{final} stage of the boot
    275 loader --- the stage that eventually transfers control to an operating
    276 system --- must follow the rules specified in this document in order
    277 to be @dfn{Multiboot-compliant}; earlier boot loader stages may be
    278 designed in whatever way is most convenient.
    279 
    280 @item OS image
    281 The initial binary image that a boot loader loads into memory and
    282 transfers control to start an operating system. The OS image is
    283 typically an executable containing the operating system kernel.
    284 
    285 @item boot module
    286 Other auxiliary files that a boot loader loads into memory along with
    287 an OS image, but does not interpret in any way other than passing their
    288 locations to the operating system when it is invoked.
    289 
    290 @item Multiboot-compliant
    291 A boot loader or an OS image which follows the rules defined as
    292 @dfn{must} is Multiboot-compliant. When this specification specifies a
    293 rule as @dfn{should} or @dfn{may}, a Multiboot-complaint boot loader/OS
    294 image doesn't need to follow the rule.
    295 
    296 @item u8
    297 The type of unsigned 8-bit data.
    298 
    299 @item u16
    300 The type of unsigned 16-bit data. Because the target architecture is
    301 little-endian, u16 is coded in little-endian.
    302 
    303 @item u32
    304 The type of unsigned 32-bit data. Because the target architecture is
    305 little-endian, u32 is coded in little-endian.
    306 
    307 @item u64
    308 The type of unsigned 64-bit data. Because the target architecture is
    309 little-endian, u64 is coded in little-endian.
    310 @end table
    311 
    312 
    313 @node Specification
    314 @chapter The exact definitions of Multiboot Specification
    315 
    316 There are three main aspects of a boot loader/OS image interface:
    317 
    318 @enumerate
    319 @item
    320 The format of an OS image as seen by a boot loader.
    321 
    322 @item
    323 The state of a machine when a boot loader starts an operating
    324 system.
    325 
    326 @item
    327 The format of information passed by a boot loader to an operating
    328 system.
    329 @end enumerate
    330 
    331 @menu
    332 * OS image format::             
    333 * Machine state::               
    334 * Boot information format::     
    335 @end menu
    336 
    337 
    338 @node OS image format
    339 @section OS image format
    340 
    341 An OS image may be an ordinary 32-bit executable file in the standard
    342 format for that particular operating system, except that it may be
    343 linked at a non-default load address to avoid loading on top of the
    344 @sc{pc}'s I/O region or other reserved areas, and of course it should
    345 not use shared libraries or other fancy features.
    346 
    347 An OS image must contain an additional header called @dfn{Multiboot
    348 header}, besides the headers of the format used by the OS image. The
    349 Multiboot header must be contained completely within the first 8192
    350 bytes of the OS image, and must be longword (32-bit) aligned. In
    351 general, it should come @emph{as early as possible}, and may be
    352 embedded in the beginning of the text segment after the @emph{real}
    353 executable header.
    354 
    355 @menu
    356 * Header layout::               The layout of Multiboot header
    357 * Header magic fields::         The magic fields of Multiboot header
    358 * Header address fields::       
    359 * Header graphics fields::      
    360 @end menu
    361 
    362 
    363 @node Header layout
    364 @subsection The layout of Multiboot header
    365 
    366 The layout of the Multiboot header must be as follows:
    367 
    368 @multitable @columnfractions .1 .1 .2 .5
    369 @item Offset @tab Type  @tab Field Name    @tab Note
    370 @item 0      @tab u32 @tab magic         @tab required
    371 @item 4      @tab u32 @tab flags         @tab required
    372 @item 8      @tab u32 @tab checksum      @tab required
    373 @item 12     @tab u32 @tab header_addr   @tab if flags[16] is set
    374 @item 16     @tab u32 @tab load_addr     @tab if flags[16] is set
    375 @item 20     @tab u32 @tab load_end_addr @tab if flags[16] is set
    376 @item 24     @tab u32 @tab bss_end_addr  @tab if flags[16] is set
    377 @item 28     @tab u32 @tab entry_addr    @tab if flags[16] is set
    378 @item 32     @tab u32 @tab mode_type     @tab if flags[2] is set
    379 @item 36     @tab u32 @tab width         @tab if flags[2] is set
    380 @item 40     @tab u32 @tab height        @tab if flags[2] is set
    381 @item 44     @tab u32 @tab depth         @tab if flags[2] is set
    382 @end multitable
    383 
    384 The fields @samp{magic}, @samp{flags} and @samp{checksum} are defined in
    385 @ref{Header magic fields}, the fields @samp{header_addr},
    386 @samp{load_addr}, @samp{load_end_addr}, @samp{bss_end_addr} and
    387 @samp{entry_addr} are defined in @ref{Header address fields}, and the
    388 fields @samp{mode_type}, @samp{width}, @samp{height} and @samp{depth} are
    389 defind in @ref{Header graphics fields}.
    390 
    391 
    392 @node Header magic fields
    393 @subsection The magic fields of Multiboot header
    394 
    395 @table @samp
    396 @item magic
    397 The field @samp{magic} is the magic number identifying the header,
    398 which must be the hexadecimal value @code{0x1BADB002}.
    399 
    400 @item flags
    401 The field @samp{flags} specifies features that the OS image requests or
    402 requires of an boot loader. Bits 0-15 indicate requirements; if the
    403 boot loader sees any of these bits set but doesn't understand the flag
    404 or can't fulfill the requirements it indicates for some reason, it must
    405 notify the user and fail to load the OS image. Bits 16-31 indicate
    406 optional features; if any bits in this range are set but the boot loader
    407 doesn't understand them, it may simply ignore them and proceed as
    408 usual. Naturally, all as-yet-undefined bits in the @samp{flags} word
    409 must be set to zero in OS images. This way, the @samp{flags} fields
    410 serves for version control as well as simple feature selection.
    411 
    412 If bit 0 in the @samp{flags} word is set, then all boot modules loaded
    413 along with the operating system must be aligned on page (4KB)
    414 boundaries. Some operating systems expect to be able to map the pages
    415 containing boot modules directly into a paged address space during
    416 startup, and thus need the boot modules to be page-aligned.
    417 
    418 If bit 1 in the @samp{flags} word is set, then information on available
    419 memory via at least the @samp{mem_*} fields of the Multiboot information
    420 structure (@pxref{Boot information format}) must be included. If the
    421 boot loader is capable of passing a memory map (the @samp{mmap_*} fields)
    422 and one exists, then it may be included as well.
    423 
    424 If bit 2 in the @samp{flags} word is set, information about the video
    425 mode table (@pxref{Boot information format}) must be available to the
    426 kernel.
    427 
    428 If bit 16 in the @samp{flags} word is set, then the fields at offsets
    429 8-24 in the Multiboot header are valid, and the boot loader should use
    430 them instead of the fields in the actual executable header to calculate
    431 where to load the OS image. This information does not need to be
    432 provided if the kernel image is in @sc{elf} format, but it @emph{must}
    433 be provided if the images is in a.out format or in some other
    434 format. Compliant boot loaders must be able to load images that either
    435 are in @sc{elf} format or contain the load address information embedded
    436 in the Multiboot header; they may also directly support other executable
    437 formats, such as particular a.out variants, but are not required to.
    438 
    439 @item checksum
    440 The field @samp{checksum} is a 32-bit unsigned value which, when added
    441 to the other magic fields (i.e. @samp{magic} and @samp{flags}), must
    442 have a 32-bit unsigned sum of zero.
    443 @end table
    444 
    445 
    446 @node Header address fields
    447 @subsection The address fields of Multiboot header
    448 
    449 All of the address fields enabled by flag bit 16 are physical addresses.
    450 The meaning of each is as follows:
    451 
    452 @table @code
    453 @item header_addr
    454 Contains the address corresponding to the beginning of the Multiboot
    455 header --- the physical memory location at which the magic value is
    456 supposed to be loaded. This field serves to @dfn{synchronize} the
    457 mapping between OS image offsets and physical memory addresses.
    458 
    459 @item load_addr
    460 Contains the physical address of the beginning of the text segment. The
    461 offset in the OS image file at which to start loading is defined by the
    462 offset at which the header was found, minus (header_addr -
    463 load_addr). load_addr must be less than or equal to header_addr.
    464 
    465 @item load_end_addr
    466 Contains the physical address of the end of the data
    467 segment. (load_end_addr - load_addr) specifies how much data to load.
    468 This implies that the text and data segments must be consecutive in the
    469 OS image; this is true for existing a.out executable formats.
    470 If this field is zero, the boot loader assumes that the text and data
    471 segments occupy the whole OS image file.
    472 
    473 @item bss_end_addr
    474 Contains the physical address of the end of the bss segment. The boot
    475 loader initializes this area to zero, and reserves the memory it
    476 occupies to avoid placing boot modules and other data relevant to the
    477 operating system in that area. If this field is zero, the boot loader
    478 assumes that no bss segment is present.
    479 
    480 @item entry_addr
    481 The physical address to which the boot loader should jump in order to
    482 start running the operating system.
    483 @end table
    484 
    485 
    486 @node Header graphics fields
    487 @subsection The graphics fields of Multiboot header
    488 
    489 All of the graphics fields are enabled by flag bit 2. They specify the
    490 preferred graphics mode. Note that that is only a @emph{recommended}
    491 mode by the OS image. If the mode exists, the boot loader should set
    492 it, when the user doesn't specify a mode explicitly. Otherwise, the
    493 boot loader should fall back to a similar mode, if available.
    494 
    495 The meaning of each is as follows:
    496 
    497 @table @code
    498 @item mode_type
    499 Contains @samp{0} for linear graphics mode or @samp{1} for
    500 EGA-standard text mode. Everything else is reserved for future
    501 expansion. Note that the boot loader may set a text mode, even if this
    502 field contains @samp{0}.
    503 
    504 @item width
    505 Contains the number of the columns. This is specified in pixels in a
    506 graphics mode, and in characters in a text mode. The value zero
    507 indicates that the OS image has no preference.
    508 
    509 @item height
    510 Contains the number of the lines. This is specified in pixels in a
    511 graphics mode, and in characters in a text mode. The value zero
    512 indicates that the OS image has no preference.
    513 
    514 @item depth
    515 Contains the number of bits per pixel in a graphics mode, and zero in
    516 a text mode. The value zero indicates that the OS image has no
    517 preference.
    518 @end table
    519 
    520 
    521 @node Machine state
    522 @section Machine state
    523 
    524 When the boot loader invokes the 32-bit operating system, the machine
    525 must have the following state:
    526 
    527 @table @samp
    528 @item EAX
    529 Must contain the magic value @samp{0x2BADB002}; the presence of this
    530 value indicates to the operating system that it was loaded by a
    531 Multiboot-compliant boot loader (e.g. as opposed to another type of
    532 boot loader that the operating system can also be loaded from).
    533 
    534 @item EBX
    535 Must contain the 32-bit physical address of the Multiboot
    536 information structure provided by the boot loader (@pxref{Boot
    537 information format}).
    538 
    539 @item CS
    540 Must be a 32-bit read/execute code segment with an offset of @samp{0}
    541 and a limit of @samp{0xFFFFFFFF}. The exact value is undefined.
    542 
    543 @item DS
    544 @itemx ES
    545 @itemx FS
    546 @itemx GS
    547 @itemx SS
    548 Must be a 32-bit read/write data segment with an offset of @samp{0}
    549 and a limit of @samp{0xFFFFFFFF}. The exact values are all undefined.
    550 
    551 @item A20 gate
    552 Must be enabled.
    553 
    554 @item CR0
    555 Bit 31 (PG) must be cleared. Bit 0 (PE) must be set. Other bits are
    556 all undefined.
    557 
    558 @item EFLAGS
    559 Bit 17 (VM) must be cleared. Bit 9 (IF) must be cleared. Other bits
    560 are all undefined.
    561 @end table
    562 
    563 All other processor registers and flag bits are undefined. This
    564 includes, in particular:
    565 
    566 @table @samp
    567 @item ESP
    568 The OS image must create its own stack as soon as it needs one.
    569 
    570 @item GDTR
    571 Even though the segment registers are set up as described above, the
    572 @samp{GDTR} may be invalid, so the OS image must not load any segment
    573 registers (even just reloading the same values!) until it sets up its
    574 own @samp{GDT}.
    575 
    576 @item IDTR
    577 The OS image must leave interrupts disabled until it sets up its own
    578 @code{IDT}.
    579 @end table
    580 
    581 However, other machine state should be left by the boot loader in
    582 @dfn{normal working order}, i.e. as initialized by the @sc{bios} (or
    583 DOS, if that's what the boot loader runs from). In other words, the
    584 operating system should be able to make @sc{bios} calls and such after
    585 being loaded, as long as it does not overwrite the @sc{bios} data
    586 structures before doing so. Also, the boot loader must leave the
    587 @sc{pic} programmed with the normal @sc{bios}/DOS values, even if it
    588 changed them during the switch to 32-bit mode.
    589 
    590 
    591 @node Boot information format
    592 @section Boot information format
    593 
    594 FIXME: Split this chapter like the chapter ``OS image format''.
    595 
    596 Upon entry to the operating system, the @code{EBX} register contains the
    597 physical address of a @dfn{Multiboot information} data structure,
    598 through which the boot loader communicates vital information to the
    599 operating system. The operating system can use or ignore any parts of
    600 the structure as it chooses; all information passed by the boot loader
    601 is advisory only.
    602 
    603 The Multiboot information structure and its related substructures may be
    604 placed anywhere in memory by the boot loader (with the exception of the
    605 memory reserved for the kernel and boot modules, of course). It is the
    606 operating system's responsibility to avoid overwriting this memory until
    607 it is done using it.
    608 
    609 The format of the Multiboot information structure (as defined so far)
    610 follows:
    611 
    612 @example
    613 @group
    614         +-------------------+
    615 0       | flags             |    (required)
    616         +-------------------+
    617 4       | mem_lower         |    (present if flags[0] is set)
    618 8       | mem_upper         |    (present if flags[0] is set)
    619         +-------------------+
    620 12      | boot_device       |    (present if flags[1] is set)
    621         +-------------------+
    622 16      | cmdline           |    (present if flags[2] is set)
    623         +-------------------+
    624 20      | mods_count        |    (present if flags[3] is set)
    625 24      | mods_addr         |    (present if flags[3] is set)
    626         +-------------------+
    627 28 - 40 | syms              |    (present if flags[4] or
    628         |                   |                flags[5] is set)
    629         +-------------------+
    630 44      | mmap_length       |    (present if flags[6] is set)
    631 48      | mmap_addr         |    (present if flags[6] is set)
    632         +-------------------+
    633 52      | drives_length     |    (present if flags[7] is set)
    634 56      | drives_addr       |    (present if flags[7] is set)
    635         +-------------------+
    636 60      | config_table      |    (present if flags[8] is set)
    637         +-------------------+
    638 64      | boot_loader_name  |    (present if flags[9] is set)
    639         +-------------------+
    640 68      | apm_table         |    (present if flags[10] is set)
    641         +-------------------+
    642 72      | vbe_control_info  |    (present if flags[11] is set)
    643 76      | vbe_mode_info     |
    644 80      | vbe_mode          |
    645 82      | vbe_interface_seg |
    646 84      | vbe_interface_off |
    647 86      | vbe_interface_len |
    648         +-------------------+
    649 @end group
    650 @end example
    651 
    652 The first longword indicates the presence and validity of other fields
    653 in the Multiboot information structure. All as-yet-undefined bits must
    654 be set to zero by the boot loader. Any set bits that the operating
    655 system does not understand should be ignored. Thus, the @samp{flags}
    656 field also functions as a version indicator, allowing the Multiboot
    657 information structure to be expanded in the future without breaking
    658 anything.
    659 
    660 If bit 0 in the @samp{flags} word is set, then the @samp{mem_*} fields
    661 are valid. @samp{mem_lower} and @samp{mem_upper} indicate the amount of
    662 lower and upper memory, respectively, in kilobytes. Lower memory starts
    663 at address 0, and upper memory starts at address 1 megabyte. The maximum
    664 possible value for lower memory is 640 kilobytes. The value returned for
    665 upper memory is maximally the address of the first upper memory hole
    666 minus 1 megabyte. It is not guaranteed to be this value.
    667 
    668 If bit 1 in the @samp{flags} word is set, then the @samp{boot_device}
    669 field is valid, and indicates which @sc{bios} disk device the boot
    670 loader loaded the OS image from. If the OS image was not loaded from a
    671 @sc{bios} disk, then this field must not be present (bit 3 must be
    672 clear). The operating system may use this field as a hint for
    673 determining its own @dfn{root} device, but is not required to. The
    674 @samp{boot_device} field is laid out in four one-byte subfields as
    675 follows:
    676 
    677 @example
    678 @group
    679 +-------+-------+-------+-------+
    680 | drive | part1 | part2 | part3 |
    681 +-------+-------+-------+-------+
    682 @end group
    683 @end example
    684 
    685 The first byte contains the @sc{bios} drive number as understood by the
    686 @sc{bios} INT 0x13 low-level disk interface: e.g. 0x00 for the first
    687 floppy disk or 0x80 for the first hard disk.
    688 
    689 The three remaining bytes specify the boot partition. @samp{part1}
    690 specifies the @dfn{top-level} partition number, @samp{part2} specifies a
    691 @dfn{sub-partition} in the top-level partition, etc. Partition numbers
    692 always start from zero. Unused partition bytes must be set to 0xFF. For
    693 example, if the disk is partitioned using a simple one-level DOS
    694 partitioning scheme, then @samp{part1} contains the DOS partition
    695 number, and @samp{part2} and @samp{part3} are both 0xFF. As another
    696 example, if a disk is partitioned first into DOS partitions, and then
    697 one of those DOS partitions is subdivided into several BSD partitions
    698 using BSD's @dfn{disklabel} strategy, then @samp{part1} contains the DOS
    699 partition number, @samp{part2} contains the BSD sub-partition within
    700 that DOS partition, and @samp{part3} is 0xFF.
    701 
    702 DOS extended partitions are indicated as partition numbers starting from
    703 4 and increasing, rather than as nested sub-partitions, even though the
    704 underlying disk layout of extended partitions is hierarchical in
    705 nature. For example, if the boot loader boots from the second extended
    706 partition on a disk partitioned in conventional DOS style, then
    707 @samp{part1} will be 5, and @samp{part2} and @samp{part3} will both be
    708 0xFF.
    709 
    710 If bit 2 of the @samp{flags} longword is set, the @samp{cmdline} field
    711 is valid, and contains the physical address of the command line to
    712 be passed to the kernel. The command line is a normal C-style
    713 zero-terminated string.
    714 
    715 If bit 3 of the @samp{flags} is set, then the @samp{mods} fields
    716 indicate to the kernel what boot modules were loaded along with the
    717 kernel image, and where they can be found. @samp{mods_count} contains
    718 the number of modules loaded; @samp{mods_addr} contains the physical
    719 address of the first module structure. @samp{mods_count} may be zero,
    720 indicating no boot modules were loaded, even if bit 1 of @samp{flags} is
    721 set. Each module structure is formatted as follows:
    722 
    723 @example
    724 @group
    725         +-------------------+
    726 0       | mod_start         |
    727 4       | mod_end           |
    728         +-------------------+
    729 8       | string            |
    730         +-------------------+
    731 12      | reserved (0)      |
    732         +-------------------+
    733 @end group
    734 @end example
    735 
    736 The first two fields contain the start and end addresses of the boot
    737 module itself. The @samp{string} field provides an arbitrary string to
    738 be associated with that particular boot module; it is a zero-terminated
    739 ASCII string, just like the kernel command line. The @samp{string} field
    740 may be 0 if there is no string associated with the module. Typically the
    741 string might be a command line (e.g. if the operating system treats boot
    742 modules as executable programs), or a pathname (e.g. if the operating
    743 system treats boot modules as files in a file system), but its exact use
    744 is specific to the operating system. The @samp{reserved} field must be
    745 set to 0 by the boot loader and ignored by the operating system.
    746 
    747 @strong{Caution:} Bits 4 & 5 are mutually exclusive.
    748 
    749 If bit 4 in the @samp{flags} word is set, then the following fields in
    750 the Multiboot information structure starting at byte 28 are valid:
    751 
    752 @example
    753 @group
    754         +-------------------+
    755 28      | tabsize           |
    756 32      | strsize           |
    757 36      | addr              |
    758 40      | reserved (0)      |
    759         +-------------------+
    760 @end group
    761 @end example
    762 
    763 These indicate where the symbol table from an a.out kernel image can be
    764 found. @samp{addr} is the physical address of the size (4-byte unsigned
    765 long) of an array of a.out format @dfn{nlist} structures, followed
    766 immediately by the array itself, then the size (4-byte unsigned long) of
    767 a set of zero-terminated @sc{ascii} strings (plus sizeof(unsigned long) in
    768 this case), and finally the set of strings itself. @samp{tabsize} is
    769 equal to its size parameter (found at the beginning of the symbol
    770 section), and @samp{strsize} is equal to its size parameter (found at
    771 the beginning of the string section) of the following string table to
    772 which the symbol table refers. Note that @samp{tabsize} may be 0,
    773 indicating no symbols, even if bit 4 in the @samp{flags} word is set.
    774 
    775 If bit 5 in the @samp{flags} word is set, then the following fields in
    776 the Multiboot information structure starting at byte 28 are valid:
    777 
    778 @example
    779 @group
    780         +-------------------+
    781 28      | num               |
    782 32      | size              |
    783 36      | addr              |
    784 40      | shndx             |
    785         +-------------------+
    786 @end group
    787 @end example
    788 
    789 These indicate where the section header table from an ELF kernel is, the
    790 size of each entry, number of entries, and the string table used as the
    791 index of names. They correspond to the @samp{shdr_*} entries
    792 (@samp{shdr_num}, etc.) in the Executable and Linkable Format (@sc{elf})
    793 specification in the program header. All sections are loaded, and the
    794 physical address fields of the @sc{elf} section header then refer to where
    795 the sections are in memory (refer to the i386 @sc{elf} documentation for
    796 details as to how to read the section header(s)). Note that
    797 @samp{shdr_num} may be 0, indicating no symbols, even if bit 5 in the
    798 @samp{flags} word is set.
    799 
    800 If bit 6 in the @samp{flags} word is set, then the @samp{mmap_*} fields
    801 are valid, and indicate the address and length of a buffer containing a
    802 memory map of the machine provided by the @sc{bios}. @samp{mmap_addr} is
    803 the address, and @samp{mmap_length} is the total size of the buffer. The
    804 buffer consists of one or more of the following size/structure pairs
    805 (@samp{size} is really used for skipping to the next pair):
    806 
    807 @example
    808 @group
    809         +-------------------+
    810 -4      | size              |
    811         +-------------------+
    812 0       | base_addr_low     |
    813 4       | base_addr_high    |
    814 8       | length_low        |
    815 12      | length_high       |
    816 16      | type              |
    817         +-------------------+
    818 @end group
    819 @end example
    820 
    821 where @samp{size} is the size of the associated structure in bytes, which
    822 can be greater than the minimum of 20 bytes. @samp{base_addr_low} is the
    823 lower 32 bits of the starting address, and @samp{base_addr_high} is the
    824 upper 32 bits, for a total of a 64-bit starting address. @samp{length_low}
    825 is the lower 32 bits of the size of the memory region in bytes, and
    826 @samp{length_high} is the upper 32 bits, for a total of a 64-bit
    827 length. @samp{type} is the variety of address range represented, where a
    828 value of 1 indicates available @sc{ram}, and all other values currently
    829 indicated a reserved area.
    830 
    831 The map provided is guaranteed to list all standard @sc{ram} that should
    832 be available for normal use.
    833 
    834 If bit 7 in the @samp{flags} is set, then the @samp{drives_*} fields
    835 are valid, and indicate the address of the physical address of the first
    836 drive structure and the size of drive structures. @samp{drives_addr}
    837 is the address, and @samp{drives_length} is the total size of drive
    838 structures. Note that @samp{drives_length} may be zero. Each drive
    839 structure is formatted as follows:
    840 
    841 @example
    842 @group
    843         +-------------------+
    844 0       | size              |
    845         +-------------------+
    846 4       | drive_number      |
    847         +-------------------+
    848 5       | drive_mode        |
    849         +-------------------+
    850 6       | drive_cylinders   |
    851 8       | drive_heads       |
    852 9       | drive_sectors     |
    853         +-------------------+
    854 10 - xx | drive_ports       |
    855         +-------------------+
    856 @end group
    857 @end example
    858 
    859 The @samp{size} field specifies the size of this structure. The size
    860 varies, depending on the number of ports. Note that the size may not be
    861 equal to (10 + 2 * the number of ports), because of an alignment.
    862 
    863 The @samp{drive_number} field contains the BIOS drive number. The
    864 @samp{drive_mode} field represents the access mode used by the boot
    865 loader. Currently, the following modes are defined:
    866 
    867 @table @samp
    868 @item 0
    869 CHS mode (traditional cylinder/head/sector addressing mode).
    870 
    871 @item 1
    872 LBA mode (Logical Block Addressing mode).
    873 @end table
    874 
    875 The three fields, @samp{drive_cylinders}, @samp{drive_heads} and
    876 @samp{drive_sectors}, indicate the geometry of the drive detected by the
    877 @sc{bios}. @samp{drive_cylinders} contains the number of the
    878 cylinders. @samp{drive_heads} contains the number of the
    879 heads. @samp{drive_sectors} contains the number of the sectors per
    880 track.
    881 
    882 The @samp{drive_ports} field contains the array of the I/O ports used
    883 for the drive in the @sc{bios} code. The array consists of zero or more
    884 unsigned two-bytes integers, and is terminated with zero. Note that the
    885 array may contain any number of I/O ports that are not related to the
    886 drive actually (such as @sc{dma} controller's ports).
    887 
    888 If bit 8 in the @samp{flags} is set, then the @samp{config_table} field
    889 is valid, and indicates the address of the @sc{rom} configuration table
    890 returned by the @dfn{GET CONFIGURATION} @sc{bios} call. If the @sc{bios}
    891 call fails, then the size of the table must be @emph{zero}.
    892 
    893 If bit 9 in the @samp{flags} is set, the @samp{boot_loader_name} field
    894 is valid, and contains the physical address of the name of a boot
    895 loader booting the kernel. The name is a normal C-style zero-terminated
    896 string.
    897 
    898 If bit 10 in the @samp{flags} is set, the @samp{apm_table} field is
    899 valid, and contains the physical address of an @sc{apm} table defined as
    900 below:
    901 
    902 @example
    903 @group
    904         +----------------------+
    905 0       | version              |
    906 2       | cseg                 |
    907 4       | offset               |
    908 8       | cseg_16              |
    909 10      | dseg                 |
    910 12      | flags                |
    911 14      | cseg_len             |
    912 16      | cseg_16_len          |
    913 18      | dseg_len             |
    914         +----------------------+
    915 @end group
    916 @end example
    917 
    918 The fields @samp{version}, @samp{cseg}, @samp{offset}, @samp{cseg_16},
    919 @samp{dseg}, @samp{flags}, @samp{cseg_len}, @samp{cseg_16_len},
    920 @samp{dseg_len} indicate the version number, the protected mode 32-bit
    921 code segment, the offset of the entry point, the protected mode 16-bit
    922 code segment, the protected mode 16-bit data segment, the flags, the
    923 length of the protected mode 32-bit code segment, the length of the
    924 protected mode 16-bit code segment, and the length of the protected mode
    925 16-bit data segment, respectively. Only the field @samp{offset} is 4
    926 bytes, and the others are 2 bytes. See
    927 @uref{http://www.microsoft.com/hwdev/busbios/amp_12.htm, Advanced Power
    928 Management (APM) BIOS Interface Specification}, for more information.
    929 
    930 If bit 11 in the @samp{flags} is set, the graphics table is available.
    931 This must only be done if the kernel has indicated in the
    932 @samp{Multiboot Header} that it accepts a graphics mode.
    933 
    934 The fields @samp{vbe_control_info} and @samp{vbe_mode_info} contain
    935 the physical addresses of @sc{vbe} control information returned by the
    936 @sc{vbe} Function 00h and @sc{vbe} mode information returned by the
    937 @sc{vbe} Function 01h, respectively.
    938 
    939 The field @samp{vbe_mode} indicates current video mode in the format
    940 specified in @sc{vbe} 3.0.
    941 
    942 The rest fields @samp{vbe_interface_seg}, @samp{vbe_interface_off}, and
    943 @samp{vbe_interface_len} contain the table of a protected mode interface
    944 defined in @sc{vbe} 2.0+. If this information is not available, those
    945 fields contain zero. Note that @sc{vbe} 3.0 defines another protected
    946 mode interface which is incompatible with the old one. If you want to
    947 use the new protected mode interface, you will have to find the table
    948 yourself.
    949 
    950 The fields for the graphics table are designed for @sc{vbe}, but
    951 Multiboot boot loaders may simulate @sc{vbe} on non-@sc{vbe} modes, as
    952 if they were @sc{vbe} modes.
    953 
    954 
    955 @node Examples
    956 @chapter Examples
    957 
    958 @strong{Caution:} The following items are not part of the specification
    959 document, but are included for prospective operating system and boot
    960 loader writers.
    961 
    962 @menu
    963 * Notes on PC::                 
    964 * BIOS device mapping techniques::  
    965 * Example OS code::             
    966 * Example boot loader code::    
    967 @end menu
    968 
    969 
    970 @node Notes on PC
    971 @section Notes on PC
    972 
    973 In reference to bit 0 of the @samp{flags} parameter in the Multiboot
    974 information structure, if the bootloader in question uses older
    975 @sc{bios} interfaces, or the newest ones are not available (see
    976 description about bit 6), then a maximum of either 15 or 63 megabytes of
    977 memory may be reported. It is @emph{highly} recommended that boot
    978 loaders perform a thorough memory probe.
    979 
    980 In reference to bit 1 of the @samp{flags} parameter in the Multiboot
    981 information structure, it is recognized that determination of which
    982 @sc{bios} drive maps to which device driver in an operating system is
    983 non-trivial, at best. Many kludges have been made to various operating
    984 systems instead of solving this problem, most of them breaking under
    985 many conditions. To encourage the use of general-purpose solutions to
    986 this problem, there are 2 @sc{bios} device mapping techniques
    987 (@pxref{BIOS device mapping techniques}). 
    988 
    989 In reference to bit 6 of the @samp{flags} parameter in the Multiboot
    990 information structure, it is important to note that the data structure
    991 used there (starting with @samp{BaseAddrLow}) is the data returned by
    992 the INT 15h, AX=E820h --- Query System Address Map call. See @xref{Query
    993 System Address Map, , Query System Address Map, grub.info, The GRUB
    994 Manual}, for more information. The interface here is meant to allow a
    995 boot loader to work unmodified with any reasonable extensions of the
    996 @sc{bios} interface, passing along any extra data to be interpreted by
    997 the operating system as desired.
    998 
    999 
   1000 @node BIOS device mapping techniques
   1001 @section BIOS device mapping techniques
   1002 
   1003 Both of these techniques should be usable from any PC operating system,
   1004 and neither require any special support in the drivers themselves. This
   1005 section will be flushed out into detailed explanations, particularly for
   1006 the I/O restriction technique.
   1007 
   1008 The general rule is that the data comparison technique is the quick and
   1009 dirty solution. It works most of the time, but doesn't cover all the
   1010 bases, and is relatively simple.
   1011 
   1012 The I/O restriction technique is much more complex, but it has potential
   1013 to solve the problem under all conditions, plus allow access of the
   1014 remaining @sc{bios} devices when not all of them have operating system
   1015 drivers.
   1016 
   1017 @menu
   1018 * Data comparison technique::   
   1019 * I/O restriction technique::   
   1020 @end menu
   1021 
   1022 
   1023 @node Data comparison technique
   1024 @subsection Data comparison technique
   1025 
   1026 Before activating @emph{any} of the device drivers, gather enough data
   1027 from similar sectors on each of the disks such that each one can be
   1028 uniquely identified.
   1029 
   1030 After activating the device drivers, compare data from the drives using
   1031 the operating system drivers. This should hopefully be sufficient to
   1032 provide such a mapping.
   1033 
   1034 Problems:
   1035 
   1036 @enumerate
   1037 @item
   1038 The data on some @sc{bios} devices might be identical (so the part
   1039 reading the drives from the @sc{bios} should have some mechanism to give
   1040 up).
   1041 
   1042 @item
   1043 There might be extra drives not accessible from the @sc{bios} which are
   1044 identical to some drive used by the @sc{bios} (so it should be capable
   1045 of giving up there as well).
   1046 @end enumerate
   1047 
   1048 
   1049 @node I/O restriction technique
   1050 @subsection I/O restriction technique
   1051 
   1052 This first step may be unnecessary, but first create copy-on-write
   1053 mappings for the device drivers writing into @sc{pc} @sc{ram}. Keep the
   1054 original copies for the @dfn{clean @sc{bios} virtual machine} to be
   1055 created later.
   1056 
   1057 For each device driver brought online, determine which @sc{bios} devices
   1058 become inaccessible by:
   1059 
   1060 @enumerate
   1061 @item
   1062 Create a @dfn{clean @sc{bios} virtual machine}.
   1063 
   1064 @item
   1065 Set the I/O permission map for the I/O area claimed by the device driver
   1066 to no permissions (neither read nor write).
   1067 
   1068 @item
   1069 Access each device.
   1070 
   1071 @item
   1072 Record which devices succeed, and those which try to access the
   1073 @dfn{restricted} I/O areas (hopefully, this will be an @dfn{xor}
   1074 situation).
   1075 @end enumerate
   1076 
   1077 For each device driver, given how many of the @sc{bios} devices were
   1078 subsumed by it (there should be no gaps in this list), it should be easy
   1079 to determine which devices on the controller these are.
   1080 
   1081 In general, you have at most 2 disks from each controller given
   1082 @sc{bios} numbers, but they pretty much always count from the lowest
   1083 logically numbered devices on the controller.
   1084 
   1085 
   1086 @node Example OS code
   1087 @section Example OS code
   1088 
   1089 In this distribution, the example Multiboot kernel @file{kernel} is
   1090 included. The kernel just prints out the Multiboot information structure
   1091 on the screen, so you can make use of the kernel to test a
   1092 Multiboot-compliant boot loader and for reference to how to implement a
   1093 Multiboot kernel. The source files can be found under the directory
   1094 @file{docs} in the GRUB distribution.
   1095 
   1096 The kernel @file{kernel} consists of only three files: @file{boot.S},
   1097 @file{kernel.c} and @file{multiboot.h}. The assembly source
   1098 @file{boot.S} is written in GAS (@pxref{Top, , GNU assembler, as.info,
   1099 The GNU assembler}), and contains the Multiboot information structure to
   1100 comply with the specification. When a Multiboot-compliant boot loader
   1101 loads and execute it, it initialize the stack pointer and @code{EFLAGS},
   1102 and then call the function @code{cmain} defined in @file{kernel.c}. If
   1103 @code{cmain} returns to the callee, then it shows a message to inform
   1104 the user of the halt state and stops forever until you push the reset
   1105 key. The file @file{kernel.c} contains the function @code{cmain},
   1106 which checks if the magic number passed by the boot loader is valid and
   1107 so on, and some functions to print messages on the screen. The file
   1108 @file{multiboot.h} defines some macros, such as the magic number for the
   1109 Multiboot header, the Multiboot header structure and the Multiboot
   1110 information structure.
   1111 
   1112 @menu
   1113 * multiboot.h::                 
   1114 * boot.S::                      
   1115 * kernel.c::                    
   1116 * Other Multiboot kernels::     
   1117 @end menu
   1118 
   1119 
   1120 @node multiboot.h
   1121 @subsection multiboot.h
   1122 
   1123 This is the source code in the file @file{multiboot.h}:
   1124 
   1125 @example
   1126 @include multiboot.h.texi
   1127 @end example
   1128 
   1129 
   1130 @node boot.S
   1131 @subsection boot.S
   1132 
   1133 In the file @file{boot.S}:
   1134 
   1135 @example
   1136 @include boot.S.texi
   1137 @end example
   1138 
   1139 
   1140 @node kernel.c
   1141 @subsection kernel.c
   1142 
   1143 And, in the file @file{kernel.c}:
   1144 
   1145 @example
   1146 @include kernel.c.texi
   1147 @end example
   1148 
   1149 
   1150 @node Other Multiboot kernels
   1151 @subsection Other Multiboot kernels
   1152 
   1153 Other useful information should be available in Multiboot kernels, such
   1154 as GNU Mach and Fiasco @url{http://os.inf.tu-dresden.de/fiasco/}. And,
   1155 it is worth mentioning the OSKit
   1156 @url{http://www.cs.utah.edu/projects/flux/oskit/}, which provides a
   1157 library supporting the specification.
   1158 
   1159 
   1160 @node Example boot loader code
   1161 @section Example boot loader code
   1162 
   1163 The GNU GRUB (@pxref{Top, , GRUB, grub.info, The GRUB manual}) project
   1164 is a full Multiboot-compliant boot loader, supporting all required and
   1165 optional features present in this specification. A public release has
   1166 not been made, but the test release is available from:
   1167 
   1168 @url{ftp://alpha.gnu.org/gnu/grub}
   1169 
   1170 See the webpage @url{http://www.gnu.org/software/grub/grub.html}, for
   1171 more information.
   1172 
   1173 
   1174 @node History
   1175 @chapter The change log of this specification
   1176 
   1177 @table @asis
   1178 @item 0.7
   1179 @itemize @bullet
   1180 @item
   1181 @dfn{Multiboot Standard} is renamed to @dfn{Multiboot Specification}.
   1182 
   1183 @item
   1184 Graphics fields are added to Multiboot header.
   1185 
   1186 @item
   1187 BIOS drive information, BIOS configuration table, the name of a boot
   1188 loader, APM information, and graphics information are added to Multiboot
   1189 information.
   1190 
   1191 @item
   1192 Rewritten in Texinfo format.
   1193 
   1194 @item
   1195 Rewritten, using more strict words.
   1196 
   1197 @item
   1198 The maintainer changes to the GNU GRUB maintainer team
   1199 @email{bug-grub@@gnu.org}, from Bryan Ford and Erich Stefan Boleyn.
   1200 @end itemize
   1201 
   1202 @item 0.6
   1203 @itemize @bullet
   1204 @item
   1205 A few wording changes.
   1206 
   1207 @item
   1208 Header checksum.
   1209 
   1210 @item
   1211 Clasification of machine state passed to an operating system.
   1212 @end itemize
   1213 
   1214 @item 0.5
   1215 @itemize @bullet
   1216 @item
   1217 Name change.
   1218 @end itemize
   1219 
   1220 @item 0.4
   1221 @itemize @bullet
   1222 @item
   1223 Major changes plus HTMLification.
   1224 @end itemize
   1225 @end table
   1226 
   1227 
   1228 @node Index
   1229 @unnumbered Index
   1230 
   1231 @printindex cp
   1232 
   1233 @contents
   1234 @bye
   1235