xref: /onnv-gate/usr/src/grub/grub-0.97/docs/multiboot.info (revision 8044:b3af80bbf173)
1*8044SWilliam.Kucharski@Sun.COMThis is ../../docs/multiboot.info, produced by makeinfo version 4.7
2*8044SWilliam.Kucharski@Sun.COMfrom ../../docs/multiboot.texi.
3*8044SWilliam.Kucharski@Sun.COM
4*8044SWilliam.Kucharski@Sun.COMINFO-DIR-SECTION Kernel
5*8044SWilliam.Kucharski@Sun.COMSTART-INFO-DIR-ENTRY
6*8044SWilliam.Kucharski@Sun.COM* Multiboot Specification: (multiboot).		Multiboot Specification.
7*8044SWilliam.Kucharski@Sun.COMEND-INFO-DIR-ENTRY
8*8044SWilliam.Kucharski@Sun.COM
9*8044SWilliam.Kucharski@Sun.COM   Copyright (C) 1995, 96 Bryan Ford <baford@cs.utah.edu> Copyright (C)
10*8044SWilliam.Kucharski@Sun.COM1995, 96 Erich Stefan Boleyn <erich@uruk.org> Copyright (C) 1999, 2000,
11*8044SWilliam.Kucharski@Sun.COM2001, 2002 Free Software Foundation, Inc.
12*8044SWilliam.Kucharski@Sun.COM
13*8044SWilliam.Kucharski@Sun.COM   Permission is granted to make and distribute verbatim copies of this
14*8044SWilliam.Kucharski@Sun.COMmanual provided the copyright notice and this permission notice are
15*8044SWilliam.Kucharski@Sun.COMpreserved on all copies.
16*8044SWilliam.Kucharski@Sun.COM
17*8044SWilliam.Kucharski@Sun.COM   Permission is granted to copy and distribute modified versions of
18*8044SWilliam.Kucharski@Sun.COMthis manual under the conditions for verbatim copying, provided also
19*8044SWilliam.Kucharski@Sun.COMthat the entire resulting derived work is distributed under the terms
20*8044SWilliam.Kucharski@Sun.COMof a permission notice identical to this one.
21*8044SWilliam.Kucharski@Sun.COM
22*8044SWilliam.Kucharski@Sun.COM   Permission is granted to copy and distribute translations of this
23*8044SWilliam.Kucharski@Sun.COMmanual into another language, under the above conditions for modified
24*8044SWilliam.Kucharski@Sun.COMversions.
25*8044SWilliam.Kucharski@Sun.COM
26*8044SWilliam.Kucharski@Sun.COM
27*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Top,  Next: Overview,  Up: (dir)
28*8044SWilliam.Kucharski@Sun.COM
29*8044SWilliam.Kucharski@Sun.COMMultiboot Specification
30*8044SWilliam.Kucharski@Sun.COM***********************
31*8044SWilliam.Kucharski@Sun.COM
32*8044SWilliam.Kucharski@Sun.COMThis file documents Multiboot Specification, the proposal for the boot
33*8044SWilliam.Kucharski@Sun.COMsequence standard. This edition documents version 0.6.93.
34*8044SWilliam.Kucharski@Sun.COM
35*8044SWilliam.Kucharski@Sun.COM* Menu:
36*8044SWilliam.Kucharski@Sun.COM
37*8044SWilliam.Kucharski@Sun.COM* Overview::
38*8044SWilliam.Kucharski@Sun.COM* Terminology::
39*8044SWilliam.Kucharski@Sun.COM* Specification::
40*8044SWilliam.Kucharski@Sun.COM* Examples::
41*8044SWilliam.Kucharski@Sun.COM* History::
42*8044SWilliam.Kucharski@Sun.COM* Index::
43*8044SWilliam.Kucharski@Sun.COM
44*8044SWilliam.Kucharski@Sun.COM
45*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Overview,  Next: Terminology,  Prev: Top,  Up: Top
46*8044SWilliam.Kucharski@Sun.COM
47*8044SWilliam.Kucharski@Sun.COM1 Introduction to Multiboot Specification
48*8044SWilliam.Kucharski@Sun.COM*****************************************
49*8044SWilliam.Kucharski@Sun.COM
50*8044SWilliam.Kucharski@Sun.COMThis chapter describes some rough information on the Multiboot
51*8044SWilliam.Kucharski@Sun.COMSpecification. Note that this is not a part of the specification itself.
52*8044SWilliam.Kucharski@Sun.COM
53*8044SWilliam.Kucharski@Sun.COM* Menu:
54*8044SWilliam.Kucharski@Sun.COM
55*8044SWilliam.Kucharski@Sun.COM* Motivation::
56*8044SWilliam.Kucharski@Sun.COM* Architecture::
57*8044SWilliam.Kucharski@Sun.COM* Operating systems::
58*8044SWilliam.Kucharski@Sun.COM* Boot sources::
59*8044SWilliam.Kucharski@Sun.COM* Boot-time configuration::
60*8044SWilliam.Kucharski@Sun.COM* Convenience to operating systems::
61*8044SWilliam.Kucharski@Sun.COM* Boot modules::
62*8044SWilliam.Kucharski@Sun.COM
63*8044SWilliam.Kucharski@Sun.COM
64*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Motivation,  Next: Architecture,  Up: Overview
65*8044SWilliam.Kucharski@Sun.COM
66*8044SWilliam.Kucharski@Sun.COM1.1 The background of Multiboot Specification
67*8044SWilliam.Kucharski@Sun.COM=============================================
68*8044SWilliam.Kucharski@Sun.COM
69*8044SWilliam.Kucharski@Sun.COMEvery operating system ever created tends to have its own boot loader.
70*8044SWilliam.Kucharski@Sun.COMInstalling a new operating system on a machine generally involves
71*8044SWilliam.Kucharski@Sun.COMinstalling a whole new set of boot mechanisms, each with completely
72*8044SWilliam.Kucharski@Sun.COMdifferent install-time and boot-time user interfaces. Getting multiple
73*8044SWilliam.Kucharski@Sun.COMoperating systems to coexist reliably on one machine through typical
74*8044SWilliam.Kucharski@Sun.COM"chaining" mechanisms can be a nightmare. There is little or no choice
75*8044SWilliam.Kucharski@Sun.COMof boot loaders for a particular operating system -- if the one that
76*8044SWilliam.Kucharski@Sun.COMcomes with the operating system doesn't do exactly what you want, or
77*8044SWilliam.Kucharski@Sun.COMdoesn't work on your machine, you're screwed.
78*8044SWilliam.Kucharski@Sun.COM
79*8044SWilliam.Kucharski@Sun.COM   While we may not be able to fix this problem in existing commercial
80*8044SWilliam.Kucharski@Sun.COMoperating systems, it shouldn't be too difficult for a few people in the
81*8044SWilliam.Kucharski@Sun.COMfree operating system communities to put their heads together and solve
82*8044SWilliam.Kucharski@Sun.COMthis problem for the popular free operating systems. That's what this
83*8044SWilliam.Kucharski@Sun.COMspecification aims for. Basically, it specifies an interface between a
84*8044SWilliam.Kucharski@Sun.COMboot loader and a operating system, such that any complying boot loader
85*8044SWilliam.Kucharski@Sun.COMshould be able to load any complying operating system. This
86*8044SWilliam.Kucharski@Sun.COMspecification does _not_ specify how boot loaders should work -- only
87*8044SWilliam.Kucharski@Sun.COMhow they must interface with the operating system being loaded.
88*8044SWilliam.Kucharski@Sun.COM
89*8044SWilliam.Kucharski@Sun.COM
90*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Architecture,  Next: Operating systems,  Prev: Motivation,  Up: Overview
91*8044SWilliam.Kucharski@Sun.COM
92*8044SWilliam.Kucharski@Sun.COM1.2 The target architecture
93*8044SWilliam.Kucharski@Sun.COM===========================
94*8044SWilliam.Kucharski@Sun.COM
95*8044SWilliam.Kucharski@Sun.COMThis specification is primarily targeted at PC, since they are the most
96*8044SWilliam.Kucharski@Sun.COMcommon and have the largest variety of operating systems and boot
97*8044SWilliam.Kucharski@Sun.COMloaders. However, to the extent that certain other architectures may
98*8044SWilliam.Kucharski@Sun.COMneed a boot specification and do not have one already, a variation of
99*8044SWilliam.Kucharski@Sun.COMthis specification, stripped of the x86-specific details, could be
100*8044SWilliam.Kucharski@Sun.COMadopted for them as well.
101*8044SWilliam.Kucharski@Sun.COM
102*8044SWilliam.Kucharski@Sun.COM
103*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Operating systems,  Next: Boot sources,  Prev: Architecture,  Up: Overview
104*8044SWilliam.Kucharski@Sun.COM
105*8044SWilliam.Kucharski@Sun.COM1.3 The target operating systems
106*8044SWilliam.Kucharski@Sun.COM================================
107*8044SWilliam.Kucharski@Sun.COM
108*8044SWilliam.Kucharski@Sun.COMThis specification is targeted toward free 32-bit operating systems
109*8044SWilliam.Kucharski@Sun.COMthat can be fairly easily modified to support the specification without
110*8044SWilliam.Kucharski@Sun.COMgoing through lots of bureaucratic rigmarole. The particular free
111*8044SWilliam.Kucharski@Sun.COMoperating systems that this specification is being primarily designed
112*8044SWilliam.Kucharski@Sun.COMfor are Linux, FreeBSD, NetBSD, Mach, and VSTa. It is hoped that other
113*8044SWilliam.Kucharski@Sun.COMemerging free operating systems will adopt it from the start, and thus
114*8044SWilliam.Kucharski@Sun.COMimmediately be able to take advantage of existing boot loaders. It would
115*8044SWilliam.Kucharski@Sun.COMbe nice if commercial operating system vendors eventually adopted this
116*8044SWilliam.Kucharski@Sun.COMspecification as well, but that's probably a pipe dream.
117*8044SWilliam.Kucharski@Sun.COM
118*8044SWilliam.Kucharski@Sun.COM
119*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Boot sources,  Next: Boot-time configuration,  Prev: Operating systems,  Up: Overview
120*8044SWilliam.Kucharski@Sun.COM
121*8044SWilliam.Kucharski@Sun.COM1.4 Boot sources
122*8044SWilliam.Kucharski@Sun.COM================
123*8044SWilliam.Kucharski@Sun.COM
124*8044SWilliam.Kucharski@Sun.COMIt should be possible to write compliant boot loaders that load the OS
125*8044SWilliam.Kucharski@Sun.COMimage from a variety of sources, including floppy disk, hard disk, and
126*8044SWilliam.Kucharski@Sun.COMacross a network.
127*8044SWilliam.Kucharski@Sun.COM
128*8044SWilliam.Kucharski@Sun.COM   Disk-based boot loaders may use a variety of techniques to find the
129*8044SWilliam.Kucharski@Sun.COMrelevant OS image and boot module data on disk, such as by
130*8044SWilliam.Kucharski@Sun.COMinterpretation of specific file systems (e.g. the BSD/Mach boot loader),
131*8044SWilliam.Kucharski@Sun.COMusing precalculated "block lists" (e.g. LILO), loading from a special
132*8044SWilliam.Kucharski@Sun.COM"boot partition" (e.g. OS/2), or even loading from within another
133*8044SWilliam.Kucharski@Sun.COMoperating system (e.g. the VSTa boot code, which loads from DOS).
134*8044SWilliam.Kucharski@Sun.COMSimilarly, network-based boot loaders could use a variety of network
135*8044SWilliam.Kucharski@Sun.COMhardware and protocols.
136*8044SWilliam.Kucharski@Sun.COM
137*8044SWilliam.Kucharski@Sun.COM   It is hoped that boot loaders will be created that support multiple
138*8044SWilliam.Kucharski@Sun.COMloading mechanisms, increasing their portability, robustness, and
139*8044SWilliam.Kucharski@Sun.COMuser-friendliness.
140*8044SWilliam.Kucharski@Sun.COM
141*8044SWilliam.Kucharski@Sun.COM
142*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Boot-time configuration,  Next: Convenience to operating systems,  Prev: Boot sources,  Up: Overview
143*8044SWilliam.Kucharski@Sun.COM
144*8044SWilliam.Kucharski@Sun.COM1.5 Configure an operating system at boot-time
145*8044SWilliam.Kucharski@Sun.COM==============================================
146*8044SWilliam.Kucharski@Sun.COM
147*8044SWilliam.Kucharski@Sun.COMIt is often necessary for one reason or another for the user to be able
148*8044SWilliam.Kucharski@Sun.COMto provide some configuration information to an operating system
149*8044SWilliam.Kucharski@Sun.COMdynamically at boot time. While this specification should not dictate
150*8044SWilliam.Kucharski@Sun.COMhow this configuration information is obtained by the boot loader, it
151*8044SWilliam.Kucharski@Sun.COMshould provide a standard means for the boot loader to pass such
152*8044SWilliam.Kucharski@Sun.COMinformation to the operating system.
153*8044SWilliam.Kucharski@Sun.COM
154*8044SWilliam.Kucharski@Sun.COM
155*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Convenience to operating systems,  Next: Boot modules,  Prev: Boot-time configuration,  Up: Overview
156*8044SWilliam.Kucharski@Sun.COM
157*8044SWilliam.Kucharski@Sun.COM1.6 How to make OS development easier
158*8044SWilliam.Kucharski@Sun.COM=====================================
159*8044SWilliam.Kucharski@Sun.COM
160*8044SWilliam.Kucharski@Sun.COMOS images should be easy to generate. Ideally, an OS image should simply
161*8044SWilliam.Kucharski@Sun.COMbe an ordinary 32-bit executable file in whatever file format the
162*8044SWilliam.Kucharski@Sun.COMoperating system normally uses. It should be possible to `nm' or
163*8044SWilliam.Kucharski@Sun.COMdisassemble OS images just like normal executables. Specialized tools
164*8044SWilliam.Kucharski@Sun.COMshould not be required to create OS images in a _special_ file format.
165*8044SWilliam.Kucharski@Sun.COMIf this means shifting some work from the operating system to a boot
166*8044SWilliam.Kucharski@Sun.COMloader, that is probably appropriate, because all the memory consumed
167*8044SWilliam.Kucharski@Sun.COMby the boot loader will typically be made available again after the
168*8044SWilliam.Kucharski@Sun.COMboot process is created, whereas every bit of code in the OS image
169*8044SWilliam.Kucharski@Sun.COMtypically has to remain in memory forever. The operating system should
170*8044SWilliam.Kucharski@Sun.COMnot have to worry about getting into 32-bit mode initially, because mode
171*8044SWilliam.Kucharski@Sun.COMswitching code generally needs to be in the boot loader anyway in order
172*8044SWilliam.Kucharski@Sun.COMto load operating system data above the 1MB boundary, and forcing the
173*8044SWilliam.Kucharski@Sun.COMoperating system to do this makes creation of OS images much more
174*8044SWilliam.Kucharski@Sun.COMdifficult.
175*8044SWilliam.Kucharski@Sun.COM
176*8044SWilliam.Kucharski@Sun.COM   Unfortunately, there is a horrendous variety of executable file
177*8044SWilliam.Kucharski@Sun.COMformats even among free Unix-like PC-based operating systems --
178*8044SWilliam.Kucharski@Sun.COMgenerally a different format for each operating system. Most of the
179*8044SWilliam.Kucharski@Sun.COMrelevant free operating systems use some variant of a.out format, but
180*8044SWilliam.Kucharski@Sun.COMsome are moving to ELF. It is highly desirable for boot loaders not to
181*8044SWilliam.Kucharski@Sun.COMhave to be able to interpret all the different types of executable file
182*8044SWilliam.Kucharski@Sun.COMformats in existence in order to load the OS image -- otherwise the
183*8044SWilliam.Kucharski@Sun.COMboot loader effectively becomes operating system specific again.
184*8044SWilliam.Kucharski@Sun.COM
185*8044SWilliam.Kucharski@Sun.COM   This specification adopts a compromise solution to this problem.
186*8044SWilliam.Kucharski@Sun.COMMultiboot-compliant OS images always contain a magic "Multiboot header"
187*8044SWilliam.Kucharski@Sun.COM(*note OS image format::), which allows the boot loader to load the
188*8044SWilliam.Kucharski@Sun.COMimage without having to understand numerous a.out variants or other
189*8044SWilliam.Kucharski@Sun.COMexecutable formats. This magic header does not need to be at the very
190*8044SWilliam.Kucharski@Sun.COMbeginning of the executable file, so kernel images can still conform to
191*8044SWilliam.Kucharski@Sun.COMthe local a.out format variant in addition to being Multiboot-compliant.
192*8044SWilliam.Kucharski@Sun.COM
193*8044SWilliam.Kucharski@Sun.COM
194*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Boot modules,  Prev: Convenience to operating systems,  Up: Overview
195*8044SWilliam.Kucharski@Sun.COM
196*8044SWilliam.Kucharski@Sun.COM1.7 Boot modules
197*8044SWilliam.Kucharski@Sun.COM================
198*8044SWilliam.Kucharski@Sun.COM
199*8044SWilliam.Kucharski@Sun.COMMany modern operating system kernels, such as those of VSTa and Mach, do
200*8044SWilliam.Kucharski@Sun.COMnot by themselves contain enough mechanism to get the system fully
201*8044SWilliam.Kucharski@Sun.COMoperational: they require the presence of additional software modules at
202*8044SWilliam.Kucharski@Sun.COMboot time in order to access devices, mount file systems, etc. While
203*8044SWilliam.Kucharski@Sun.COMthese additional modules could be embedded in the main OS image along
204*8044SWilliam.Kucharski@Sun.COMwith the kernel itself, and the resulting image be split apart manually
205*8044SWilliam.Kucharski@Sun.COMby the operating system when it receives control, it is often more
206*8044SWilliam.Kucharski@Sun.COMflexible, more space-efficient, and more convenient to the operating
207*8044SWilliam.Kucharski@Sun.COMsystem and user if the boot loader can load these additional modules
208*8044SWilliam.Kucharski@Sun.COMindependently in the first place.
209*8044SWilliam.Kucharski@Sun.COM
210*8044SWilliam.Kucharski@Sun.COM   Thus, this specification should provide a standard method for a boot
211*8044SWilliam.Kucharski@Sun.COMloader to indicate to the operating system what auxiliary boot modules
212*8044SWilliam.Kucharski@Sun.COMwere loaded, and where they can be found. Boot loaders don't have to
213*8044SWilliam.Kucharski@Sun.COMsupport multiple boot modules, but they are strongly encouraged to,
214*8044SWilliam.Kucharski@Sun.COMbecause some operating systems will be unable to boot without them.
215*8044SWilliam.Kucharski@Sun.COM
216*8044SWilliam.Kucharski@Sun.COM
217*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Terminology,  Next: Specification,  Prev: Overview,  Up: Top
218*8044SWilliam.Kucharski@Sun.COM
219*8044SWilliam.Kucharski@Sun.COM2 The definitions of terms used through the specification
220*8044SWilliam.Kucharski@Sun.COM*********************************************************
221*8044SWilliam.Kucharski@Sun.COM
222*8044SWilliam.Kucharski@Sun.COM"must"
223*8044SWilliam.Kucharski@Sun.COM     We use the term "must", when any boot loader or OS image needs to
224*8044SWilliam.Kucharski@Sun.COM     follow a rule -- otherwise, the boot loader or OS image is _not_
225*8044SWilliam.Kucharski@Sun.COM     Multiboot-compliant.
226*8044SWilliam.Kucharski@Sun.COM
227*8044SWilliam.Kucharski@Sun.COM"should"
228*8044SWilliam.Kucharski@Sun.COM     We use the term "should", when any boot loader or OS image is
229*8044SWilliam.Kucharski@Sun.COM     recommended to follow a rule, but it doesn't need to follow the
230*8044SWilliam.Kucharski@Sun.COM     rule.
231*8044SWilliam.Kucharski@Sun.COM
232*8044SWilliam.Kucharski@Sun.COM"may"
233*8044SWilliam.Kucharski@Sun.COM     We use the term "may", when any boot loader or OS image is allowed
234*8044SWilliam.Kucharski@Sun.COM     to follow a rule.
235*8044SWilliam.Kucharski@Sun.COM
236*8044SWilliam.Kucharski@Sun.COM"boot loader"
237*8044SWilliam.Kucharski@Sun.COM     Whatever program or set of programs loads the image of the final
238*8044SWilliam.Kucharski@Sun.COM     operating system to be run on the machine. The boot loader may
239*8044SWilliam.Kucharski@Sun.COM     itself consist of several stages, but that is an implementation
240*8044SWilliam.Kucharski@Sun.COM     detail not relevant to this specification. Only the _final_ stage
241*8044SWilliam.Kucharski@Sun.COM     of the boot loader -- the stage that eventually transfers control
242*8044SWilliam.Kucharski@Sun.COM     to an operating system -- must follow the rules specified in this
243*8044SWilliam.Kucharski@Sun.COM     document in order to be "Multiboot-compliant"; earlier boot loader
244*8044SWilliam.Kucharski@Sun.COM     stages may be designed in whatever way is most convenient.
245*8044SWilliam.Kucharski@Sun.COM
246*8044SWilliam.Kucharski@Sun.COM"OS image"
247*8044SWilliam.Kucharski@Sun.COM     The initial binary image that a boot loader loads into memory and
248*8044SWilliam.Kucharski@Sun.COM     transfers control to start an operating system. The OS image is
249*8044SWilliam.Kucharski@Sun.COM     typically an executable containing the operating system kernel.
250*8044SWilliam.Kucharski@Sun.COM
251*8044SWilliam.Kucharski@Sun.COM"boot module"
252*8044SWilliam.Kucharski@Sun.COM     Other auxiliary files that a boot loader loads into memory along
253*8044SWilliam.Kucharski@Sun.COM     with an OS image, but does not interpret in any way other than
254*8044SWilliam.Kucharski@Sun.COM     passing their locations to the operating system when it is invoked.
255*8044SWilliam.Kucharski@Sun.COM
256*8044SWilliam.Kucharski@Sun.COM"Multiboot-compliant"
257*8044SWilliam.Kucharski@Sun.COM     A boot loader or an OS image which follows the rules defined as
258*8044SWilliam.Kucharski@Sun.COM     "must" is Multiboot-compliant. When this specification specifies a
259*8044SWilliam.Kucharski@Sun.COM     rule as "should" or "may", a Multiboot-complaint boot loader/OS
260*8044SWilliam.Kucharski@Sun.COM     image doesn't need to follow the rule.
261*8044SWilliam.Kucharski@Sun.COM
262*8044SWilliam.Kucharski@Sun.COM"u8"
263*8044SWilliam.Kucharski@Sun.COM     The type of unsigned 8-bit data.
264*8044SWilliam.Kucharski@Sun.COM
265*8044SWilliam.Kucharski@Sun.COM"u16"
266*8044SWilliam.Kucharski@Sun.COM     The type of unsigned 16-bit data. Because the target architecture
267*8044SWilliam.Kucharski@Sun.COM     is little-endian, u16 is coded in little-endian.
268*8044SWilliam.Kucharski@Sun.COM
269*8044SWilliam.Kucharski@Sun.COM"u32"
270*8044SWilliam.Kucharski@Sun.COM     The type of unsigned 32-bit data. Because the target architecture
271*8044SWilliam.Kucharski@Sun.COM     is little-endian, u32 is coded in little-endian.
272*8044SWilliam.Kucharski@Sun.COM
273*8044SWilliam.Kucharski@Sun.COM"u64"
274*8044SWilliam.Kucharski@Sun.COM     The type of unsigned 64-bit data. Because the target architecture
275*8044SWilliam.Kucharski@Sun.COM     is little-endian, u64 is coded in little-endian.
276*8044SWilliam.Kucharski@Sun.COM
277*8044SWilliam.Kucharski@Sun.COM
278*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Specification,  Next: Examples,  Prev: Terminology,  Up: Top
279*8044SWilliam.Kucharski@Sun.COM
280*8044SWilliam.Kucharski@Sun.COM3 The exact definitions of Multiboot Specification
281*8044SWilliam.Kucharski@Sun.COM**************************************************
282*8044SWilliam.Kucharski@Sun.COM
283*8044SWilliam.Kucharski@Sun.COMThere are three main aspects of a boot loader/OS image interface:
284*8044SWilliam.Kucharski@Sun.COM
285*8044SWilliam.Kucharski@Sun.COM  1. The format of an OS image as seen by a boot loader.
286*8044SWilliam.Kucharski@Sun.COM
287*8044SWilliam.Kucharski@Sun.COM  2. The state of a machine when a boot loader starts an operating
288*8044SWilliam.Kucharski@Sun.COM     system.
289*8044SWilliam.Kucharski@Sun.COM
290*8044SWilliam.Kucharski@Sun.COM  3. The format of information passed by a boot loader to an operating
291*8044SWilliam.Kucharski@Sun.COM     system.
292*8044SWilliam.Kucharski@Sun.COM
293*8044SWilliam.Kucharski@Sun.COM* Menu:
294*8044SWilliam.Kucharski@Sun.COM
295*8044SWilliam.Kucharski@Sun.COM* OS image format::
296*8044SWilliam.Kucharski@Sun.COM* Machine state::
297*8044SWilliam.Kucharski@Sun.COM* Boot information format::
298*8044SWilliam.Kucharski@Sun.COM
299*8044SWilliam.Kucharski@Sun.COM
300*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: OS image format,  Next: Machine state,  Up: Specification
301*8044SWilliam.Kucharski@Sun.COM
302*8044SWilliam.Kucharski@Sun.COM3.1 OS image format
303*8044SWilliam.Kucharski@Sun.COM===================
304*8044SWilliam.Kucharski@Sun.COM
305*8044SWilliam.Kucharski@Sun.COMAn OS image may be an ordinary 32-bit executable file in the standard
306*8044SWilliam.Kucharski@Sun.COMformat for that particular operating system, except that it may be
307*8044SWilliam.Kucharski@Sun.COMlinked at a non-default load address to avoid loading on top of the
308*8044SWilliam.Kucharski@Sun.COMPC's I/O region or other reserved areas, and of course it should not
309*8044SWilliam.Kucharski@Sun.COMuse shared libraries or other fancy features.
310*8044SWilliam.Kucharski@Sun.COM
311*8044SWilliam.Kucharski@Sun.COM   An OS image must contain an additional header called "Multiboot
312*8044SWilliam.Kucharski@Sun.COMheader", besides the headers of the format used by the OS image. The
313*8044SWilliam.Kucharski@Sun.COMMultiboot header must be contained completely within the first 8192
314*8044SWilliam.Kucharski@Sun.COMbytes of the OS image, and must be longword (32-bit) aligned. In
315*8044SWilliam.Kucharski@Sun.COMgeneral, it should come _as early as possible_, and may be embedded in
316*8044SWilliam.Kucharski@Sun.COMthe beginning of the text segment after the _real_ executable header.
317*8044SWilliam.Kucharski@Sun.COM
318*8044SWilliam.Kucharski@Sun.COM* Menu:
319*8044SWilliam.Kucharski@Sun.COM
320*8044SWilliam.Kucharski@Sun.COM* Header layout::               The layout of Multiboot header
321*8044SWilliam.Kucharski@Sun.COM* Header magic fields::         The magic fields of Multiboot header
322*8044SWilliam.Kucharski@Sun.COM* Header address fields::
323*8044SWilliam.Kucharski@Sun.COM* Header graphics fields::
324*8044SWilliam.Kucharski@Sun.COM
325*8044SWilliam.Kucharski@Sun.COM
326*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Header layout,  Next: Header magic fields,  Up: OS image format
327*8044SWilliam.Kucharski@Sun.COM
328*8044SWilliam.Kucharski@Sun.COM3.1.1 The layout of Multiboot header
329*8044SWilliam.Kucharski@Sun.COM------------------------------------
330*8044SWilliam.Kucharski@Sun.COM
331*8044SWilliam.Kucharski@Sun.COMThe layout of the Multiboot header must be as follows:
332*8044SWilliam.Kucharski@Sun.COM
333*8044SWilliam.Kucharski@Sun.COMOffset  Type    Field Name     Note
334*8044SWilliam.Kucharski@Sun.COM0       u32     magic          required
335*8044SWilliam.Kucharski@Sun.COM4       u32     flags          required
336*8044SWilliam.Kucharski@Sun.COM8       u32     checksum       required
337*8044SWilliam.Kucharski@Sun.COM12      u32     header_addr    if flags[16] is set
338*8044SWilliam.Kucharski@Sun.COM16      u32     load_addr      if flags[16] is set
339*8044SWilliam.Kucharski@Sun.COM20      u32     load_end_addr  if flags[16] is set
340*8044SWilliam.Kucharski@Sun.COM24      u32     bss_end_addr   if flags[16] is set
341*8044SWilliam.Kucharski@Sun.COM28      u32     entry_addr     if flags[16] is set
342*8044SWilliam.Kucharski@Sun.COM32      u32     mode_type      if flags[2] is set
343*8044SWilliam.Kucharski@Sun.COM36      u32     width          if flags[2] is set
344*8044SWilliam.Kucharski@Sun.COM40      u32     height         if flags[2] is set
345*8044SWilliam.Kucharski@Sun.COM44      u32     depth          if flags[2] is set
346*8044SWilliam.Kucharski@Sun.COM
347*8044SWilliam.Kucharski@Sun.COM   The fields `magic', `flags' and `checksum' are defined in *Note
348*8044SWilliam.Kucharski@Sun.COMHeader magic fields::, the fields `header_addr', `load_addr',
349*8044SWilliam.Kucharski@Sun.COM`load_end_addr', `bss_end_addr' and `entry_addr' are defined in *Note
350*8044SWilliam.Kucharski@Sun.COMHeader address fields::, and the fields `mode_type', `width', `height'
351*8044SWilliam.Kucharski@Sun.COMand `depth' are defind in *Note Header graphics fields::.
352*8044SWilliam.Kucharski@Sun.COM
353*8044SWilliam.Kucharski@Sun.COM
354*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Header magic fields,  Next: Header address fields,  Prev: Header layout,  Up: OS image format
355*8044SWilliam.Kucharski@Sun.COM
356*8044SWilliam.Kucharski@Sun.COM3.1.2 The magic fields of Multiboot header
357*8044SWilliam.Kucharski@Sun.COM------------------------------------------
358*8044SWilliam.Kucharski@Sun.COM
359*8044SWilliam.Kucharski@Sun.COM`magic'
360*8044SWilliam.Kucharski@Sun.COM     The field `magic' is the magic number identifying the header,
361*8044SWilliam.Kucharski@Sun.COM     which must be the hexadecimal value `0x1BADB002'.
362*8044SWilliam.Kucharski@Sun.COM
363*8044SWilliam.Kucharski@Sun.COM`flags'
364*8044SWilliam.Kucharski@Sun.COM     The field `flags' specifies features that the OS image requests or
365*8044SWilliam.Kucharski@Sun.COM     requires of an boot loader. Bits 0-15 indicate requirements; if the
366*8044SWilliam.Kucharski@Sun.COM     boot loader sees any of these bits set but doesn't understand the
367*8044SWilliam.Kucharski@Sun.COM     flag or can't fulfill the requirements it indicates for some
368*8044SWilliam.Kucharski@Sun.COM     reason, it must notify the user and fail to load the OS image.
369*8044SWilliam.Kucharski@Sun.COM     Bits 16-31 indicate optional features; if any bits in this range
370*8044SWilliam.Kucharski@Sun.COM     are set but the boot loader doesn't understand them, it may simply
371*8044SWilliam.Kucharski@Sun.COM     ignore them and proceed as usual. Naturally, all as-yet-undefined
372*8044SWilliam.Kucharski@Sun.COM     bits in the `flags' word must be set to zero in OS images. This
373*8044SWilliam.Kucharski@Sun.COM     way, the `flags' fields serves for version control as well as
374*8044SWilliam.Kucharski@Sun.COM     simple feature selection.
375*8044SWilliam.Kucharski@Sun.COM
376*8044SWilliam.Kucharski@Sun.COM     If bit 0 in the `flags' word is set, then all boot modules loaded
377*8044SWilliam.Kucharski@Sun.COM     along with the operating system must be aligned on page (4KB)
378*8044SWilliam.Kucharski@Sun.COM     boundaries. Some operating systems expect to be able to map the
379*8044SWilliam.Kucharski@Sun.COM     pages containing boot modules directly into a paged address space
380*8044SWilliam.Kucharski@Sun.COM     during startup, and thus need the boot modules to be page-aligned.
381*8044SWilliam.Kucharski@Sun.COM
382*8044SWilliam.Kucharski@Sun.COM     If bit 1 in the `flags' word is set, then information on available
383*8044SWilliam.Kucharski@Sun.COM     memory via at least the `mem_*' fields of the Multiboot information
384*8044SWilliam.Kucharski@Sun.COM     structure (*note Boot information format::) must be included. If
385*8044SWilliam.Kucharski@Sun.COM     the boot loader is capable of passing a memory map (the `mmap_*'
386*8044SWilliam.Kucharski@Sun.COM     fields) and one exists, then it may be included as well.
387*8044SWilliam.Kucharski@Sun.COM
388*8044SWilliam.Kucharski@Sun.COM     If bit 2 in the `flags' word is set, information about the video
389*8044SWilliam.Kucharski@Sun.COM     mode table (*note Boot information format::) must be available to
390*8044SWilliam.Kucharski@Sun.COM     the kernel.
391*8044SWilliam.Kucharski@Sun.COM
392*8044SWilliam.Kucharski@Sun.COM     If bit 16 in the `flags' word is set, then the fields at offsets
393*8044SWilliam.Kucharski@Sun.COM     8-24 in the Multiboot header are valid, and the boot loader should
394*8044SWilliam.Kucharski@Sun.COM     use them instead of the fields in the actual executable header to
395*8044SWilliam.Kucharski@Sun.COM     calculate where to load the OS image. This information does not
396*8044SWilliam.Kucharski@Sun.COM     need to be provided if the kernel image is in ELF format, but it
397*8044SWilliam.Kucharski@Sun.COM     _must_ be provided if the images is in a.out format or in some
398*8044SWilliam.Kucharski@Sun.COM     other format. Compliant boot loaders must be able to load images
399*8044SWilliam.Kucharski@Sun.COM     that either are in ELF format or contain the load address
400*8044SWilliam.Kucharski@Sun.COM     information embedded in the Multiboot header; they may also
401*8044SWilliam.Kucharski@Sun.COM     directly support other executable formats, such as particular
402*8044SWilliam.Kucharski@Sun.COM     a.out variants, but are not required to.
403*8044SWilliam.Kucharski@Sun.COM
404*8044SWilliam.Kucharski@Sun.COM`checksum'
405*8044SWilliam.Kucharski@Sun.COM     The field `checksum' is a 32-bit unsigned value which, when added
406*8044SWilliam.Kucharski@Sun.COM     to the other magic fields (i.e. `magic' and `flags'), must have a
407*8044SWilliam.Kucharski@Sun.COM     32-bit unsigned sum of zero.
408*8044SWilliam.Kucharski@Sun.COM
409*8044SWilliam.Kucharski@Sun.COM
410*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Header address fields,  Next: Header graphics fields,  Prev: Header magic fields,  Up: OS image format
411*8044SWilliam.Kucharski@Sun.COM
412*8044SWilliam.Kucharski@Sun.COM3.1.3 The address fields of Multiboot header
413*8044SWilliam.Kucharski@Sun.COM--------------------------------------------
414*8044SWilliam.Kucharski@Sun.COM
415*8044SWilliam.Kucharski@Sun.COMAll of the address fields enabled by flag bit 16 are physical addresses.
416*8044SWilliam.Kucharski@Sun.COMThe meaning of each is as follows:
417*8044SWilliam.Kucharski@Sun.COM
418*8044SWilliam.Kucharski@Sun.COM`header_addr'
419*8044SWilliam.Kucharski@Sun.COM     Contains the address corresponding to the beginning of the
420*8044SWilliam.Kucharski@Sun.COM     Multiboot header -- the physical memory location at which the
421*8044SWilliam.Kucharski@Sun.COM     magic value is supposed to be loaded. This field serves to
422*8044SWilliam.Kucharski@Sun.COM     "synchronize" the mapping between OS image offsets and physical
423*8044SWilliam.Kucharski@Sun.COM     memory addresses.
424*8044SWilliam.Kucharski@Sun.COM
425*8044SWilliam.Kucharski@Sun.COM`load_addr'
426*8044SWilliam.Kucharski@Sun.COM     Contains the physical address of the beginning of the text
427*8044SWilliam.Kucharski@Sun.COM     segment. The offset in the OS image file at which to start loading
428*8044SWilliam.Kucharski@Sun.COM     is defined by the offset at which the header was found, minus
429*8044SWilliam.Kucharski@Sun.COM     (header_addr - load_addr). load_addr must be less than or equal to
430*8044SWilliam.Kucharski@Sun.COM     header_addr.
431*8044SWilliam.Kucharski@Sun.COM
432*8044SWilliam.Kucharski@Sun.COM`load_end_addr'
433*8044SWilliam.Kucharski@Sun.COM     Contains the physical address of the end of the data segment.
434*8044SWilliam.Kucharski@Sun.COM     (load_end_addr - load_addr) specifies how much data to load.  This
435*8044SWilliam.Kucharski@Sun.COM     implies that the text and data segments must be consecutive in the
436*8044SWilliam.Kucharski@Sun.COM     OS image; this is true for existing a.out executable formats.  If
437*8044SWilliam.Kucharski@Sun.COM     this field is zero, the boot loader assumes that the text and data
438*8044SWilliam.Kucharski@Sun.COM     segments occupy the whole OS image file.
439*8044SWilliam.Kucharski@Sun.COM
440*8044SWilliam.Kucharski@Sun.COM`bss_end_addr'
441*8044SWilliam.Kucharski@Sun.COM     Contains the physical address of the end of the bss segment. The
442*8044SWilliam.Kucharski@Sun.COM     boot loader initializes this area to zero, and reserves the memory
443*8044SWilliam.Kucharski@Sun.COM     it occupies to avoid placing boot modules and other data relevant
444*8044SWilliam.Kucharski@Sun.COM     to the operating system in that area. If this field is zero, the
445*8044SWilliam.Kucharski@Sun.COM     boot loader assumes that no bss segment is present.
446*8044SWilliam.Kucharski@Sun.COM
447*8044SWilliam.Kucharski@Sun.COM`entry_addr'
448*8044SWilliam.Kucharski@Sun.COM     The physical address to which the boot loader should jump in order
449*8044SWilliam.Kucharski@Sun.COM     to start running the operating system.
450*8044SWilliam.Kucharski@Sun.COM
451*8044SWilliam.Kucharski@Sun.COM
452*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Header graphics fields,  Prev: Header address fields,  Up: OS image format
453*8044SWilliam.Kucharski@Sun.COM
454*8044SWilliam.Kucharski@Sun.COM3.1.4 The graphics fields of Multiboot header
455*8044SWilliam.Kucharski@Sun.COM---------------------------------------------
456*8044SWilliam.Kucharski@Sun.COM
457*8044SWilliam.Kucharski@Sun.COMAll of the graphics fields are enabled by flag bit 2. They specify the
458*8044SWilliam.Kucharski@Sun.COMpreferred graphics mode. Note that that is only a _recommended_ mode by
459*8044SWilliam.Kucharski@Sun.COMthe OS image. If the mode exists, the boot loader should set it, when
460*8044SWilliam.Kucharski@Sun.COMthe user doesn't specify a mode explicitly. Otherwise, the boot loader
461*8044SWilliam.Kucharski@Sun.COMshould fall back to a similar mode, if available.
462*8044SWilliam.Kucharski@Sun.COM
463*8044SWilliam.Kucharski@Sun.COM   The meaning of each is as follows:
464*8044SWilliam.Kucharski@Sun.COM
465*8044SWilliam.Kucharski@Sun.COM`mode_type'
466*8044SWilliam.Kucharski@Sun.COM     Contains `0' for linear graphics mode or `1' for EGA-standard text
467*8044SWilliam.Kucharski@Sun.COM     mode. Everything else is reserved for future expansion. Note that
468*8044SWilliam.Kucharski@Sun.COM     the boot loader may set a text mode, even if this field contains
469*8044SWilliam.Kucharski@Sun.COM     `0'.
470*8044SWilliam.Kucharski@Sun.COM
471*8044SWilliam.Kucharski@Sun.COM`width'
472*8044SWilliam.Kucharski@Sun.COM     Contains the number of the columns. This is specified in pixels in
473*8044SWilliam.Kucharski@Sun.COM     a graphics mode, and in characters in a text mode. The value zero
474*8044SWilliam.Kucharski@Sun.COM     indicates that the OS image has no preference.
475*8044SWilliam.Kucharski@Sun.COM
476*8044SWilliam.Kucharski@Sun.COM`height'
477*8044SWilliam.Kucharski@Sun.COM     Contains the number of the lines. This is specified in pixels in a
478*8044SWilliam.Kucharski@Sun.COM     graphics mode, and in characters in a text mode. The value zero
479*8044SWilliam.Kucharski@Sun.COM     indicates that the OS image has no preference.
480*8044SWilliam.Kucharski@Sun.COM
481*8044SWilliam.Kucharski@Sun.COM`depth'
482*8044SWilliam.Kucharski@Sun.COM     Contains the number of bits per pixel in a graphics mode, and zero
483*8044SWilliam.Kucharski@Sun.COM     in a text mode. The value zero indicates that the OS image has no
484*8044SWilliam.Kucharski@Sun.COM     preference.
485*8044SWilliam.Kucharski@Sun.COM
486*8044SWilliam.Kucharski@Sun.COM
487*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Machine state,  Next: Boot information format,  Prev: OS image format,  Up: Specification
488*8044SWilliam.Kucharski@Sun.COM
489*8044SWilliam.Kucharski@Sun.COM3.2 Machine state
490*8044SWilliam.Kucharski@Sun.COM=================
491*8044SWilliam.Kucharski@Sun.COM
492*8044SWilliam.Kucharski@Sun.COMWhen the boot loader invokes the 32-bit operating system, the machine
493*8044SWilliam.Kucharski@Sun.COMmust have the following state:
494*8044SWilliam.Kucharski@Sun.COM
495*8044SWilliam.Kucharski@Sun.COM`EAX'
496*8044SWilliam.Kucharski@Sun.COM     Must contain the magic value `0x2BADB002'; the presence of this
497*8044SWilliam.Kucharski@Sun.COM     value indicates to the operating system that it was loaded by a
498*8044SWilliam.Kucharski@Sun.COM     Multiboot-compliant boot loader (e.g. as opposed to another type of
499*8044SWilliam.Kucharski@Sun.COM     boot loader that the operating system can also be loaded from).
500*8044SWilliam.Kucharski@Sun.COM
501*8044SWilliam.Kucharski@Sun.COM`EBX'
502*8044SWilliam.Kucharski@Sun.COM     Must contain the 32-bit physical address of the Multiboot
503*8044SWilliam.Kucharski@Sun.COM     information structure provided by the boot loader (*note Boot
504*8044SWilliam.Kucharski@Sun.COM     information format::).
505*8044SWilliam.Kucharski@Sun.COM
506*8044SWilliam.Kucharski@Sun.COM`CS'
507*8044SWilliam.Kucharski@Sun.COM     Must be a 32-bit read/execute code segment with an offset of `0'
508*8044SWilliam.Kucharski@Sun.COM     and a limit of `0xFFFFFFFF'. The exact value is undefined.
509*8044SWilliam.Kucharski@Sun.COM
510*8044SWilliam.Kucharski@Sun.COM`DS'
511*8044SWilliam.Kucharski@Sun.COM`ES'
512*8044SWilliam.Kucharski@Sun.COM`FS'
513*8044SWilliam.Kucharski@Sun.COM`GS'
514*8044SWilliam.Kucharski@Sun.COM`SS'
515*8044SWilliam.Kucharski@Sun.COM     Must be a 32-bit read/write data segment with an offset of `0' and
516*8044SWilliam.Kucharski@Sun.COM     a limit of `0xFFFFFFFF'. The exact values are all undefined.
517*8044SWilliam.Kucharski@Sun.COM
518*8044SWilliam.Kucharski@Sun.COM`A20 gate'
519*8044SWilliam.Kucharski@Sun.COM     Must be enabled.
520*8044SWilliam.Kucharski@Sun.COM
521*8044SWilliam.Kucharski@Sun.COM`CR0'
522*8044SWilliam.Kucharski@Sun.COM     Bit 31 (PG) must be cleared. Bit 0 (PE) must be set. Other bits are
523*8044SWilliam.Kucharski@Sun.COM     all undefined.
524*8044SWilliam.Kucharski@Sun.COM
525*8044SWilliam.Kucharski@Sun.COM`EFLAGS'
526*8044SWilliam.Kucharski@Sun.COM     Bit 17 (VM) must be cleared. Bit 9 (IF) must be cleared. Other bits
527*8044SWilliam.Kucharski@Sun.COM     are all undefined.
528*8044SWilliam.Kucharski@Sun.COM
529*8044SWilliam.Kucharski@Sun.COM   All other processor registers and flag bits are undefined. This
530*8044SWilliam.Kucharski@Sun.COMincludes, in particular:
531*8044SWilliam.Kucharski@Sun.COM
532*8044SWilliam.Kucharski@Sun.COM`ESP'
533*8044SWilliam.Kucharski@Sun.COM     The OS image must create its own stack as soon as it needs one.
534*8044SWilliam.Kucharski@Sun.COM
535*8044SWilliam.Kucharski@Sun.COM`GDTR'
536*8044SWilliam.Kucharski@Sun.COM     Even though the segment registers are set up as described above,
537*8044SWilliam.Kucharski@Sun.COM     the `GDTR' may be invalid, so the OS image must not load any
538*8044SWilliam.Kucharski@Sun.COM     segment registers (even just reloading the same values!) until it
539*8044SWilliam.Kucharski@Sun.COM     sets up its own `GDT'.
540*8044SWilliam.Kucharski@Sun.COM
541*8044SWilliam.Kucharski@Sun.COM`IDTR'
542*8044SWilliam.Kucharski@Sun.COM     The OS image must leave interrupts disabled until it sets up its
543*8044SWilliam.Kucharski@Sun.COM     own `IDT'.
544*8044SWilliam.Kucharski@Sun.COM
545*8044SWilliam.Kucharski@Sun.COM   However, other machine state should be left by the boot loader in
546*8044SWilliam.Kucharski@Sun.COM"normal working order", i.e. as initialized by the BIOS (or DOS, if
547*8044SWilliam.Kucharski@Sun.COMthat's what the boot loader runs from). In other words, the operating
548*8044SWilliam.Kucharski@Sun.COMsystem should be able to make BIOS calls and such after being loaded,
549*8044SWilliam.Kucharski@Sun.COMas long as it does not overwrite the BIOS data structures before doing
550*8044SWilliam.Kucharski@Sun.COMso. Also, the boot loader must leave the PIC programmed with the normal
551*8044SWilliam.Kucharski@Sun.COMBIOS/DOS values, even if it changed them during the switch to 32-bit
552*8044SWilliam.Kucharski@Sun.COMmode.
553*8044SWilliam.Kucharski@Sun.COM
554*8044SWilliam.Kucharski@Sun.COM
555*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Boot information format,  Prev: Machine state,  Up: Specification
556*8044SWilliam.Kucharski@Sun.COM
557*8044SWilliam.Kucharski@Sun.COM3.3 Boot information format
558*8044SWilliam.Kucharski@Sun.COM===========================
559*8044SWilliam.Kucharski@Sun.COM
560*8044SWilliam.Kucharski@Sun.COMFIXME: Split this chapter like the chapter "OS image format".
561*8044SWilliam.Kucharski@Sun.COM
562*8044SWilliam.Kucharski@Sun.COM   Upon entry to the operating system, the `EBX' register contains the
563*8044SWilliam.Kucharski@Sun.COMphysical address of a "Multiboot information" data structure, through
564*8044SWilliam.Kucharski@Sun.COMwhich the boot loader communicates vital information to the operating
565*8044SWilliam.Kucharski@Sun.COMsystem. The operating system can use or ignore any parts of the
566*8044SWilliam.Kucharski@Sun.COMstructure as it chooses; all information passed by the boot loader is
567*8044SWilliam.Kucharski@Sun.COMadvisory only.
568*8044SWilliam.Kucharski@Sun.COM
569*8044SWilliam.Kucharski@Sun.COM   The Multiboot information structure and its related substructures
570*8044SWilliam.Kucharski@Sun.COMmay be placed anywhere in memory by the boot loader (with the exception
571*8044SWilliam.Kucharski@Sun.COMof the memory reserved for the kernel and boot modules, of course). It
572*8044SWilliam.Kucharski@Sun.COMis the operating system's responsibility to avoid overwriting this
573*8044SWilliam.Kucharski@Sun.COMmemory until it is done using it.
574*8044SWilliam.Kucharski@Sun.COM
575*8044SWilliam.Kucharski@Sun.COM   The format of the Multiboot information structure (as defined so far)
576*8044SWilliam.Kucharski@Sun.COMfollows:
577*8044SWilliam.Kucharski@Sun.COM
578*8044SWilliam.Kucharski@Sun.COM             +-------------------+
579*8044SWilliam.Kucharski@Sun.COM     0       | flags             |    (required)
580*8044SWilliam.Kucharski@Sun.COM             +-------------------+
581*8044SWilliam.Kucharski@Sun.COM     4       | mem_lower         |    (present if flags[0] is set)
582*8044SWilliam.Kucharski@Sun.COM     8       | mem_upper         |    (present if flags[0] is set)
583*8044SWilliam.Kucharski@Sun.COM             +-------------------+
584*8044SWilliam.Kucharski@Sun.COM     12      | boot_device       |    (present if flags[1] is set)
585*8044SWilliam.Kucharski@Sun.COM             +-------------------+
586*8044SWilliam.Kucharski@Sun.COM     16      | cmdline           |    (present if flags[2] is set)
587*8044SWilliam.Kucharski@Sun.COM             +-------------------+
588*8044SWilliam.Kucharski@Sun.COM     20      | mods_count        |    (present if flags[3] is set)
589*8044SWilliam.Kucharski@Sun.COM     24      | mods_addr         |    (present if flags[3] is set)
590*8044SWilliam.Kucharski@Sun.COM             +-------------------+
591*8044SWilliam.Kucharski@Sun.COM     28 - 40 | syms              |    (present if flags[4] or
592*8044SWilliam.Kucharski@Sun.COM             |                   |                flags[5] is set)
593*8044SWilliam.Kucharski@Sun.COM             +-------------------+
594*8044SWilliam.Kucharski@Sun.COM     44      | mmap_length       |    (present if flags[6] is set)
595*8044SWilliam.Kucharski@Sun.COM     48      | mmap_addr         |    (present if flags[6] is set)
596*8044SWilliam.Kucharski@Sun.COM             +-------------------+
597*8044SWilliam.Kucharski@Sun.COM     52      | drives_length     |    (present if flags[7] is set)
598*8044SWilliam.Kucharski@Sun.COM     56      | drives_addr       |    (present if flags[7] is set)
599*8044SWilliam.Kucharski@Sun.COM             +-------------------+
600*8044SWilliam.Kucharski@Sun.COM     60      | config_table      |    (present if flags[8] is set)
601*8044SWilliam.Kucharski@Sun.COM             +-------------------+
602*8044SWilliam.Kucharski@Sun.COM     64      | boot_loader_name  |    (present if flags[9] is set)
603*8044SWilliam.Kucharski@Sun.COM             +-------------------+
604*8044SWilliam.Kucharski@Sun.COM     68      | apm_table         |    (present if flags[10] is set)
605*8044SWilliam.Kucharski@Sun.COM             +-------------------+
606*8044SWilliam.Kucharski@Sun.COM     72      | vbe_control_info  |    (present if flags[11] is set)
607*8044SWilliam.Kucharski@Sun.COM     76      | vbe_mode_info     |
608*8044SWilliam.Kucharski@Sun.COM     80      | vbe_mode          |
609*8044SWilliam.Kucharski@Sun.COM     82      | vbe_interface_seg |
610*8044SWilliam.Kucharski@Sun.COM     84      | vbe_interface_off |
611*8044SWilliam.Kucharski@Sun.COM     86      | vbe_interface_len |
612*8044SWilliam.Kucharski@Sun.COM             +-------------------+
613*8044SWilliam.Kucharski@Sun.COM
614*8044SWilliam.Kucharski@Sun.COM   The first longword indicates the presence and validity of other
615*8044SWilliam.Kucharski@Sun.COMfields in the Multiboot information structure. All as-yet-undefined
616*8044SWilliam.Kucharski@Sun.COMbits must be set to zero by the boot loader. Any set bits that the
617*8044SWilliam.Kucharski@Sun.COMoperating system does not understand should be ignored. Thus, the
618*8044SWilliam.Kucharski@Sun.COM`flags' field also functions as a version indicator, allowing the
619*8044SWilliam.Kucharski@Sun.COMMultiboot information structure to be expanded in the future without
620*8044SWilliam.Kucharski@Sun.COMbreaking anything.
621*8044SWilliam.Kucharski@Sun.COM
622*8044SWilliam.Kucharski@Sun.COM   If bit 0 in the `flags' word is set, then the `mem_*' fields are
623*8044SWilliam.Kucharski@Sun.COMvalid. `mem_lower' and `mem_upper' indicate the amount of lower and
624*8044SWilliam.Kucharski@Sun.COMupper memory, respectively, in kilobytes. Lower memory starts at
625*8044SWilliam.Kucharski@Sun.COMaddress 0, and upper memory starts at address 1 megabyte. The maximum
626*8044SWilliam.Kucharski@Sun.COMpossible value for lower memory is 640 kilobytes. The value returned for
627*8044SWilliam.Kucharski@Sun.COMupper memory is maximally the address of the first upper memory hole
628*8044SWilliam.Kucharski@Sun.COMminus 1 megabyte. It is not guaranteed to be this value.
629*8044SWilliam.Kucharski@Sun.COM
630*8044SWilliam.Kucharski@Sun.COM   If bit 1 in the `flags' word is set, then the `boot_device' field is
631*8044SWilliam.Kucharski@Sun.COMvalid, and indicates which BIOS disk device the boot loader loaded the
632*8044SWilliam.Kucharski@Sun.COMOS image from. If the OS image was not loaded from a BIOS disk, then
633*8044SWilliam.Kucharski@Sun.COMthis field must not be present (bit 3 must be clear). The operating
634*8044SWilliam.Kucharski@Sun.COMsystem may use this field as a hint for determining its own "root"
635*8044SWilliam.Kucharski@Sun.COMdevice, but is not required to. The `boot_device' field is laid out in
636*8044SWilliam.Kucharski@Sun.COMfour one-byte subfields as follows:
637*8044SWilliam.Kucharski@Sun.COM
638*8044SWilliam.Kucharski@Sun.COM     +-------+-------+-------+-------+
639*8044SWilliam.Kucharski@Sun.COM     | drive | part1 | part2 | part3 |
640*8044SWilliam.Kucharski@Sun.COM     +-------+-------+-------+-------+
641*8044SWilliam.Kucharski@Sun.COM
642*8044SWilliam.Kucharski@Sun.COM   The first byte contains the BIOS drive number as understood by the
643*8044SWilliam.Kucharski@Sun.COMBIOS INT 0x13 low-level disk interface: e.g. 0x00 for the first floppy
644*8044SWilliam.Kucharski@Sun.COMdisk or 0x80 for the first hard disk.
645*8044SWilliam.Kucharski@Sun.COM
646*8044SWilliam.Kucharski@Sun.COM   The three remaining bytes specify the boot partition. `part1'
647*8044SWilliam.Kucharski@Sun.COMspecifies the "top-level" partition number, `part2' specifies a
648*8044SWilliam.Kucharski@Sun.COM"sub-partition" in the top-level partition, etc. Partition numbers
649*8044SWilliam.Kucharski@Sun.COMalways start from zero. Unused partition bytes must be set to 0xFF. For
650*8044SWilliam.Kucharski@Sun.COMexample, if the disk is partitioned using a simple one-level DOS
651*8044SWilliam.Kucharski@Sun.COMpartitioning scheme, then `part1' contains the DOS partition number,
652*8044SWilliam.Kucharski@Sun.COMand `part2' and `part3' are both 0xFF. As another example, if a disk is
653*8044SWilliam.Kucharski@Sun.COMpartitioned first into DOS partitions, and then one of those DOS
654*8044SWilliam.Kucharski@Sun.COMpartitions is subdivided into several BSD partitions using BSD's
655*8044SWilliam.Kucharski@Sun.COM"disklabel" strategy, then `part1' contains the DOS partition number,
656*8044SWilliam.Kucharski@Sun.COM`part2' contains the BSD sub-partition within that DOS partition, and
657*8044SWilliam.Kucharski@Sun.COM`part3' is 0xFF.
658*8044SWilliam.Kucharski@Sun.COM
659*8044SWilliam.Kucharski@Sun.COM   DOS extended partitions are indicated as partition numbers starting
660*8044SWilliam.Kucharski@Sun.COMfrom 4 and increasing, rather than as nested sub-partitions, even
661*8044SWilliam.Kucharski@Sun.COMthough the underlying disk layout of extended partitions is
662*8044SWilliam.Kucharski@Sun.COMhierarchical in nature. For example, if the boot loader boots from the
663*8044SWilliam.Kucharski@Sun.COMsecond extended partition on a disk partitioned in conventional DOS
664*8044SWilliam.Kucharski@Sun.COMstyle, then `part1' will be 5, and `part2' and `part3' will both be
665*8044SWilliam.Kucharski@Sun.COM0xFF.
666*8044SWilliam.Kucharski@Sun.COM
667*8044SWilliam.Kucharski@Sun.COM   If bit 2 of the `flags' longword is set, the `cmdline' field is
668*8044SWilliam.Kucharski@Sun.COMvalid, and contains the physical address of the command line to be
669*8044SWilliam.Kucharski@Sun.COMpassed to the kernel. The command line is a normal C-style
670*8044SWilliam.Kucharski@Sun.COMzero-terminated string.
671*8044SWilliam.Kucharski@Sun.COM
672*8044SWilliam.Kucharski@Sun.COM   If bit 3 of the `flags' is set, then the `mods' fields indicate to
673*8044SWilliam.Kucharski@Sun.COMthe kernel what boot modules were loaded along with the kernel image,
674*8044SWilliam.Kucharski@Sun.COMand where they can be found. `mods_count' contains the number of
675*8044SWilliam.Kucharski@Sun.COMmodules loaded; `mods_addr' contains the physical address of the first
676*8044SWilliam.Kucharski@Sun.COMmodule structure. `mods_count' may be zero, indicating no boot modules
677*8044SWilliam.Kucharski@Sun.COMwere loaded, even if bit 1 of `flags' is set. Each module structure is
678*8044SWilliam.Kucharski@Sun.COMformatted as follows:
679*8044SWilliam.Kucharski@Sun.COM
680*8044SWilliam.Kucharski@Sun.COM             +-------------------+
681*8044SWilliam.Kucharski@Sun.COM     0       | mod_start         |
682*8044SWilliam.Kucharski@Sun.COM     4       | mod_end           |
683*8044SWilliam.Kucharski@Sun.COM             +-------------------+
684*8044SWilliam.Kucharski@Sun.COM     8       | string            |
685*8044SWilliam.Kucharski@Sun.COM             +-------------------+
686*8044SWilliam.Kucharski@Sun.COM     12      | reserved (0)      |
687*8044SWilliam.Kucharski@Sun.COM             +-------------------+
688*8044SWilliam.Kucharski@Sun.COM
689*8044SWilliam.Kucharski@Sun.COM   The first two fields contain the start and end addresses of the boot
690*8044SWilliam.Kucharski@Sun.COMmodule itself. The `string' field provides an arbitrary string to be
691*8044SWilliam.Kucharski@Sun.COMassociated with that particular boot module; it is a zero-terminated
692*8044SWilliam.Kucharski@Sun.COMASCII string, just like the kernel command line. The `string' field may
693*8044SWilliam.Kucharski@Sun.COMbe 0 if there is no string associated with the module. Typically the
694*8044SWilliam.Kucharski@Sun.COMstring might be a command line (e.g. if the operating system treats boot
695*8044SWilliam.Kucharski@Sun.COMmodules as executable programs), or a pathname (e.g. if the operating
696*8044SWilliam.Kucharski@Sun.COMsystem treats boot modules as files in a file system), but its exact use
697*8044SWilliam.Kucharski@Sun.COMis specific to the operating system. The `reserved' field must be set
698*8044SWilliam.Kucharski@Sun.COMto 0 by the boot loader and ignored by the operating system.
699*8044SWilliam.Kucharski@Sun.COM
700*8044SWilliam.Kucharski@Sun.COM   *Caution:* Bits 4 & 5 are mutually exclusive.
701*8044SWilliam.Kucharski@Sun.COM
702*8044SWilliam.Kucharski@Sun.COM   If bit 4 in the `flags' word is set, then the following fields in
703*8044SWilliam.Kucharski@Sun.COMthe Multiboot information structure starting at byte 28 are valid:
704*8044SWilliam.Kucharski@Sun.COM
705*8044SWilliam.Kucharski@Sun.COM             +-------------------+
706*8044SWilliam.Kucharski@Sun.COM     28      | tabsize           |
707*8044SWilliam.Kucharski@Sun.COM     32      | strsize           |
708*8044SWilliam.Kucharski@Sun.COM     36      | addr              |
709*8044SWilliam.Kucharski@Sun.COM     40      | reserved (0)      |
710*8044SWilliam.Kucharski@Sun.COM             +-------------------+
711*8044SWilliam.Kucharski@Sun.COM
712*8044SWilliam.Kucharski@Sun.COM   These indicate where the symbol table from an a.out kernel image can
713*8044SWilliam.Kucharski@Sun.COMbe found. `addr' is the physical address of the size (4-byte unsigned
714*8044SWilliam.Kucharski@Sun.COMlong) of an array of a.out format "nlist" structures, followed
715*8044SWilliam.Kucharski@Sun.COMimmediately by the array itself, then the size (4-byte unsigned long) of
716*8044SWilliam.Kucharski@Sun.COMa set of zero-terminated ASCII strings (plus sizeof(unsigned long) in
717*8044SWilliam.Kucharski@Sun.COMthis case), and finally the set of strings itself. `tabsize' is equal
718*8044SWilliam.Kucharski@Sun.COMto its size parameter (found at the beginning of the symbol section),
719*8044SWilliam.Kucharski@Sun.COMand `strsize' is equal to its size parameter (found at the beginning of
720*8044SWilliam.Kucharski@Sun.COMthe string section) of the following string table to which the symbol
721*8044SWilliam.Kucharski@Sun.COMtable refers. Note that `tabsize' may be 0, indicating no symbols, even
722*8044SWilliam.Kucharski@Sun.COMif bit 4 in the `flags' word is set.
723*8044SWilliam.Kucharski@Sun.COM
724*8044SWilliam.Kucharski@Sun.COM   If bit 5 in the `flags' word is set, then the following fields in
725*8044SWilliam.Kucharski@Sun.COMthe Multiboot information structure starting at byte 28 are valid:
726*8044SWilliam.Kucharski@Sun.COM
727*8044SWilliam.Kucharski@Sun.COM             +-------------------+
728*8044SWilliam.Kucharski@Sun.COM     28      | num               |
729*8044SWilliam.Kucharski@Sun.COM     32      | size              |
730*8044SWilliam.Kucharski@Sun.COM     36      | addr              |
731*8044SWilliam.Kucharski@Sun.COM     40      | shndx             |
732*8044SWilliam.Kucharski@Sun.COM             +-------------------+
733*8044SWilliam.Kucharski@Sun.COM
734*8044SWilliam.Kucharski@Sun.COM   These indicate where the section header table from an ELF kernel is,
735*8044SWilliam.Kucharski@Sun.COMthe size of each entry, number of entries, and the string table used as
736*8044SWilliam.Kucharski@Sun.COMthe index of names. They correspond to the `shdr_*' entries
737*8044SWilliam.Kucharski@Sun.COM(`shdr_num', etc.) in the Executable and Linkable Format (ELF)
738*8044SWilliam.Kucharski@Sun.COMspecification in the program header. All sections are loaded, and the
739*8044SWilliam.Kucharski@Sun.COMphysical address fields of the ELF section header then refer to where
740*8044SWilliam.Kucharski@Sun.COMthe sections are in memory (refer to the i386 ELF documentation for
741*8044SWilliam.Kucharski@Sun.COMdetails as to how to read the section header(s)). Note that `shdr_num'
742*8044SWilliam.Kucharski@Sun.COMmay be 0, indicating no symbols, even if bit 5 in the `flags' word is
743*8044SWilliam.Kucharski@Sun.COMset.
744*8044SWilliam.Kucharski@Sun.COM
745*8044SWilliam.Kucharski@Sun.COM   If bit 6 in the `flags' word is set, then the `mmap_*' fields are
746*8044SWilliam.Kucharski@Sun.COMvalid, and indicate the address and length of a buffer containing a
747*8044SWilliam.Kucharski@Sun.COMmemory map of the machine provided by the BIOS. `mmap_addr' is the
748*8044SWilliam.Kucharski@Sun.COMaddress, and `mmap_length' is the total size of the buffer. The buffer
749*8044SWilliam.Kucharski@Sun.COMconsists of one or more of the following size/structure pairs (`size'
750*8044SWilliam.Kucharski@Sun.COMis really used for skipping to the next pair):
751*8044SWilliam.Kucharski@Sun.COM
752*8044SWilliam.Kucharski@Sun.COM             +-------------------+
753*8044SWilliam.Kucharski@Sun.COM     -4      | size              |
754*8044SWilliam.Kucharski@Sun.COM             +-------------------+
755*8044SWilliam.Kucharski@Sun.COM     0       | base_addr_low     |
756*8044SWilliam.Kucharski@Sun.COM     4       | base_addr_high    |
757*8044SWilliam.Kucharski@Sun.COM     8       | length_low        |
758*8044SWilliam.Kucharski@Sun.COM     12      | length_high       |
759*8044SWilliam.Kucharski@Sun.COM     16      | type              |
760*8044SWilliam.Kucharski@Sun.COM             +-------------------+
761*8044SWilliam.Kucharski@Sun.COM
762*8044SWilliam.Kucharski@Sun.COM   where `size' is the size of the associated structure in bytes, which
763*8044SWilliam.Kucharski@Sun.COMcan be greater than the minimum of 20 bytes. `base_addr_low' is the
764*8044SWilliam.Kucharski@Sun.COMlower 32 bits of the starting address, and `base_addr_high' is the
765*8044SWilliam.Kucharski@Sun.COMupper 32 bits, for a total of a 64-bit starting address. `length_low'
766*8044SWilliam.Kucharski@Sun.COMis the lower 32 bits of the size of the memory region in bytes, and
767*8044SWilliam.Kucharski@Sun.COM`length_high' is the upper 32 bits, for a total of a 64-bit length.
768*8044SWilliam.Kucharski@Sun.COM`type' is the variety of address range represented, where a value of 1
769*8044SWilliam.Kucharski@Sun.COMindicates available RAM, and all other values currently indicated a
770*8044SWilliam.Kucharski@Sun.COMreserved area.
771*8044SWilliam.Kucharski@Sun.COM
772*8044SWilliam.Kucharski@Sun.COM   The map provided is guaranteed to list all standard RAM that should
773*8044SWilliam.Kucharski@Sun.COMbe available for normal use.
774*8044SWilliam.Kucharski@Sun.COM
775*8044SWilliam.Kucharski@Sun.COM   If bit 7 in the `flags' is set, then the `drives_*' fields are
776*8044SWilliam.Kucharski@Sun.COMvalid, and indicate the address of the physical address of the first
777*8044SWilliam.Kucharski@Sun.COMdrive structure and the size of drive structures. `drives_addr' is the
778*8044SWilliam.Kucharski@Sun.COMaddress, and `drives_length' is the total size of drive structures.
779*8044SWilliam.Kucharski@Sun.COMNote that `drives_length' may be zero. Each drive structure is
780*8044SWilliam.Kucharski@Sun.COMformatted as follows:
781*8044SWilliam.Kucharski@Sun.COM
782*8044SWilliam.Kucharski@Sun.COM             +-------------------+
783*8044SWilliam.Kucharski@Sun.COM     0       | size              |
784*8044SWilliam.Kucharski@Sun.COM             +-------------------+
785*8044SWilliam.Kucharski@Sun.COM     4       | drive_number      |
786*8044SWilliam.Kucharski@Sun.COM             +-------------------+
787*8044SWilliam.Kucharski@Sun.COM     5       | drive_mode        |
788*8044SWilliam.Kucharski@Sun.COM             +-------------------+
789*8044SWilliam.Kucharski@Sun.COM     6       | drive_cylinders   |
790*8044SWilliam.Kucharski@Sun.COM     8       | drive_heads       |
791*8044SWilliam.Kucharski@Sun.COM     9       | drive_sectors     |
792*8044SWilliam.Kucharski@Sun.COM             +-------------------+
793*8044SWilliam.Kucharski@Sun.COM     10 - xx | drive_ports       |
794*8044SWilliam.Kucharski@Sun.COM             +-------------------+
795*8044SWilliam.Kucharski@Sun.COM
796*8044SWilliam.Kucharski@Sun.COM   The `size' field specifies the size of this structure. The size
797*8044SWilliam.Kucharski@Sun.COMvaries, depending on the number of ports. Note that the size may not be
798*8044SWilliam.Kucharski@Sun.COMequal to (10 + 2 * the number of ports), because of an alignment.
799*8044SWilliam.Kucharski@Sun.COM
800*8044SWilliam.Kucharski@Sun.COM   The `drive_number' field contains the BIOS drive number. The
801*8044SWilliam.Kucharski@Sun.COM`drive_mode' field represents the access mode used by the boot loader.
802*8044SWilliam.Kucharski@Sun.COMCurrently, the following modes are defined:
803*8044SWilliam.Kucharski@Sun.COM
804*8044SWilliam.Kucharski@Sun.COM`0'
805*8044SWilliam.Kucharski@Sun.COM     CHS mode (traditional cylinder/head/sector addressing mode).
806*8044SWilliam.Kucharski@Sun.COM
807*8044SWilliam.Kucharski@Sun.COM`1'
808*8044SWilliam.Kucharski@Sun.COM     LBA mode (Logical Block Addressing mode).
809*8044SWilliam.Kucharski@Sun.COM
810*8044SWilliam.Kucharski@Sun.COM   The three fields, `drive_cylinders', `drive_heads' and
811*8044SWilliam.Kucharski@Sun.COM`drive_sectors', indicate the geometry of the drive detected by the
812*8044SWilliam.Kucharski@Sun.COMBIOS. `drive_cylinders' contains the number of the cylinders.
813*8044SWilliam.Kucharski@Sun.COM`drive_heads' contains the number of the heads. `drive_sectors'
814*8044SWilliam.Kucharski@Sun.COMcontains the number of the sectors per track.
815*8044SWilliam.Kucharski@Sun.COM
816*8044SWilliam.Kucharski@Sun.COM   The `drive_ports' field contains the array of the I/O ports used for
817*8044SWilliam.Kucharski@Sun.COMthe drive in the BIOS code. The array consists of zero or more unsigned
818*8044SWilliam.Kucharski@Sun.COMtwo-bytes integers, and is terminated with zero. Note that the array
819*8044SWilliam.Kucharski@Sun.COMmay contain any number of I/O ports that are not related to the drive
820*8044SWilliam.Kucharski@Sun.COMactually (such as DMA controller's ports).
821*8044SWilliam.Kucharski@Sun.COM
822*8044SWilliam.Kucharski@Sun.COM   If bit 8 in the `flags' is set, then the `config_table' field is
823*8044SWilliam.Kucharski@Sun.COMvalid, and indicates the address of the ROM configuration table
824*8044SWilliam.Kucharski@Sun.COMreturned by the "GET CONFIGURATION" BIOS call. If the BIOS call fails,
825*8044SWilliam.Kucharski@Sun.COMthen the size of the table must be _zero_.
826*8044SWilliam.Kucharski@Sun.COM
827*8044SWilliam.Kucharski@Sun.COM   If bit 9 in the `flags' is set, the `boot_loader_name' field is
828*8044SWilliam.Kucharski@Sun.COMvalid, and contains the physical address of the name of a boot loader
829*8044SWilliam.Kucharski@Sun.COMbooting the kernel. The name is a normal C-style zero-terminated string.
830*8044SWilliam.Kucharski@Sun.COM
831*8044SWilliam.Kucharski@Sun.COM   If bit 10 in the `flags' is set, the `apm_table' field is valid, and
832*8044SWilliam.Kucharski@Sun.COMcontains the physical address of an APM table defined as below:
833*8044SWilliam.Kucharski@Sun.COM
834*8044SWilliam.Kucharski@Sun.COM             +----------------------+
835*8044SWilliam.Kucharski@Sun.COM     0       | version              |
836*8044SWilliam.Kucharski@Sun.COM     2       | cseg                 |
837*8044SWilliam.Kucharski@Sun.COM     4       | offset               |
838*8044SWilliam.Kucharski@Sun.COM     8       | cseg_16              |
839*8044SWilliam.Kucharski@Sun.COM     10      | dseg                 |
840*8044SWilliam.Kucharski@Sun.COM     12      | flags                |
841*8044SWilliam.Kucharski@Sun.COM     14      | cseg_len             |
842*8044SWilliam.Kucharski@Sun.COM     16      | cseg_16_len          |
843*8044SWilliam.Kucharski@Sun.COM     18      | dseg_len             |
844*8044SWilliam.Kucharski@Sun.COM             +----------------------+
845*8044SWilliam.Kucharski@Sun.COM
846*8044SWilliam.Kucharski@Sun.COM   The fields `version', `cseg', `offset', `cseg_16', `dseg', `flags',
847*8044SWilliam.Kucharski@Sun.COM`cseg_len', `cseg_16_len', `dseg_len' indicate the version number, the
848*8044SWilliam.Kucharski@Sun.COMprotected mode 32-bit code segment, the offset of the entry point, the
849*8044SWilliam.Kucharski@Sun.COMprotected mode 16-bit code segment, the protected mode 16-bit data
850*8044SWilliam.Kucharski@Sun.COMsegment, the flags, the length of the protected mode 32-bit code
851*8044SWilliam.Kucharski@Sun.COMsegment, the length of the protected mode 16-bit code segment, and the
852*8044SWilliam.Kucharski@Sun.COMlength of the protected mode 16-bit data segment, respectively. Only
853*8044SWilliam.Kucharski@Sun.COMthe field `offset' is 4 bytes, and the others are 2 bytes. See Advanced
854*8044SWilliam.Kucharski@Sun.COMPower Management (APM) BIOS Interface Specification
855*8044SWilliam.Kucharski@Sun.COM(http://www.microsoft.com/hwdev/busbios/amp_12.htm), for more
856*8044SWilliam.Kucharski@Sun.COMinformation.
857*8044SWilliam.Kucharski@Sun.COM
858*8044SWilliam.Kucharski@Sun.COM   If bit 11 in the `flags' is set, the graphics table is available.
859*8044SWilliam.Kucharski@Sun.COMThis must only be done if the kernel has indicated in the `Multiboot
860*8044SWilliam.Kucharski@Sun.COMHeader' that it accepts a graphics mode.
861*8044SWilliam.Kucharski@Sun.COM
862*8044SWilliam.Kucharski@Sun.COM   The fields `vbe_control_info' and `vbe_mode_info' contain the
863*8044SWilliam.Kucharski@Sun.COMphysical addresses of VBE control information returned by the VBE
864*8044SWilliam.Kucharski@Sun.COMFunction 00h and VBE mode information returned by the VBE Function 01h,
865*8044SWilliam.Kucharski@Sun.COMrespectively.
866*8044SWilliam.Kucharski@Sun.COM
867*8044SWilliam.Kucharski@Sun.COM   The field `vbe_mode' indicates current video mode in the format
868*8044SWilliam.Kucharski@Sun.COMspecified in VBE 3.0.
869*8044SWilliam.Kucharski@Sun.COM
870*8044SWilliam.Kucharski@Sun.COM   The rest fields `vbe_interface_seg', `vbe_interface_off', and
871*8044SWilliam.Kucharski@Sun.COM`vbe_interface_len' contain the table of a protected mode interface
872*8044SWilliam.Kucharski@Sun.COMdefined in VBE 2.0+. If this information is not available, those fields
873*8044SWilliam.Kucharski@Sun.COMcontain zero. Note that VBE 3.0 defines another protected mode
874*8044SWilliam.Kucharski@Sun.COMinterface which is incompatible with the old one. If you want to use
875*8044SWilliam.Kucharski@Sun.COMthe new protected mode interface, you will have to find the table
876*8044SWilliam.Kucharski@Sun.COMyourself.
877*8044SWilliam.Kucharski@Sun.COM
878*8044SWilliam.Kucharski@Sun.COM   The fields for the graphics table are designed for VBE, but
879*8044SWilliam.Kucharski@Sun.COMMultiboot boot loaders may simulate VBE on non-VBE modes, as if they
880*8044SWilliam.Kucharski@Sun.COMwere VBE modes.
881*8044SWilliam.Kucharski@Sun.COM
882*8044SWilliam.Kucharski@Sun.COM
883*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Examples,  Next: History,  Prev: Specification,  Up: Top
884*8044SWilliam.Kucharski@Sun.COM
885*8044SWilliam.Kucharski@Sun.COM4 Examples
886*8044SWilliam.Kucharski@Sun.COM**********
887*8044SWilliam.Kucharski@Sun.COM
888*8044SWilliam.Kucharski@Sun.COM*Caution:* The following items are not part of the specification
889*8044SWilliam.Kucharski@Sun.COMdocument, but are included for prospective operating system and boot
890*8044SWilliam.Kucharski@Sun.COMloader writers.
891*8044SWilliam.Kucharski@Sun.COM
892*8044SWilliam.Kucharski@Sun.COM* Menu:
893*8044SWilliam.Kucharski@Sun.COM
894*8044SWilliam.Kucharski@Sun.COM* Notes on PC::
895*8044SWilliam.Kucharski@Sun.COM* BIOS device mapping techniques::
896*8044SWilliam.Kucharski@Sun.COM* Example OS code::
897*8044SWilliam.Kucharski@Sun.COM* Example boot loader code::
898*8044SWilliam.Kucharski@Sun.COM
899*8044SWilliam.Kucharski@Sun.COM
900*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Notes on PC,  Next: BIOS device mapping techniques,  Up: Examples
901*8044SWilliam.Kucharski@Sun.COM
902*8044SWilliam.Kucharski@Sun.COM4.1 Notes on PC
903*8044SWilliam.Kucharski@Sun.COM===============
904*8044SWilliam.Kucharski@Sun.COM
905*8044SWilliam.Kucharski@Sun.COMIn reference to bit 0 of the `flags' parameter in the Multiboot
906*8044SWilliam.Kucharski@Sun.COMinformation structure, if the bootloader in question uses older BIOS
907*8044SWilliam.Kucharski@Sun.COMinterfaces, or the newest ones are not available (see description about
908*8044SWilliam.Kucharski@Sun.COMbit 6), then a maximum of either 15 or 63 megabytes of memory may be
909*8044SWilliam.Kucharski@Sun.COMreported. It is _highly_ recommended that boot loaders perform a
910*8044SWilliam.Kucharski@Sun.COMthorough memory probe.
911*8044SWilliam.Kucharski@Sun.COM
912*8044SWilliam.Kucharski@Sun.COM   In reference to bit 1 of the `flags' parameter in the Multiboot
913*8044SWilliam.Kucharski@Sun.COMinformation structure, it is recognized that determination of which
914*8044SWilliam.Kucharski@Sun.COMBIOS drive maps to which device driver in an operating system is
915*8044SWilliam.Kucharski@Sun.COMnon-trivial, at best. Many kludges have been made to various operating
916*8044SWilliam.Kucharski@Sun.COMsystems instead of solving this problem, most of them breaking under
917*8044SWilliam.Kucharski@Sun.COMmany conditions. To encourage the use of general-purpose solutions to
918*8044SWilliam.Kucharski@Sun.COMthis problem, there are 2 BIOS device mapping techniques (*note BIOS
919*8044SWilliam.Kucharski@Sun.COMdevice mapping techniques::).
920*8044SWilliam.Kucharski@Sun.COM
921*8044SWilliam.Kucharski@Sun.COM   In reference to bit 6 of the `flags' parameter in the Multiboot
922*8044SWilliam.Kucharski@Sun.COMinformation structure, it is important to note that the data structure
923*8044SWilliam.Kucharski@Sun.COMused there (starting with `BaseAddrLow') is the data returned by the
924*8044SWilliam.Kucharski@Sun.COMINT 15h, AX=E820h -- Query System Address Map call. See *Note Query
925*8044SWilliam.Kucharski@Sun.COMSystem Address Map: (grub.info)Query System Address Map, for more
926*8044SWilliam.Kucharski@Sun.COMinformation. The interface here is meant to allow a boot loader to work
927*8044SWilliam.Kucharski@Sun.COMunmodified with any reasonable extensions of the BIOS interface,
928*8044SWilliam.Kucharski@Sun.COMpassing along any extra data to be interpreted by the operating system
929*8044SWilliam.Kucharski@Sun.COMas desired.
930*8044SWilliam.Kucharski@Sun.COM
931*8044SWilliam.Kucharski@Sun.COM
932*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: BIOS device mapping techniques,  Next: Example OS code,  Prev: Notes on PC,  Up: Examples
933*8044SWilliam.Kucharski@Sun.COM
934*8044SWilliam.Kucharski@Sun.COM4.2 BIOS device mapping techniques
935*8044SWilliam.Kucharski@Sun.COM==================================
936*8044SWilliam.Kucharski@Sun.COM
937*8044SWilliam.Kucharski@Sun.COMBoth of these techniques should be usable from any PC operating system,
938*8044SWilliam.Kucharski@Sun.COMand neither require any special support in the drivers themselves. This
939*8044SWilliam.Kucharski@Sun.COMsection will be flushed out into detailed explanations, particularly for
940*8044SWilliam.Kucharski@Sun.COMthe I/O restriction technique.
941*8044SWilliam.Kucharski@Sun.COM
942*8044SWilliam.Kucharski@Sun.COM   The general rule is that the data comparison technique is the quick
943*8044SWilliam.Kucharski@Sun.COMand dirty solution. It works most of the time, but doesn't cover all the
944*8044SWilliam.Kucharski@Sun.COMbases, and is relatively simple.
945*8044SWilliam.Kucharski@Sun.COM
946*8044SWilliam.Kucharski@Sun.COM   The I/O restriction technique is much more complex, but it has
947*8044SWilliam.Kucharski@Sun.COMpotential to solve the problem under all conditions, plus allow access
948*8044SWilliam.Kucharski@Sun.COMof the remaining BIOS devices when not all of them have operating system
949*8044SWilliam.Kucharski@Sun.COMdrivers.
950*8044SWilliam.Kucharski@Sun.COM
951*8044SWilliam.Kucharski@Sun.COM* Menu:
952*8044SWilliam.Kucharski@Sun.COM
953*8044SWilliam.Kucharski@Sun.COM* Data comparison technique::
954*8044SWilliam.Kucharski@Sun.COM* I/O restriction technique::
955*8044SWilliam.Kucharski@Sun.COM
956*8044SWilliam.Kucharski@Sun.COM
957*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Data comparison technique,  Next: I/O restriction technique,  Up: BIOS device mapping techniques
958*8044SWilliam.Kucharski@Sun.COM
959*8044SWilliam.Kucharski@Sun.COM4.2.1 Data comparison technique
960*8044SWilliam.Kucharski@Sun.COM-------------------------------
961*8044SWilliam.Kucharski@Sun.COM
962*8044SWilliam.Kucharski@Sun.COMBefore activating _any_ of the device drivers, gather enough data from
963*8044SWilliam.Kucharski@Sun.COMsimilar sectors on each of the disks such that each one can be uniquely
964*8044SWilliam.Kucharski@Sun.COMidentified.
965*8044SWilliam.Kucharski@Sun.COM
966*8044SWilliam.Kucharski@Sun.COM   After activating the device drivers, compare data from the drives
967*8044SWilliam.Kucharski@Sun.COMusing the operating system drivers. This should hopefully be sufficient
968*8044SWilliam.Kucharski@Sun.COMto provide such a mapping.
969*8044SWilliam.Kucharski@Sun.COM
970*8044SWilliam.Kucharski@Sun.COM   Problems:
971*8044SWilliam.Kucharski@Sun.COM
972*8044SWilliam.Kucharski@Sun.COM  1. The data on some BIOS devices might be identical (so the part
973*8044SWilliam.Kucharski@Sun.COM     reading the drives from the BIOS should have some mechanism to give
974*8044SWilliam.Kucharski@Sun.COM     up).
975*8044SWilliam.Kucharski@Sun.COM
976*8044SWilliam.Kucharski@Sun.COM  2. There might be extra drives not accessible from the BIOS which are
977*8044SWilliam.Kucharski@Sun.COM     identical to some drive used by the BIOS (so it should be capable
978*8044SWilliam.Kucharski@Sun.COM     of giving up there as well).
979*8044SWilliam.Kucharski@Sun.COM
980*8044SWilliam.Kucharski@Sun.COM
981*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: I/O restriction technique,  Prev: Data comparison technique,  Up: BIOS device mapping techniques
982*8044SWilliam.Kucharski@Sun.COM
983*8044SWilliam.Kucharski@Sun.COM4.2.2 I/O restriction technique
984*8044SWilliam.Kucharski@Sun.COM-------------------------------
985*8044SWilliam.Kucharski@Sun.COM
986*8044SWilliam.Kucharski@Sun.COMThis first step may be unnecessary, but first create copy-on-write
987*8044SWilliam.Kucharski@Sun.COMmappings for the device drivers writing into PC RAM. Keep the original
988*8044SWilliam.Kucharski@Sun.COMcopies for the "clean BIOS virtual machine" to be created later.
989*8044SWilliam.Kucharski@Sun.COM
990*8044SWilliam.Kucharski@Sun.COM   For each device driver brought online, determine which BIOS devices
991*8044SWilliam.Kucharski@Sun.COMbecome inaccessible by:
992*8044SWilliam.Kucharski@Sun.COM
993*8044SWilliam.Kucharski@Sun.COM  1. Create a "clean BIOS virtual machine".
994*8044SWilliam.Kucharski@Sun.COM
995*8044SWilliam.Kucharski@Sun.COM  2. Set the I/O permission map for the I/O area claimed by the device
996*8044SWilliam.Kucharski@Sun.COM     driver to no permissions (neither read nor write).
997*8044SWilliam.Kucharski@Sun.COM
998*8044SWilliam.Kucharski@Sun.COM  3. Access each device.
999*8044SWilliam.Kucharski@Sun.COM
1000*8044SWilliam.Kucharski@Sun.COM  4. Record which devices succeed, and those which try to access the
1001*8044SWilliam.Kucharski@Sun.COM     "restricted" I/O areas (hopefully, this will be an "xor"
1002*8044SWilliam.Kucharski@Sun.COM     situation).
1003*8044SWilliam.Kucharski@Sun.COM
1004*8044SWilliam.Kucharski@Sun.COM   For each device driver, given how many of the BIOS devices were
1005*8044SWilliam.Kucharski@Sun.COMsubsumed by it (there should be no gaps in this list), it should be easy
1006*8044SWilliam.Kucharski@Sun.COMto determine which devices on the controller these are.
1007*8044SWilliam.Kucharski@Sun.COM
1008*8044SWilliam.Kucharski@Sun.COM   In general, you have at most 2 disks from each controller given BIOS
1009*8044SWilliam.Kucharski@Sun.COMnumbers, but they pretty much always count from the lowest logically
1010*8044SWilliam.Kucharski@Sun.COMnumbered devices on the controller.
1011*8044SWilliam.Kucharski@Sun.COM
1012*8044SWilliam.Kucharski@Sun.COM
1013*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Example OS code,  Next: Example boot loader code,  Prev: BIOS device mapping techniques,  Up: Examples
1014*8044SWilliam.Kucharski@Sun.COM
1015*8044SWilliam.Kucharski@Sun.COM4.3 Example OS code
1016*8044SWilliam.Kucharski@Sun.COM===================
1017*8044SWilliam.Kucharski@Sun.COM
1018*8044SWilliam.Kucharski@Sun.COMIn this distribution, the example Multiboot kernel `kernel' is
1019*8044SWilliam.Kucharski@Sun.COMincluded. The kernel just prints out the Multiboot information structure
1020*8044SWilliam.Kucharski@Sun.COMon the screen, so you can make use of the kernel to test a
1021*8044SWilliam.Kucharski@Sun.COMMultiboot-compliant boot loader and for reference to how to implement a
1022*8044SWilliam.Kucharski@Sun.COMMultiboot kernel. The source files can be found under the directory
1023*8044SWilliam.Kucharski@Sun.COM`docs' in the GRUB distribution.
1024*8044SWilliam.Kucharski@Sun.COM
1025*8044SWilliam.Kucharski@Sun.COM   The kernel `kernel' consists of only three files: `boot.S',
1026*8044SWilliam.Kucharski@Sun.COM`kernel.c' and `multiboot.h'. The assembly source `boot.S' is written
1027*8044SWilliam.Kucharski@Sun.COMin GAS (*note GNU assembler: (as.info)Top.), and contains the Multiboot
1028*8044SWilliam.Kucharski@Sun.COMinformation structure to comply with the specification. When a
1029*8044SWilliam.Kucharski@Sun.COMMultiboot-compliant boot loader loads and execute it, it initialize the
1030*8044SWilliam.Kucharski@Sun.COMstack pointer and `EFLAGS', and then call the function `cmain' defined
1031*8044SWilliam.Kucharski@Sun.COMin `kernel.c'. If `cmain' returns to the callee, then it shows a
1032*8044SWilliam.Kucharski@Sun.COMmessage to inform the user of the halt state and stops forever until
1033*8044SWilliam.Kucharski@Sun.COMyou push the reset key. The file `kernel.c' contains the function
1034*8044SWilliam.Kucharski@Sun.COM`cmain', which checks if the magic number passed by the boot loader is
1035*8044SWilliam.Kucharski@Sun.COMvalid and so on, and some functions to print messages on the screen.
1036*8044SWilliam.Kucharski@Sun.COMThe file `multiboot.h' defines some macros, such as the magic number
1037*8044SWilliam.Kucharski@Sun.COMfor the Multiboot header, the Multiboot header structure and the
1038*8044SWilliam.Kucharski@Sun.COMMultiboot information structure.
1039*8044SWilliam.Kucharski@Sun.COM
1040*8044SWilliam.Kucharski@Sun.COM* Menu:
1041*8044SWilliam.Kucharski@Sun.COM
1042*8044SWilliam.Kucharski@Sun.COM* multiboot.h::
1043*8044SWilliam.Kucharski@Sun.COM* boot.S::
1044*8044SWilliam.Kucharski@Sun.COM* kernel.c::
1045*8044SWilliam.Kucharski@Sun.COM* Other Multiboot kernels::
1046*8044SWilliam.Kucharski@Sun.COM
1047*8044SWilliam.Kucharski@Sun.COM
1048*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: multiboot.h,  Next: boot.S,  Up: Example OS code
1049*8044SWilliam.Kucharski@Sun.COM
1050*8044SWilliam.Kucharski@Sun.COM4.3.1 multiboot.h
1051*8044SWilliam.Kucharski@Sun.COM-----------------
1052*8044SWilliam.Kucharski@Sun.COM
1053*8044SWilliam.Kucharski@Sun.COMThis is the source code in the file `multiboot.h':
1054*8044SWilliam.Kucharski@Sun.COM
1055*8044SWilliam.Kucharski@Sun.COM     /* multiboot.h - the header for Multiboot */
1056*8044SWilliam.Kucharski@Sun.COM     /* Copyright (C) 1999, 2001  Free Software Foundation, Inc.
1057*8044SWilliam.Kucharski@Sun.COM
1058*8044SWilliam.Kucharski@Sun.COM        This program is free software; you can redistribute it and/or modify
1059*8044SWilliam.Kucharski@Sun.COM        it under the terms of the GNU General Public License as published by
1060*8044SWilliam.Kucharski@Sun.COM        the Free Software Foundation; either version 2 of the License, or
1061*8044SWilliam.Kucharski@Sun.COM        (at your option) any later version.
1062*8044SWilliam.Kucharski@Sun.COM
1063*8044SWilliam.Kucharski@Sun.COM        This program is distributed in the hope that it will be useful,
1064*8044SWilliam.Kucharski@Sun.COM        but WITHOUT ANY WARRANTY; without even the implied warranty of
1065*8044SWilliam.Kucharski@Sun.COM        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1066*8044SWilliam.Kucharski@Sun.COM        GNU General Public License for more details.
1067*8044SWilliam.Kucharski@Sun.COM
1068*8044SWilliam.Kucharski@Sun.COM        You should have received a copy of the GNU General Public License
1069*8044SWilliam.Kucharski@Sun.COM        along with this program; if not, write to the Free Software
1070*8044SWilliam.Kucharski@Sun.COM        Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
1071*8044SWilliam.Kucharski@Sun.COM
1072*8044SWilliam.Kucharski@Sun.COM     /* Macros. */
1073*8044SWilliam.Kucharski@Sun.COM
1074*8044SWilliam.Kucharski@Sun.COM     /* The magic number for the Multiboot header. */
1075*8044SWilliam.Kucharski@Sun.COM     #define MULTIBOOT_HEADER_MAGIC          0x1BADB002
1076*8044SWilliam.Kucharski@Sun.COM
1077*8044SWilliam.Kucharski@Sun.COM     /* The flags for the Multiboot header. */
1078*8044SWilliam.Kucharski@Sun.COM     #ifdef __ELF__
1079*8044SWilliam.Kucharski@Sun.COM     # define MULTIBOOT_HEADER_FLAGS         0x00000003
1080*8044SWilliam.Kucharski@Sun.COM     #else
1081*8044SWilliam.Kucharski@Sun.COM     # define MULTIBOOT_HEADER_FLAGS         0x00010003
1082*8044SWilliam.Kucharski@Sun.COM     #endif
1083*8044SWilliam.Kucharski@Sun.COM
1084*8044SWilliam.Kucharski@Sun.COM     /* The magic number passed by a Multiboot-compliant boot loader. */
1085*8044SWilliam.Kucharski@Sun.COM     #define MULTIBOOT_BOOTLOADER_MAGIC      0x2BADB002
1086*8044SWilliam.Kucharski@Sun.COM
1087*8044SWilliam.Kucharski@Sun.COM     /* The size of our stack (16KB). */
1088*8044SWilliam.Kucharski@Sun.COM     #define STACK_SIZE                      0x4000
1089*8044SWilliam.Kucharski@Sun.COM
1090*8044SWilliam.Kucharski@Sun.COM     /* C symbol format. HAVE_ASM_USCORE is defined by configure. */
1091*8044SWilliam.Kucharski@Sun.COM     #ifdef HAVE_ASM_USCORE
1092*8044SWilliam.Kucharski@Sun.COM     # define EXT_C(sym)                     _ ## sym
1093*8044SWilliam.Kucharski@Sun.COM     #else
1094*8044SWilliam.Kucharski@Sun.COM     # define EXT_C(sym)                     sym
1095*8044SWilliam.Kucharski@Sun.COM     #endif
1096*8044SWilliam.Kucharski@Sun.COM
1097*8044SWilliam.Kucharski@Sun.COM     #ifndef ASM
1098*8044SWilliam.Kucharski@Sun.COM     /* Do not include here in boot.S. */
1099*8044SWilliam.Kucharski@Sun.COM
1100*8044SWilliam.Kucharski@Sun.COM     /* Types. */
1101*8044SWilliam.Kucharski@Sun.COM
1102*8044SWilliam.Kucharski@Sun.COM     /* The Multiboot header. */
1103*8044SWilliam.Kucharski@Sun.COM     typedef struct multiboot_header
1104*8044SWilliam.Kucharski@Sun.COM     {
1105*8044SWilliam.Kucharski@Sun.COM       unsigned long magic;
1106*8044SWilliam.Kucharski@Sun.COM       unsigned long flags;
1107*8044SWilliam.Kucharski@Sun.COM       unsigned long checksum;
1108*8044SWilliam.Kucharski@Sun.COM       unsigned long header_addr;
1109*8044SWilliam.Kucharski@Sun.COM       unsigned long load_addr;
1110*8044SWilliam.Kucharski@Sun.COM       unsigned long load_end_addr;
1111*8044SWilliam.Kucharski@Sun.COM       unsigned long bss_end_addr;
1112*8044SWilliam.Kucharski@Sun.COM       unsigned long entry_addr;
1113*8044SWilliam.Kucharski@Sun.COM     } multiboot_header_t;
1114*8044SWilliam.Kucharski@Sun.COM
1115*8044SWilliam.Kucharski@Sun.COM     /* The symbol table for a.out. */
1116*8044SWilliam.Kucharski@Sun.COM     typedef struct aout_symbol_table
1117*8044SWilliam.Kucharski@Sun.COM     {
1118*8044SWilliam.Kucharski@Sun.COM       unsigned long tabsize;
1119*8044SWilliam.Kucharski@Sun.COM       unsigned long strsize;
1120*8044SWilliam.Kucharski@Sun.COM       unsigned long addr;
1121*8044SWilliam.Kucharski@Sun.COM       unsigned long reserved;
1122*8044SWilliam.Kucharski@Sun.COM     } aout_symbol_table_t;
1123*8044SWilliam.Kucharski@Sun.COM
1124*8044SWilliam.Kucharski@Sun.COM     /* The section header table for ELF. */
1125*8044SWilliam.Kucharski@Sun.COM     typedef struct elf_section_header_table
1126*8044SWilliam.Kucharski@Sun.COM     {
1127*8044SWilliam.Kucharski@Sun.COM       unsigned long num;
1128*8044SWilliam.Kucharski@Sun.COM       unsigned long size;
1129*8044SWilliam.Kucharski@Sun.COM       unsigned long addr;
1130*8044SWilliam.Kucharski@Sun.COM       unsigned long shndx;
1131*8044SWilliam.Kucharski@Sun.COM     } elf_section_header_table_t;
1132*8044SWilliam.Kucharski@Sun.COM
1133*8044SWilliam.Kucharski@Sun.COM     /* The Multiboot information. */
1134*8044SWilliam.Kucharski@Sun.COM     typedef struct multiboot_info
1135*8044SWilliam.Kucharski@Sun.COM     {
1136*8044SWilliam.Kucharski@Sun.COM       unsigned long flags;
1137*8044SWilliam.Kucharski@Sun.COM       unsigned long mem_lower;
1138*8044SWilliam.Kucharski@Sun.COM       unsigned long mem_upper;
1139*8044SWilliam.Kucharski@Sun.COM       unsigned long boot_device;
1140*8044SWilliam.Kucharski@Sun.COM       unsigned long cmdline;
1141*8044SWilliam.Kucharski@Sun.COM       unsigned long mods_count;
1142*8044SWilliam.Kucharski@Sun.COM       unsigned long mods_addr;
1143*8044SWilliam.Kucharski@Sun.COM       union
1144*8044SWilliam.Kucharski@Sun.COM       {
1145*8044SWilliam.Kucharski@Sun.COM         aout_symbol_table_t aout_sym;
1146*8044SWilliam.Kucharski@Sun.COM         elf_section_header_table_t elf_sec;
1147*8044SWilliam.Kucharski@Sun.COM       } u;
1148*8044SWilliam.Kucharski@Sun.COM       unsigned long mmap_length;
1149*8044SWilliam.Kucharski@Sun.COM       unsigned long mmap_addr;
1150*8044SWilliam.Kucharski@Sun.COM     } multiboot_info_t;
1151*8044SWilliam.Kucharski@Sun.COM
1152*8044SWilliam.Kucharski@Sun.COM     /* The module structure. */
1153*8044SWilliam.Kucharski@Sun.COM     typedef struct module
1154*8044SWilliam.Kucharski@Sun.COM     {
1155*8044SWilliam.Kucharski@Sun.COM       unsigned long mod_start;
1156*8044SWilliam.Kucharski@Sun.COM       unsigned long mod_end;
1157*8044SWilliam.Kucharski@Sun.COM       unsigned long string;
1158*8044SWilliam.Kucharski@Sun.COM       unsigned long reserved;
1159*8044SWilliam.Kucharski@Sun.COM     } module_t;
1160*8044SWilliam.Kucharski@Sun.COM
1161*8044SWilliam.Kucharski@Sun.COM     /* The memory map. Be careful that the offset 0 is base_addr_low
1162*8044SWilliam.Kucharski@Sun.COM        but no size. */
1163*8044SWilliam.Kucharski@Sun.COM     typedef struct memory_map
1164*8044SWilliam.Kucharski@Sun.COM     {
1165*8044SWilliam.Kucharski@Sun.COM       unsigned long size;
1166*8044SWilliam.Kucharski@Sun.COM       unsigned long base_addr_low;
1167*8044SWilliam.Kucharski@Sun.COM       unsigned long base_addr_high;
1168*8044SWilliam.Kucharski@Sun.COM       unsigned long length_low;
1169*8044SWilliam.Kucharski@Sun.COM       unsigned long length_high;
1170*8044SWilliam.Kucharski@Sun.COM       unsigned long type;
1171*8044SWilliam.Kucharski@Sun.COM     } memory_map_t;
1172*8044SWilliam.Kucharski@Sun.COM
1173*8044SWilliam.Kucharski@Sun.COM     #endif /* ! ASM */
1174*8044SWilliam.Kucharski@Sun.COM
1175*8044SWilliam.Kucharski@Sun.COM
1176*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: boot.S,  Next: kernel.c,  Prev: multiboot.h,  Up: Example OS code
1177*8044SWilliam.Kucharski@Sun.COM
1178*8044SWilliam.Kucharski@Sun.COM4.3.2 boot.S
1179*8044SWilliam.Kucharski@Sun.COM------------
1180*8044SWilliam.Kucharski@Sun.COM
1181*8044SWilliam.Kucharski@Sun.COMIn the file `boot.S':
1182*8044SWilliam.Kucharski@Sun.COM
1183*8044SWilliam.Kucharski@Sun.COM     /* boot.S - bootstrap the kernel */
1184*8044SWilliam.Kucharski@Sun.COM     /* Copyright (C) 1999, 2001  Free Software Foundation, Inc.
1185*8044SWilliam.Kucharski@Sun.COM
1186*8044SWilliam.Kucharski@Sun.COM        This program is free software; you can redistribute it and/or modify
1187*8044SWilliam.Kucharski@Sun.COM        it under the terms of the GNU General Public License as published by
1188*8044SWilliam.Kucharski@Sun.COM        the Free Software Foundation; either version 2 of the License, or
1189*8044SWilliam.Kucharski@Sun.COM        (at your option) any later version.
1190*8044SWilliam.Kucharski@Sun.COM
1191*8044SWilliam.Kucharski@Sun.COM        This program is distributed in the hope that it will be useful,
1192*8044SWilliam.Kucharski@Sun.COM        but WITHOUT ANY WARRANTY; without even the implied warranty of
1193*8044SWilliam.Kucharski@Sun.COM        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1194*8044SWilliam.Kucharski@Sun.COM        GNU General Public License for more details.
1195*8044SWilliam.Kucharski@Sun.COM
1196*8044SWilliam.Kucharski@Sun.COM        You should have received a copy of the GNU General Public License
1197*8044SWilliam.Kucharski@Sun.COM        along with this program; if not, write to the Free Software
1198*8044SWilliam.Kucharski@Sun.COM        Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
1199*8044SWilliam.Kucharski@Sun.COM
1200*8044SWilliam.Kucharski@Sun.COM     #define ASM     1
1201*8044SWilliam.Kucharski@Sun.COM     #include <multiboot.h>
1202*8044SWilliam.Kucharski@Sun.COM
1203*8044SWilliam.Kucharski@Sun.COM             .text
1204*8044SWilliam.Kucharski@Sun.COM
1205*8044SWilliam.Kucharski@Sun.COM             .globl  start, _start
1206*8044SWilliam.Kucharski@Sun.COM     start:
1207*8044SWilliam.Kucharski@Sun.COM     _start:
1208*8044SWilliam.Kucharski@Sun.COM             jmp     multiboot_entry
1209*8044SWilliam.Kucharski@Sun.COM
1210*8044SWilliam.Kucharski@Sun.COM             /* Align 32 bits boundary. */
1211*8044SWilliam.Kucharski@Sun.COM             .align  4
1212*8044SWilliam.Kucharski@Sun.COM
1213*8044SWilliam.Kucharski@Sun.COM             /* Multiboot header. */
1214*8044SWilliam.Kucharski@Sun.COM     multiboot_header:
1215*8044SWilliam.Kucharski@Sun.COM             /* magic */
1216*8044SWilliam.Kucharski@Sun.COM             .long   MULTIBOOT_HEADER_MAGIC
1217*8044SWilliam.Kucharski@Sun.COM             /* flags */
1218*8044SWilliam.Kucharski@Sun.COM             .long   MULTIBOOT_HEADER_FLAGS
1219*8044SWilliam.Kucharski@Sun.COM             /* checksum */
1220*8044SWilliam.Kucharski@Sun.COM             .long   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
1221*8044SWilliam.Kucharski@Sun.COM     #ifndef __ELF__
1222*8044SWilliam.Kucharski@Sun.COM             /* header_addr */
1223*8044SWilliam.Kucharski@Sun.COM             .long   multiboot_header
1224*8044SWilliam.Kucharski@Sun.COM             /* load_addr */
1225*8044SWilliam.Kucharski@Sun.COM             .long   _start
1226*8044SWilliam.Kucharski@Sun.COM             /* load_end_addr */
1227*8044SWilliam.Kucharski@Sun.COM             .long   _edata
1228*8044SWilliam.Kucharski@Sun.COM             /* bss_end_addr */
1229*8044SWilliam.Kucharski@Sun.COM             .long   _end
1230*8044SWilliam.Kucharski@Sun.COM             /* entry_addr */
1231*8044SWilliam.Kucharski@Sun.COM             .long   multiboot_entry
1232*8044SWilliam.Kucharski@Sun.COM     #endif /* ! __ELF__ */
1233*8044SWilliam.Kucharski@Sun.COM
1234*8044SWilliam.Kucharski@Sun.COM     multiboot_entry:
1235*8044SWilliam.Kucharski@Sun.COM             /* Initialize the stack pointer. */
1236*8044SWilliam.Kucharski@Sun.COM             movl    $(stack + STACK_SIZE), %esp
1237*8044SWilliam.Kucharski@Sun.COM
1238*8044SWilliam.Kucharski@Sun.COM             /* Reset EFLAGS. */
1239*8044SWilliam.Kucharski@Sun.COM             pushl   $0
1240*8044SWilliam.Kucharski@Sun.COM             popf
1241*8044SWilliam.Kucharski@Sun.COM
1242*8044SWilliam.Kucharski@Sun.COM             /* Push the pointer to the Multiboot information structure. */
1243*8044SWilliam.Kucharski@Sun.COM             pushl   %ebx
1244*8044SWilliam.Kucharski@Sun.COM             /* Push the magic value. */
1245*8044SWilliam.Kucharski@Sun.COM             pushl   %eax
1246*8044SWilliam.Kucharski@Sun.COM
1247*8044SWilliam.Kucharski@Sun.COM             /* Now enter the C main function... */
1248*8044SWilliam.Kucharski@Sun.COM             call    EXT_C(cmain)
1249*8044SWilliam.Kucharski@Sun.COM
1250*8044SWilliam.Kucharski@Sun.COM             /* Halt. */
1251*8044SWilliam.Kucharski@Sun.COM             pushl   $halt_message
1252*8044SWilliam.Kucharski@Sun.COM             call    EXT_C(printf)
1253*8044SWilliam.Kucharski@Sun.COM
1254*8044SWilliam.Kucharski@Sun.COM     loop:   hlt
1255*8044SWilliam.Kucharski@Sun.COM             jmp     loop
1256*8044SWilliam.Kucharski@Sun.COM
1257*8044SWilliam.Kucharski@Sun.COM     halt_message:
1258*8044SWilliam.Kucharski@Sun.COM             .asciz  "Halted."
1259*8044SWilliam.Kucharski@Sun.COM
1260*8044SWilliam.Kucharski@Sun.COM             /* Our stack area. */
1261*8044SWilliam.Kucharski@Sun.COM             .comm   stack, STACK_SIZE
1262*8044SWilliam.Kucharski@Sun.COM
1263*8044SWilliam.Kucharski@Sun.COM
1264*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: kernel.c,  Next: Other Multiboot kernels,  Prev: boot.S,  Up: Example OS code
1265*8044SWilliam.Kucharski@Sun.COM
1266*8044SWilliam.Kucharski@Sun.COM4.3.3 kernel.c
1267*8044SWilliam.Kucharski@Sun.COM--------------
1268*8044SWilliam.Kucharski@Sun.COM
1269*8044SWilliam.Kucharski@Sun.COMAnd, in the file `kernel.c':
1270*8044SWilliam.Kucharski@Sun.COM
1271*8044SWilliam.Kucharski@Sun.COM     /* kernel.c - the C part of the kernel */
1272*8044SWilliam.Kucharski@Sun.COM     /* Copyright (C) 1999  Free Software Foundation, Inc.
1273*8044SWilliam.Kucharski@Sun.COM
1274*8044SWilliam.Kucharski@Sun.COM        This program is free software; you can redistribute it and/or modify
1275*8044SWilliam.Kucharski@Sun.COM        it under the terms of the GNU General Public License as published by
1276*8044SWilliam.Kucharski@Sun.COM        the Free Software Foundation; either version 2 of the License, or
1277*8044SWilliam.Kucharski@Sun.COM        (at your option) any later version.
1278*8044SWilliam.Kucharski@Sun.COM
1279*8044SWilliam.Kucharski@Sun.COM        This program is distributed in the hope that it will be useful,
1280*8044SWilliam.Kucharski@Sun.COM        but WITHOUT ANY WARRANTY; without even the implied warranty of
1281*8044SWilliam.Kucharski@Sun.COM        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1282*8044SWilliam.Kucharski@Sun.COM        GNU General Public License for more details.
1283*8044SWilliam.Kucharski@Sun.COM
1284*8044SWilliam.Kucharski@Sun.COM        You should have received a copy of the GNU General Public License
1285*8044SWilliam.Kucharski@Sun.COM        along with this program; if not, write to the Free Software
1286*8044SWilliam.Kucharski@Sun.COM        Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
1287*8044SWilliam.Kucharski@Sun.COM
1288*8044SWilliam.Kucharski@Sun.COM     #include <multiboot.h>
1289*8044SWilliam.Kucharski@Sun.COM
1290*8044SWilliam.Kucharski@Sun.COM     /* Macros. */
1291*8044SWilliam.Kucharski@Sun.COM
1292*8044SWilliam.Kucharski@Sun.COM     /* Check if the bit BIT in FLAGS is set. */
1293*8044SWilliam.Kucharski@Sun.COM     #define CHECK_FLAG(flags,bit)   ((flags) & (1 << (bit)))
1294*8044SWilliam.Kucharski@Sun.COM
1295*8044SWilliam.Kucharski@Sun.COM     /* Some screen stuff. */
1296*8044SWilliam.Kucharski@Sun.COM     /* The number of columns. */
1297*8044SWilliam.Kucharski@Sun.COM     #define COLUMNS                 80
1298*8044SWilliam.Kucharski@Sun.COM     /* The number of lines. */
1299*8044SWilliam.Kucharski@Sun.COM     #define LINES                   24
1300*8044SWilliam.Kucharski@Sun.COM     /* The attribute of an character. */
1301*8044SWilliam.Kucharski@Sun.COM     #define ATTRIBUTE               7
1302*8044SWilliam.Kucharski@Sun.COM     /* The video memory address. */
1303*8044SWilliam.Kucharski@Sun.COM     #define VIDEO                   0xB8000
1304*8044SWilliam.Kucharski@Sun.COM
1305*8044SWilliam.Kucharski@Sun.COM     /* Variables. */
1306*8044SWilliam.Kucharski@Sun.COM     /* Save the X position. */
1307*8044SWilliam.Kucharski@Sun.COM     static int xpos;
1308*8044SWilliam.Kucharski@Sun.COM     /* Save the Y position. */
1309*8044SWilliam.Kucharski@Sun.COM     static int ypos;
1310*8044SWilliam.Kucharski@Sun.COM     /* Point to the video memory. */
1311*8044SWilliam.Kucharski@Sun.COM     static volatile unsigned char *video;
1312*8044SWilliam.Kucharski@Sun.COM
1313*8044SWilliam.Kucharski@Sun.COM     /* Forward declarations. */
1314*8044SWilliam.Kucharski@Sun.COM     void cmain (unsigned long magic, unsigned long addr);
1315*8044SWilliam.Kucharski@Sun.COM     static void cls (void);
1316*8044SWilliam.Kucharski@Sun.COM     static void itoa (char *buf, int base, int d);
1317*8044SWilliam.Kucharski@Sun.COM     static void putchar (int c);
1318*8044SWilliam.Kucharski@Sun.COM     void printf (const char *format, ...);
1319*8044SWilliam.Kucharski@Sun.COM
1320*8044SWilliam.Kucharski@Sun.COM     /* Check if MAGIC is valid and print the Multiboot information structure
1321*8044SWilliam.Kucharski@Sun.COM        pointed by ADDR. */
1322*8044SWilliam.Kucharski@Sun.COM     void
1323*8044SWilliam.Kucharski@Sun.COM     cmain (unsigned long magic, unsigned long addr)
1324*8044SWilliam.Kucharski@Sun.COM     {
1325*8044SWilliam.Kucharski@Sun.COM       multiboot_info_t *mbi;
1326*8044SWilliam.Kucharski@Sun.COM
1327*8044SWilliam.Kucharski@Sun.COM       /* Clear the screen. */
1328*8044SWilliam.Kucharski@Sun.COM       cls ();
1329*8044SWilliam.Kucharski@Sun.COM
1330*8044SWilliam.Kucharski@Sun.COM       /* Am I booted by a Multiboot-compliant boot loader? */
1331*8044SWilliam.Kucharski@Sun.COM       if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
1332*8044SWilliam.Kucharski@Sun.COM         {
1333*8044SWilliam.Kucharski@Sun.COM           printf ("Invalid magic number: 0x%x\n", (unsigned) magic);
1334*8044SWilliam.Kucharski@Sun.COM           return;
1335*8044SWilliam.Kucharski@Sun.COM         }
1336*8044SWilliam.Kucharski@Sun.COM
1337*8044SWilliam.Kucharski@Sun.COM       /* Set MBI to the address of the Multiboot information structure. */
1338*8044SWilliam.Kucharski@Sun.COM       mbi = (multiboot_info_t *) addr;
1339*8044SWilliam.Kucharski@Sun.COM
1340*8044SWilliam.Kucharski@Sun.COM       /* Print out the flags. */
1341*8044SWilliam.Kucharski@Sun.COM       printf ("flags = 0x%x\n", (unsigned) mbi->flags);
1342*8044SWilliam.Kucharski@Sun.COM
1343*8044SWilliam.Kucharski@Sun.COM       /* Are mem_* valid? */
1344*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 0))
1345*8044SWilliam.Kucharski@Sun.COM         printf ("mem_lower = %uKB, mem_upper = %uKB\n",
1346*8044SWilliam.Kucharski@Sun.COM                 (unsigned) mbi->mem_lower, (unsigned) mbi->mem_upper);
1347*8044SWilliam.Kucharski@Sun.COM
1348*8044SWilliam.Kucharski@Sun.COM       /* Is boot_device valid? */
1349*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 1))
1350*8044SWilliam.Kucharski@Sun.COM         printf ("boot_device = 0x%x\n", (unsigned) mbi->boot_device);
1351*8044SWilliam.Kucharski@Sun.COM
1352*8044SWilliam.Kucharski@Sun.COM       /* Is the command line passed? */
1353*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 2))
1354*8044SWilliam.Kucharski@Sun.COM         printf ("cmdline = %s\n", (char *) mbi->cmdline);
1355*8044SWilliam.Kucharski@Sun.COM
1356*8044SWilliam.Kucharski@Sun.COM       /* Are mods_* valid? */
1357*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 3))
1358*8044SWilliam.Kucharski@Sun.COM         {
1359*8044SWilliam.Kucharski@Sun.COM           module_t *mod;
1360*8044SWilliam.Kucharski@Sun.COM           int i;
1361*8044SWilliam.Kucharski@Sun.COM
1362*8044SWilliam.Kucharski@Sun.COM           printf ("mods_count = %d, mods_addr = 0x%x\n",
1363*8044SWilliam.Kucharski@Sun.COM                   (int) mbi->mods_count, (int) mbi->mods_addr);
1364*8044SWilliam.Kucharski@Sun.COM           for (i = 0, mod = (module_t *) mbi->mods_addr;
1365*8044SWilliam.Kucharski@Sun.COM                i < mbi->mods_count;
1366*8044SWilliam.Kucharski@Sun.COM                i++, mod++)
1367*8044SWilliam.Kucharski@Sun.COM             printf (" mod_start = 0x%x, mod_end = 0x%x, string = %s\n",
1368*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mod->mod_start,
1369*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mod->mod_end,
1370*8044SWilliam.Kucharski@Sun.COM                     (char *) mod->string);
1371*8044SWilliam.Kucharski@Sun.COM         }
1372*8044SWilliam.Kucharski@Sun.COM
1373*8044SWilliam.Kucharski@Sun.COM       /* Bits 4 and 5 are mutually exclusive! */
1374*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 4) && CHECK_FLAG (mbi->flags, 5))
1375*8044SWilliam.Kucharski@Sun.COM         {
1376*8044SWilliam.Kucharski@Sun.COM           printf ("Both bits 4 and 5 are set.\n");
1377*8044SWilliam.Kucharski@Sun.COM           return;
1378*8044SWilliam.Kucharski@Sun.COM         }
1379*8044SWilliam.Kucharski@Sun.COM
1380*8044SWilliam.Kucharski@Sun.COM       /* Is the symbol table of a.out valid? */
1381*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 4))
1382*8044SWilliam.Kucharski@Sun.COM         {
1383*8044SWilliam.Kucharski@Sun.COM           aout_symbol_table_t *aout_sym = &(mbi->u.aout_sym);
1384*8044SWilliam.Kucharski@Sun.COM
1385*8044SWilliam.Kucharski@Sun.COM           printf ("aout_symbol_table: tabsize = 0x%0x, "
1386*8044SWilliam.Kucharski@Sun.COM                   "strsize = 0x%x, addr = 0x%x\n",
1387*8044SWilliam.Kucharski@Sun.COM                   (unsigned) aout_sym->tabsize,
1388*8044SWilliam.Kucharski@Sun.COM                   (unsigned) aout_sym->strsize,
1389*8044SWilliam.Kucharski@Sun.COM                   (unsigned) aout_sym->addr);
1390*8044SWilliam.Kucharski@Sun.COM         }
1391*8044SWilliam.Kucharski@Sun.COM
1392*8044SWilliam.Kucharski@Sun.COM       /* Is the section header table of ELF valid? */
1393*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 5))
1394*8044SWilliam.Kucharski@Sun.COM         {
1395*8044SWilliam.Kucharski@Sun.COM           elf_section_header_table_t *elf_sec = &(mbi->u.elf_sec);
1396*8044SWilliam.Kucharski@Sun.COM
1397*8044SWilliam.Kucharski@Sun.COM           printf ("elf_sec: num = %u, size = 0x%x,"
1398*8044SWilliam.Kucharski@Sun.COM                   " addr = 0x%x, shndx = 0x%x\n",
1399*8044SWilliam.Kucharski@Sun.COM                   (unsigned) elf_sec->num, (unsigned) elf_sec->size,
1400*8044SWilliam.Kucharski@Sun.COM                   (unsigned) elf_sec->addr, (unsigned) elf_sec->shndx);
1401*8044SWilliam.Kucharski@Sun.COM         }
1402*8044SWilliam.Kucharski@Sun.COM
1403*8044SWilliam.Kucharski@Sun.COM       /* Are mmap_* valid? */
1404*8044SWilliam.Kucharski@Sun.COM       if (CHECK_FLAG (mbi->flags, 6))
1405*8044SWilliam.Kucharski@Sun.COM         {
1406*8044SWilliam.Kucharski@Sun.COM           memory_map_t *mmap;
1407*8044SWilliam.Kucharski@Sun.COM
1408*8044SWilliam.Kucharski@Sun.COM           printf ("mmap_addr = 0x%x, mmap_length = 0x%x\n",
1409*8044SWilliam.Kucharski@Sun.COM                   (unsigned) mbi->mmap_addr, (unsigned) mbi->mmap_length);
1410*8044SWilliam.Kucharski@Sun.COM           for (mmap = (memory_map_t *) mbi->mmap_addr;
1411*8044SWilliam.Kucharski@Sun.COM                (unsigned long) mmap < mbi->mmap_addr + mbi->mmap_length;
1412*8044SWilliam.Kucharski@Sun.COM                mmap = (memory_map_t *) ((unsigned long) mmap
1413*8044SWilliam.Kucharski@Sun.COM                                         + mmap->size + sizeof (mmap->size)))
1414*8044SWilliam.Kucharski@Sun.COM             printf (" size = 0x%x, base_addr = 0x%x%x,"
1415*8044SWilliam.Kucharski@Sun.COM                     " length = 0x%x%x, type = 0x%x\n",
1416*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mmap->size,
1417*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mmap->base_addr_high,
1418*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mmap->base_addr_low,
1419*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mmap->length_high,
1420*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mmap->length_low,
1421*8044SWilliam.Kucharski@Sun.COM                     (unsigned) mmap->type);
1422*8044SWilliam.Kucharski@Sun.COM         }
1423*8044SWilliam.Kucharski@Sun.COM     }
1424*8044SWilliam.Kucharski@Sun.COM
1425*8044SWilliam.Kucharski@Sun.COM     /* Clear the screen and initialize VIDEO, XPOS and YPOS. */
1426*8044SWilliam.Kucharski@Sun.COM     static void
1427*8044SWilliam.Kucharski@Sun.COM     cls (void)
1428*8044SWilliam.Kucharski@Sun.COM     {
1429*8044SWilliam.Kucharski@Sun.COM       int i;
1430*8044SWilliam.Kucharski@Sun.COM
1431*8044SWilliam.Kucharski@Sun.COM       video = (unsigned char *) VIDEO;
1432*8044SWilliam.Kucharski@Sun.COM
1433*8044SWilliam.Kucharski@Sun.COM       for (i = 0; i < COLUMNS * LINES * 2; i++)
1434*8044SWilliam.Kucharski@Sun.COM         *(video + i) = 0;
1435*8044SWilliam.Kucharski@Sun.COM
1436*8044SWilliam.Kucharski@Sun.COM       xpos = 0;
1437*8044SWilliam.Kucharski@Sun.COM       ypos = 0;
1438*8044SWilliam.Kucharski@Sun.COM     }
1439*8044SWilliam.Kucharski@Sun.COM
1440*8044SWilliam.Kucharski@Sun.COM     /* Convert the integer D to a string and save the string in BUF. If
1441*8044SWilliam.Kucharski@Sun.COM        BASE is equal to 'd', interpret that D is decimal, and if BASE is
1442*8044SWilliam.Kucharski@Sun.COM        equal to 'x', interpret that D is hexadecimal. */
1443*8044SWilliam.Kucharski@Sun.COM     static void
1444*8044SWilliam.Kucharski@Sun.COM     itoa (char *buf, int base, int d)
1445*8044SWilliam.Kucharski@Sun.COM     {
1446*8044SWilliam.Kucharski@Sun.COM       char *p = buf;
1447*8044SWilliam.Kucharski@Sun.COM       char *p1, *p2;
1448*8044SWilliam.Kucharski@Sun.COM       unsigned long ud = d;
1449*8044SWilliam.Kucharski@Sun.COM       int divisor = 10;
1450*8044SWilliam.Kucharski@Sun.COM
1451*8044SWilliam.Kucharski@Sun.COM       /* If %d is specified and D is minus, put `-' in the head. */
1452*8044SWilliam.Kucharski@Sun.COM       if (base == 'd' && d < 0)
1453*8044SWilliam.Kucharski@Sun.COM         {
1454*8044SWilliam.Kucharski@Sun.COM           *p++ = '-';
1455*8044SWilliam.Kucharski@Sun.COM           buf++;
1456*8044SWilliam.Kucharski@Sun.COM           ud = -d;
1457*8044SWilliam.Kucharski@Sun.COM         }
1458*8044SWilliam.Kucharski@Sun.COM       else if (base == 'x')
1459*8044SWilliam.Kucharski@Sun.COM         divisor = 16;
1460*8044SWilliam.Kucharski@Sun.COM
1461*8044SWilliam.Kucharski@Sun.COM       /* Divide UD by DIVISOR until UD == 0. */
1462*8044SWilliam.Kucharski@Sun.COM       do
1463*8044SWilliam.Kucharski@Sun.COM         {
1464*8044SWilliam.Kucharski@Sun.COM           int remainder = ud % divisor;
1465*8044SWilliam.Kucharski@Sun.COM
1466*8044SWilliam.Kucharski@Sun.COM           *p++ = (remainder < 10) ? remainder + '0' : remainder + 'a' - 10;
1467*8044SWilliam.Kucharski@Sun.COM         }
1468*8044SWilliam.Kucharski@Sun.COM       while (ud /= divisor);
1469*8044SWilliam.Kucharski@Sun.COM
1470*8044SWilliam.Kucharski@Sun.COM       /* Terminate BUF. */
1471*8044SWilliam.Kucharski@Sun.COM       *p = 0;
1472*8044SWilliam.Kucharski@Sun.COM
1473*8044SWilliam.Kucharski@Sun.COM       /* Reverse BUF. */
1474*8044SWilliam.Kucharski@Sun.COM       p1 = buf;
1475*8044SWilliam.Kucharski@Sun.COM       p2 = p - 1;
1476*8044SWilliam.Kucharski@Sun.COM       while (p1 < p2)
1477*8044SWilliam.Kucharski@Sun.COM         {
1478*8044SWilliam.Kucharski@Sun.COM           char tmp = *p1;
1479*8044SWilliam.Kucharski@Sun.COM           *p1 = *p2;
1480*8044SWilliam.Kucharski@Sun.COM           *p2 = tmp;
1481*8044SWilliam.Kucharski@Sun.COM           p1++;
1482*8044SWilliam.Kucharski@Sun.COM           p2--;
1483*8044SWilliam.Kucharski@Sun.COM         }
1484*8044SWilliam.Kucharski@Sun.COM     }
1485*8044SWilliam.Kucharski@Sun.COM
1486*8044SWilliam.Kucharski@Sun.COM     /* Put the character C on the screen. */
1487*8044SWilliam.Kucharski@Sun.COM     static void
1488*8044SWilliam.Kucharski@Sun.COM     putchar (int c)
1489*8044SWilliam.Kucharski@Sun.COM     {
1490*8044SWilliam.Kucharski@Sun.COM       if (c == '\n' || c == '\r')
1491*8044SWilliam.Kucharski@Sun.COM         {
1492*8044SWilliam.Kucharski@Sun.COM         newline:
1493*8044SWilliam.Kucharski@Sun.COM           xpos = 0;
1494*8044SWilliam.Kucharski@Sun.COM           ypos++;
1495*8044SWilliam.Kucharski@Sun.COM           if (ypos >= LINES)
1496*8044SWilliam.Kucharski@Sun.COM             ypos = 0;
1497*8044SWilliam.Kucharski@Sun.COM           return;
1498*8044SWilliam.Kucharski@Sun.COM         }
1499*8044SWilliam.Kucharski@Sun.COM
1500*8044SWilliam.Kucharski@Sun.COM       *(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF;
1501*8044SWilliam.Kucharski@Sun.COM       *(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE;
1502*8044SWilliam.Kucharski@Sun.COM
1503*8044SWilliam.Kucharski@Sun.COM       xpos++;
1504*8044SWilliam.Kucharski@Sun.COM       if (xpos >= COLUMNS)
1505*8044SWilliam.Kucharski@Sun.COM         goto newline;
1506*8044SWilliam.Kucharski@Sun.COM     }
1507*8044SWilliam.Kucharski@Sun.COM
1508*8044SWilliam.Kucharski@Sun.COM     /* Format a string and print it on the screen, just like the libc
1509*8044SWilliam.Kucharski@Sun.COM        function printf. */
1510*8044SWilliam.Kucharski@Sun.COM     void
1511*8044SWilliam.Kucharski@Sun.COM     printf (const char *format, ...)
1512*8044SWilliam.Kucharski@Sun.COM     {
1513*8044SWilliam.Kucharski@Sun.COM       char **arg = (char **) &format;
1514*8044SWilliam.Kucharski@Sun.COM       int c;
1515*8044SWilliam.Kucharski@Sun.COM       char buf[20];
1516*8044SWilliam.Kucharski@Sun.COM
1517*8044SWilliam.Kucharski@Sun.COM       arg++;
1518*8044SWilliam.Kucharski@Sun.COM
1519*8044SWilliam.Kucharski@Sun.COM       while ((c = *format++) != 0)
1520*8044SWilliam.Kucharski@Sun.COM         {
1521*8044SWilliam.Kucharski@Sun.COM           if (c != '%')
1522*8044SWilliam.Kucharski@Sun.COM             putchar (c);
1523*8044SWilliam.Kucharski@Sun.COM           else
1524*8044SWilliam.Kucharski@Sun.COM             {
1525*8044SWilliam.Kucharski@Sun.COM               char *p;
1526*8044SWilliam.Kucharski@Sun.COM
1527*8044SWilliam.Kucharski@Sun.COM               c = *format++;
1528*8044SWilliam.Kucharski@Sun.COM               switch (c)
1529*8044SWilliam.Kucharski@Sun.COM                 {
1530*8044SWilliam.Kucharski@Sun.COM                 case 'd':
1531*8044SWilliam.Kucharski@Sun.COM                 case 'u':
1532*8044SWilliam.Kucharski@Sun.COM                 case 'x':
1533*8044SWilliam.Kucharski@Sun.COM                   itoa (buf, c, *((int *) arg++));
1534*8044SWilliam.Kucharski@Sun.COM                   p = buf;
1535*8044SWilliam.Kucharski@Sun.COM                   goto string;
1536*8044SWilliam.Kucharski@Sun.COM                   break;
1537*8044SWilliam.Kucharski@Sun.COM
1538*8044SWilliam.Kucharski@Sun.COM                 case 's':
1539*8044SWilliam.Kucharski@Sun.COM                   p = *arg++;
1540*8044SWilliam.Kucharski@Sun.COM                   if (! p)
1541*8044SWilliam.Kucharski@Sun.COM                     p = "(null)";
1542*8044SWilliam.Kucharski@Sun.COM
1543*8044SWilliam.Kucharski@Sun.COM                 string:
1544*8044SWilliam.Kucharski@Sun.COM                   while (*p)
1545*8044SWilliam.Kucharski@Sun.COM                     putchar (*p++);
1546*8044SWilliam.Kucharski@Sun.COM                   break;
1547*8044SWilliam.Kucharski@Sun.COM
1548*8044SWilliam.Kucharski@Sun.COM                 default:
1549*8044SWilliam.Kucharski@Sun.COM                   putchar (*((int *) arg++));
1550*8044SWilliam.Kucharski@Sun.COM                   break;
1551*8044SWilliam.Kucharski@Sun.COM                 }
1552*8044SWilliam.Kucharski@Sun.COM             }
1553*8044SWilliam.Kucharski@Sun.COM         }
1554*8044SWilliam.Kucharski@Sun.COM     }
1555*8044SWilliam.Kucharski@Sun.COM
1556*8044SWilliam.Kucharski@Sun.COM
1557*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Other Multiboot kernels,  Prev: kernel.c,  Up: Example OS code
1558*8044SWilliam.Kucharski@Sun.COM
1559*8044SWilliam.Kucharski@Sun.COM4.3.4 Other Multiboot kernels
1560*8044SWilliam.Kucharski@Sun.COM-----------------------------
1561*8044SWilliam.Kucharski@Sun.COM
1562*8044SWilliam.Kucharski@Sun.COMOther useful information should be available in Multiboot kernels, such
1563*8044SWilliam.Kucharski@Sun.COMas GNU Mach and Fiasco `http://os.inf.tu-dresden.de/fiasco/'. And, it
1564*8044SWilliam.Kucharski@Sun.COMis worth mentioning the OSKit
1565*8044SWilliam.Kucharski@Sun.COM`http://www.cs.utah.edu/projects/flux/oskit/', which provides a library
1566*8044SWilliam.Kucharski@Sun.COMsupporting the specification.
1567*8044SWilliam.Kucharski@Sun.COM
1568*8044SWilliam.Kucharski@Sun.COM
1569*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Example boot loader code,  Prev: Example OS code,  Up: Examples
1570*8044SWilliam.Kucharski@Sun.COM
1571*8044SWilliam.Kucharski@Sun.COM4.4 Example boot loader code
1572*8044SWilliam.Kucharski@Sun.COM============================
1573*8044SWilliam.Kucharski@Sun.COM
1574*8044SWilliam.Kucharski@Sun.COMThe GNU GRUB (*note GRUB: (grub.info)Top.) project is a full
1575*8044SWilliam.Kucharski@Sun.COMMultiboot-compliant boot loader, supporting all required and optional
1576*8044SWilliam.Kucharski@Sun.COMfeatures present in this specification. A public release has not been
1577*8044SWilliam.Kucharski@Sun.COMmade, but the test release is available from:
1578*8044SWilliam.Kucharski@Sun.COM
1579*8044SWilliam.Kucharski@Sun.COM   `ftp://alpha.gnu.org/gnu/grub'
1580*8044SWilliam.Kucharski@Sun.COM
1581*8044SWilliam.Kucharski@Sun.COM   See the webpage `http://www.gnu.org/software/grub/grub.html', for
1582*8044SWilliam.Kucharski@Sun.COMmore information.
1583*8044SWilliam.Kucharski@Sun.COM
1584*8044SWilliam.Kucharski@Sun.COM
1585*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: History,  Next: Index,  Prev: Examples,  Up: Top
1586*8044SWilliam.Kucharski@Sun.COM
1587*8044SWilliam.Kucharski@Sun.COM5 The change log of this specification
1588*8044SWilliam.Kucharski@Sun.COM**************************************
1589*8044SWilliam.Kucharski@Sun.COM
1590*8044SWilliam.Kucharski@Sun.COM0.7
1591*8044SWilliam.Kucharski@Sun.COM        * "Multiboot Standard" is renamed to "Multiboot Specification".
1592*8044SWilliam.Kucharski@Sun.COM
1593*8044SWilliam.Kucharski@Sun.COM        * Graphics fields are added to Multiboot header.
1594*8044SWilliam.Kucharski@Sun.COM
1595*8044SWilliam.Kucharski@Sun.COM        * BIOS drive information, BIOS configuration table, the name of
1596*8044SWilliam.Kucharski@Sun.COM          a boot loader, APM information, and graphics information are
1597*8044SWilliam.Kucharski@Sun.COM          added to Multiboot information.
1598*8044SWilliam.Kucharski@Sun.COM
1599*8044SWilliam.Kucharski@Sun.COM        * Rewritten in Texinfo format.
1600*8044SWilliam.Kucharski@Sun.COM
1601*8044SWilliam.Kucharski@Sun.COM        * Rewritten, using more strict words.
1602*8044SWilliam.Kucharski@Sun.COM
1603*8044SWilliam.Kucharski@Sun.COM        * The maintainer changes to the GNU GRUB maintainer team
1604*8044SWilliam.Kucharski@Sun.COM          <bug-grub@gnu.org>, from Bryan Ford and Erich Stefan Boleyn.
1605*8044SWilliam.Kucharski@Sun.COM
1606*8044SWilliam.Kucharski@Sun.COM0.6
1607*8044SWilliam.Kucharski@Sun.COM        * A few wording changes.
1608*8044SWilliam.Kucharski@Sun.COM
1609*8044SWilliam.Kucharski@Sun.COM        * Header checksum.
1610*8044SWilliam.Kucharski@Sun.COM
1611*8044SWilliam.Kucharski@Sun.COM        * Clasification of machine state passed to an operating system.
1612*8044SWilliam.Kucharski@Sun.COM
1613*8044SWilliam.Kucharski@Sun.COM0.5
1614*8044SWilliam.Kucharski@Sun.COM        * Name change.
1615*8044SWilliam.Kucharski@Sun.COM
1616*8044SWilliam.Kucharski@Sun.COM0.4
1617*8044SWilliam.Kucharski@Sun.COM        * Major changes plus HTMLification.
1618*8044SWilliam.Kucharski@Sun.COM
1619*8044SWilliam.Kucharski@Sun.COM
1620*8044SWilliam.Kucharski@Sun.COMFile: multiboot.info,  Node: Index,  Prev: History,  Up: Top
1621*8044SWilliam.Kucharski@Sun.COM
1622*8044SWilliam.Kucharski@Sun.COMIndex
1623*8044SWilliam.Kucharski@Sun.COM*****
1624*8044SWilliam.Kucharski@Sun.COM
1625*8044SWilliam.Kucharski@Sun.COM[Index]
1626*8044SWilliam.Kucharski@Sun.COM* Menu:
1627*8044SWilliam.Kucharski@Sun.COM
1628*8044SWilliam.Kucharski@Sun.COM
1629*8044SWilliam.Kucharski@Sun.COMTag Table:
1630*8044SWilliam.Kucharski@Sun.COMNode: Top990
1631*8044SWilliam.Kucharski@Sun.COMNode: Overview1326
1632*8044SWilliam.Kucharski@Sun.COMNode: Motivation1794
1633*8044SWilliam.Kucharski@Sun.COMNode: Architecture3191
1634*8044SWilliam.Kucharski@Sun.COMNode: Operating systems3724
1635*8044SWilliam.Kucharski@Sun.COMNode: Boot sources4518
1636*8044SWilliam.Kucharski@Sun.COMNode: Boot-time configuration5488
1637*8044SWilliam.Kucharski@Sun.COMNode: Convenience to operating systems6096
1638*8044SWilliam.Kucharski@Sun.COMNode: Boot modules8327
1639*8044SWilliam.Kucharski@Sun.COMNode: Terminology9476
1640*8044SWilliam.Kucharski@Sun.COMNode: Specification11855
1641*8044SWilliam.Kucharski@Sun.COMNode: OS image format12418
1642*8044SWilliam.Kucharski@Sun.COMNode: Header layout13476
1643*8044SWilliam.Kucharski@Sun.COMNode: Header magic fields14644
1644*8044SWilliam.Kucharski@Sun.COMNode: Header address fields17505
1645*8044SWilliam.Kucharski@Sun.COMNode: Header graphics fields19351
1646*8044SWilliam.Kucharski@Sun.COMNode: Machine state20737
1647*8044SWilliam.Kucharski@Sun.COMNode: Boot information format22997
1648*8044SWilliam.Kucharski@Sun.COMNode: Examples38368
1649*8044SWilliam.Kucharski@Sun.COMNode: Notes on PC38741
1650*8044SWilliam.Kucharski@Sun.COMNode: BIOS device mapping techniques40307
1651*8044SWilliam.Kucharski@Sun.COMNode: Data comparison technique41217
1652*8044SWilliam.Kucharski@Sun.COMNode: I/O restriction technique42079
1653*8044SWilliam.Kucharski@Sun.COMNode: Example OS code43296
1654*8044SWilliam.Kucharski@Sun.COMNode: multiboot.h44838
1655*8044SWilliam.Kucharski@Sun.COMNode: boot.S48662
1656*8044SWilliam.Kucharski@Sun.COMNode: kernel.c51286
1657*8044SWilliam.Kucharski@Sun.COMNode: Other Multiboot kernels60013
1658*8044SWilliam.Kucharski@Sun.COMNode: Example boot loader code60444
1659*8044SWilliam.Kucharski@Sun.COMNode: History60970
1660*8044SWilliam.Kucharski@Sun.COMNode: Index61891
1661*8044SWilliam.Kucharski@Sun.COM
1662*8044SWilliam.Kucharski@Sun.COMEnd Tag Table
1663