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