Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Further update of the i386 boot documentation

A number of items in the i386 boot documentation have been either
vague, outdated or hard to read. This text revision adds several more
examples, including a memory map for a modern kernel load. It also
adds a field-by-field detailed description of the setup header, and a
bootloader ID for Qemu.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

H. Peter Anvin and committed by
Linus Torvalds
dec04cff 66123549

+291 -70
+291 -70
Documentation/i386/boot.txt
··· 2 2 ---------------------------- 3 3 4 4 H. Peter Anvin <hpa@zytor.com> 5 - Last update 2007-05-07 5 + Last update 2007-05-16 6 6 7 7 On the i386 platform, the Linux kernel uses a rather complicated boot 8 8 convention. This has evolved partially due to historical aspects, as ··· 52 52 0A0000 +------------------------+ 53 53 | Reserved for BIOS | Do not use. Reserved for BIOS EBDA. 54 54 09A000 +------------------------+ 55 - | Stack/heap/cmdline | For use by the kernel real-mode code. 55 + | Command line | 56 + | Stack/heap | For use by the kernel real-mode code. 56 57 098000 +------------------------+ 57 58 | Kernel setup | The kernel real-mode code. 58 59 090200 +------------------------+ ··· 74 73 When using bzImage, the protected-mode kernel was relocated to 75 74 0x100000 ("high memory"), and the kernel real-mode block (boot sector, 76 75 setup, and stack/heap) was made relocatable to any address between 77 - 0x10000 and end of low memory. Unfortunately, in protocols 2.00 and 78 - 2.01 the command line is still required to live in the 0x9XXXX memory 79 - range, and that memory range is still overwritten by the early kernel. 80 - The 2.02 protocol resolves that problem. 76 + 0x10000 and end of low memory. Unfortunately, in protocols 2.00 and 77 + 2.01 the 0x90000+ memory range is still used internally by the kernel; 78 + the 2.02 protocol resolves that problem. 81 79 82 80 It is desirable to keep the "memory ceiling" -- the highest point in 83 81 low memory touched by the boot loader -- as low as possible, since ··· 92 92 zImage or old bzImage kernels, which need data written into the 93 93 0x90000 segment, the boot loader should make sure not to use memory 94 94 above the 0x9A000 point; too many BIOSes will break above that point. 95 + 96 + For a modern bzImage kernel with boot protocol version >= 2.02, a 97 + memory layout like the following is suggested: 98 + 99 + ~ ~ 100 + | Protected-mode kernel | 101 + 100000 +------------------------+ 102 + | I/O memory hole | 103 + 0A0000 +------------------------+ 104 + | Reserved for BIOS | Leave as much as possible unused 105 + ~ ~ 106 + | Command line | (Can also be below the X+10000 mark) 107 + X+10000 +------------------------+ 108 + | Stack/heap | For use by the kernel real-mode code. 109 + X+08000 +------------------------+ 110 + | Kernel setup | The kernel real-mode code. 111 + | Kernel boot sector | The kernel legacy boot sector. 112 + X +------------------------+ 113 + | Boot loader | <- Boot sector entry point 0000:7C00 114 + 001000 +------------------------+ 115 + | Reserved for MBR/BIOS | 116 + 000800 +------------------------+ 117 + | Typically used by MBR | 118 + 000600 +------------------------+ 119 + | BIOS use only | 120 + 000000 +------------------------+ 121 + 122 + ... where the address X is as low as the design of the boot loader 123 + permits. 95 124 96 125 97 126 **** THE REAL-MODE KERNEL HEADER ··· 189 160 setting fields in the header, you must make sure only to set fields 190 161 supported by the protocol version in use. 191 162 192 - The "kernel_version" field, if set to a nonzero value, contains a 193 - pointer to a null-terminated human-readable kernel version number 194 - string, less 0x200. This can be used to display the kernel version to 195 - the user. This value should be less than (0x200*setup_sects). For 196 - example, if this value is set to 0x1c00, the kernel version number 197 - string can be found at offset 0x1e00 in the kernel file. This is a 198 - valid value if and only if the "setup_sects" field contains the value 199 - 14 or higher. 200 163 201 - Most boot loaders will simply load the kernel at its target address 202 - directly. Such boot loaders do not need to worry about filling in 203 - most of the fields in the header. The following fields should be 204 - filled out, however: 164 + **** DETAILS OF HEADER FIELDS 205 165 206 - vid_mode: 207 - Please see the section on SPECIAL COMMAND LINE OPTIONS. 166 + For each field, some are information from the kernel to the bootloader 167 + ("read"), some are expected to be filled out by the bootloader 168 + ("write"), and some are expected to be read and modified by the 169 + bootloader ("modify"). 208 170 209 - type_of_loader: 210 - If your boot loader has an assigned id (see table below), enter 211 - 0xTV here, where T is an identifier for the boot loader and V is 212 - a version number. Otherwise, enter 0xFF here. 171 + All general purpose boot loaders should write the fields marked 172 + (obligatory). Boot loaders who want to load the kernel at a 173 + nonstandard address should fill in the fields marked (reloc); other 174 + boot loaders can ignore those fields. 213 175 214 - Assigned boot loader ids: 176 + Field name: setup_secs 177 + Type: read 178 + Offset/size: 0x1f1/1 179 + Protocol: ALL 180 + 181 + The size of the setup code in 512-byte sectors. If this field is 182 + 0, the real value is 4. The real-mode code consists of the boot 183 + sector (always one 512-byte sector) plus the setup code. 184 + 185 + Field name: root_flags 186 + Type: modify (optional) 187 + Offset/size: 0x1f2/2 188 + Protocol: ALL 189 + 190 + If this field is nonzero, the root defaults to readonly. The use of 191 + this field is deprecated; use the "ro" or "rw" options on the 192 + command line instead. 193 + 194 + Field name: syssize 195 + Type: read 196 + Offset/size: 0x1f4/4 (protocol 2.04+) 0x1f4/2 (protocol ALL) 197 + Protocol: 2.04+ 198 + 199 + The size of the protected-mode code in units of 16-byte paragraphs. 200 + For protocol versions older than 2.04 this field is only two bytes 201 + wide, and therefore cannot be trusted for the size of a kernel if 202 + the LOAD_HIGH flag is set. 203 + 204 + Field name: ram_size 205 + Type: kernel internal 206 + Offset/size: 0x1f8/2 207 + Protocol: ALL 208 + 209 + This field is obsolete. 210 + 211 + Field name: vid_mode 212 + Type: modify (obligatory) 213 + Offset/size: 0x1fa/2 214 + 215 + Please see the section on SPECIAL COMMAND LINE OPTIONS. 216 + 217 + Field name: root_dev 218 + Type: modify (optional) 219 + Offset/size: 0x1fc/2 220 + Protocol: ALL 221 + 222 + The default root device device number. The use of this field is 223 + deprecated, use the "root=" option on the command line instead. 224 + 225 + Field name: boot_flag 226 + Type: read 227 + Offset/size: 0x1fe/2 228 + Protocol: ALL 229 + 230 + Contains 0xAA55. This is the closest thing old Linux kernels have 231 + to a magic number. 232 + 233 + Field name: jump 234 + Type: read 235 + Offset/size: 0x200/2 236 + Protocol: 2.00+ 237 + 238 + Contains an x86 jump instruction, 0xEB followed by a signed offset 239 + relative to byte 0x202. This can be used to determine the size of 240 + the header. 241 + 242 + Field name: header 243 + Type: read 244 + Offset/size: 0x202/4 245 + Protocol: 2.00+ 246 + 247 + Contains the magic number "HdrS" (0x53726448). 248 + 249 + Field name: version 250 + Type: read 251 + Offset/size: 0x206/2 252 + Protocol: 2.00+ 253 + 254 + Contains the boot protocol version, e.g. 0x0204 for version 2.04. 255 + 256 + Field name: readmode_swtch 257 + Type: modify (optional) 258 + Offset/size: 0x208/4 259 + Protocol: 2.00+ 260 + 261 + Boot loader hook (see separate chapter.) 262 + 263 + Field name: start_sys 264 + Type: read 265 + Offset/size: 0x20c/4 266 + Protocol: 2.00+ 267 + 268 + The load low segment (0x1000). Obsolete. 269 + 270 + Field name: kernel_version 271 + Type: read 272 + Offset/size: 0x20e/2 273 + Protocol: 2.00+ 274 + 275 + If set to a nonzero value, contains a pointer to a NUL-terminated 276 + human-readable kernel version number string, less 0x200. This can 277 + be used to display the kernel version to the user. This value 278 + should be less than (0x200*setup_sects). For example, if this value 279 + is set to 0x1c00, the kernel version number string can be found at 280 + offset 0x1e00 in the kernel file. This is a valid value if and only 281 + if the "setup_sects" field contains the value 14 or higher. 282 + 283 + Field name: type_of_loader 284 + Type: write (obligatory) 285 + Offset/size: 0x210/1 286 + Protocol: 2.00+ 287 + 288 + If your boot loader has an assigned id (see table below), enter 289 + 0xTV here, where T is an identifier for the boot loader and V is 290 + a version number. Otherwise, enter 0xFF here. 291 + 292 + Assigned boot loader ids: 215 293 0 LILO (0x00 reserved for pre-2.00 bootloader) 216 294 1 Loadlin 217 295 2 bootsect-loader (0x20, all other values reserved) ··· 329 193 8 U-BOOT 330 194 9 Xen 331 195 A Gujin 196 + B Qemu 332 197 333 - Please contact <hpa@zytor.com> if you need a bootloader ID 334 - value assigned. 198 + Please contact <hpa@zytor.com> if you need a bootloader ID 199 + value assigned. 335 200 336 - loadflags, heap_end_ptr: 337 - If the protocol version is 2.01 or higher, enter the 338 - offset limit of the setup heap into heap_end_ptr and set the 339 - 0x80 bit (CAN_USE_HEAP) of loadflags. heap_end_ptr appears to 340 - be relative to the start of setup (offset 0x0200). 201 + Field name: loadflags 202 + Type: modify (obligatory) 203 + Offset/size: 0x211/1 204 + Protocol: 2.00+ 341 205 342 - setup_move_size: 343 - When using protocol 2.00 or 2.01, if the real mode 344 - kernel is not loaded at 0x90000, it gets moved there later in 345 - the loading sequence. Fill in this field if you want 346 - additional data (such as the kernel command line) moved in 347 - addition to the real-mode kernel itself. 206 + This field is a bitmask. 348 207 349 - The unit is bytes starting with the beginning of the boot 350 - sector. 208 + Bit 0 (read): LOADED_HIGH 209 + - If 0, the protected-mode code is loaded at 0x10000. 210 + - If 1, the protected-mode code is loaded at 0x100000. 351 211 352 - ramdisk_image, ramdisk_size: 353 - If your boot loader has loaded an initial ramdisk (initrd), 354 - set ramdisk_image to the 32-bit pointer to the ramdisk data 355 - and the ramdisk_size to the size of the ramdisk data. 212 + Bit 7 (write): CAN_USE_HEAP 213 + Set this bit to 1 to indicate that the value entered in the 214 + heap_end_ptr is valid. If this field is clear, some setup code 215 + functionality will be disabled. 356 216 357 - The initrd should typically be located as high in memory as 358 - possible, as it may otherwise get overwritten by the early 359 - kernel initialization sequence. However, it must never be 360 - located above the address specified in the initrd_addr_max 361 - field. The initrd should be at least 4K page aligned. 217 + Field name: setup_move_size 218 + Type: modify (obligatory) 219 + Offset/size: 0x212/2 220 + Protocol: 2.00-2.01 362 221 363 - cmd_line_ptr: 364 - If the protocol version is 2.02 or higher, this is a 32-bit 365 - pointer to the kernel command line. The kernel command line 366 - can be located anywhere between the end of setup and 0xA0000. 367 - Fill in this field even if your boot loader does not support a 368 - command line, in which case you can point this to an empty 369 - string (or better yet, to the string "auto".) If this field 370 - is left at zero, the kernel will assume that your boot loader 371 - does not support the 2.02+ protocol. 222 + When using protocol 2.00 or 2.01, if the real mode kernel is not 223 + loaded at 0x90000, it gets moved there later in the loading 224 + sequence. Fill in this field if you want additional data (such as 225 + the kernel command line) moved in addition to the real-mode kernel 226 + itself. 372 227 373 - ramdisk_max: 374 - The maximum address that may be occupied by the initrd 375 - contents. For boot protocols 2.02 or earlier, this field is 376 - not present, and the maximum address is 0x37FFFFFF. (This 377 - address is defined as the address of the highest safe byte, so 378 - if your ramdisk is exactly 131072 bytes long and this field is 379 - 0x37FFFFFF, you can start your ramdisk at 0x37FE0000.) 228 + The unit is bytes starting with the beginning of the boot sector. 229 + 230 + This field is can be ignored when the protocol is 2.02 or higher, or 231 + if the real-mode code is loaded at 0x90000. 380 232 381 - cmdline_size: 382 - The maximum size of the command line without the terminating 383 - zero. This means that the command line can contain at most 384 - cmdline_size characters. With protocol version 2.05 and 385 - earlier, the maximum size was 255. 233 + Field name: code32_start 234 + Type: modify (optional, reloc) 235 + Offset/size: 0x214/4 236 + Protocol: 2.00+ 237 + 238 + The address to jump to in protected mode. This defaults to the load 239 + address of the kernel, and can be used by the boot loader to 240 + determine the proper load address. 241 + 242 + This field can be modified for two purposes: 243 + 244 + 1. as a boot loader hook (see separate chapter.) 245 + 246 + 2. if a bootloader which does not install a hook loads a 247 + relocatable kernel at a nonstandard address it will have to modify 248 + this field to point to the load address. 249 + 250 + Field name: ramdisk_image 251 + Type: write (obligatory) 252 + Offset/size: 0x218/4 253 + Protocol: 2.00+ 254 + 255 + The 32-bit linear address of the initial ramdisk or ramfs. Leave at 256 + zero if there is no initial ramdisk/ramfs. 257 + 258 + Field name: ramdisk_size 259 + Type: write (obligatory) 260 + Offset/size: 0x21c/4 261 + Protocol: 2.00+ 262 + 263 + Size of the initial ramdisk or ramfs. Leave at zero if there is no 264 + initial ramdisk/ramfs. 265 + 266 + Field name: bootsect_kludge 267 + Type: kernel internal 268 + Offset/size: 0x220/4 269 + Protocol: 2.00+ 270 + 271 + This field is obsolete. 272 + 273 + Field name: heap_end_ptr 274 + Type: write (obligatory) 275 + Offset/size: 0x224/2 276 + Protocol: 2.01+ 277 + 278 + Set this field to the offset (from the beginning of the real-mode 279 + code) of the end of the setup stack/heap, minus 0x0200. 280 + 281 + Field name: cmd_line_ptr 282 + Type: write (obligatory) 283 + Offset/size: 0x228/4 284 + Protocol: 2.02+ 285 + 286 + Set this field to the linear address of the kernel command line. 287 + The kernel command line can be located anywhere between the end of 288 + the setup heap and 0xA0000; it does not have to be located in the 289 + same 64K segment as the real-mode code itself. 290 + 291 + Fill in this field even if your boot loader does not support a 292 + command line, in which case you can point this to an empty string 293 + (or better yet, to the string "auto".) If this field is left at 294 + zero, the kernel will assume that your boot loader does not support 295 + the 2.02+ protocol. 296 + 297 + Field name: initrd_addr_max 298 + Type: read 299 + Offset/size: 0x22c/4 300 + Protocol: 2.03+ 301 + 302 + The maximum address that may be occupied by the initial 303 + ramdisk/ramfs contents. For boot protocols 2.02 or earlier, this 304 + field is not present, and the maximum address is 0x37FFFFFF. (This 305 + address is defined as the address of the highest safe byte, so if 306 + your ramdisk is exactly 131072 bytes long and this field is 307 + 0x37FFFFFF, you can start your ramdisk at 0x37FE0000.) 308 + 309 + Field name: kernel_alignment 310 + Type: read (reloc) 311 + Offset/size: 0x230/4 312 + Protocol: 2.05+ 313 + 314 + Alignment unit required by the kernel (if relocatable_kernel is true.) 315 + 316 + Field name: relocatable_kernel 317 + Type: read (reloc) 318 + Offset/size: 0x234/1 319 + Protocol: 2.05+ 320 + 321 + If this field is nonzero, the protected-mode part of the kernel can 322 + be loaded at any address that satisfies the kernel_alignment field. 323 + After loading, the boot loader must set the code32_start field to 324 + point to the loaded code, or to a boot loader hook. 325 + 326 + Field name: cmdline_size 327 + Type: read 328 + Offset/size: 0x238/4 329 + Protocol: 2.06+ 330 + 331 + The maximum size of the command line without the terminating 332 + zero. This means that the command line can contain at most 333 + cmdline_size characters. With protocol version 2.05 and earlier, the 334 + maximum size was 255. 386 335 387 336 388 337 **** THE KERNEL COMMAND LINE