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