^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) .. SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) ===========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) The Linux/x86 Boot Protocol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) ===========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) On the x86 platform, the Linux kernel uses a rather complicated boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) convention. This has evolved partially due to historical aspects, as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) well as the desire in the early days to have the kernel itself be a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) bootable image, the complicated PC memory model and due to changed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) expectations in the PC industry caused by the effective demise of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) real-mode DOS as a mainstream operating system.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) Currently, the following versions of the Linux/x86 boot protocol exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ============= ============================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) Old kernels zImage/Image support only. Some very early kernels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) may not even support a command line.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) Protocol 2.00 (Kernel 1.3.73) Added bzImage and initrd support, as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) well as a formalized way to communicate between the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) boot loader and the kernel. setup.S made relocatable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) although the traditional setup area still assumed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) writable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) Protocol 2.01 (Kernel 1.3.76) Added a heap overrun warning.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) Protocol 2.02 (Kernel 2.4.0-test3-pre3) New command line protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) Lower the conventional memory ceiling. No overwrite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) of the traditional setup area, thus making booting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) safe for systems which use the EBDA from SMM or 32-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) BIOS entry points. zImage deprecated but still
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) Protocol 2.03 (Kernel 2.4.18-pre1) Explicitly makes the highest possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) initrd address available to the bootloader.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) Protocol 2.04 (Kernel 2.6.14) Extend the syssize field to four bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) Protocol 2.05 (Kernel 2.6.20) Make protected mode kernel relocatable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) Introduce relocatable_kernel and kernel_alignment fields.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) Protocol 2.06 (Kernel 2.6.22) Added a field that contains the size of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) the boot command line.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) Protocol 2.07 (Kernel 2.6.24) Added paravirtualised boot protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) Introduced hardware_subarch and hardware_subarch_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) and KEEP_SEGMENTS flag in load_flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) Protocol 2.08 (Kernel 2.6.26) Added crc32 checksum and ELF format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) payload. Introduced payload_offset and payload_length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) fields to aid in locating the payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) Protocol 2.09 (Kernel 2.6.26) Added a field of 64-bit physical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) pointer to single linked list of struct setup_data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) Protocol 2.10 (Kernel 2.6.31) Added a protocol for relaxed alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) beyond the kernel_alignment added, new init_size and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) pref_address fields. Added extended boot loader IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) Protocol 2.11 (Kernel 3.6) Added a field for offset of EFI handover
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) protocol entry point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) Protocol 2.12 (Kernel 3.8) Added the xloadflags field and extension fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) to struct boot_params for loading bzImage and ramdisk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) above 4G in 64bit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) Protocol 2.13 (Kernel 3.14) Support 32- and 64-bit flags being set in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) xloadflags to support booting a 64-bit kernel from 32-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) Protocol 2.14 BURNT BY INCORRECT COMMIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ae7e1238e68f2a472a125673ab506d49158c1889
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) (x86/boot: Add ACPI RSDP address to setup_header)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) DO NOT USE!!! ASSUME SAME AS 2.13.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) Protocol 2.15 (Kernel 5.5) Added the kernel_info and kernel_info.setup_type_max.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ============= ============================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) The protocol version number should be changed only if the setup header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) is changed. There is no need to update the version number if boot_params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) or kernel_info are changed. Additionally, it is recommended to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) xloadflags (in this case the protocol version number should not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) updated either) or kernel_info to communicate supported Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) features to the boot loader. Due to very limited space available in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) the original setup header every update to it should be considered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) with great care. Starting from the protocol 2.15 the primary way to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) communicate things to the boot loader is the kernel_info.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) Memory Layout
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) =============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) The traditional memory map for the kernel loader, used for Image or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) zImage kernels, typically looks like::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) 0A0000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) | Reserved for BIOS | Do not use. Reserved for BIOS EBDA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 09A000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) | Command line |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) | Stack/heap | For use by the kernel real-mode code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 098000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) | Kernel setup | The kernel real-mode code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 090200 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) | Kernel boot sector | The kernel legacy boot sector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 090000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) | Protected-mode kernel | The bulk of the kernel image.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 010000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) | Boot loader | <- Boot sector entry point 0000:7C00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 001000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) | Reserved for MBR/BIOS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 000800 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) | Typically used by MBR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 000600 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) | BIOS use only |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 000000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) When using bzImage, the protected-mode kernel was relocated to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 0x100000 ("high memory"), and the kernel real-mode block (boot sector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) setup, and stack/heap) was made relocatable to any address between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 0x10000 and end of low memory. Unfortunately, in protocols 2.00 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 2.01 the 0x90000+ memory range is still used internally by the kernel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) the 2.02 protocol resolves that problem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) It is desirable to keep the "memory ceiling" -- the highest point in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) low memory touched by the boot loader -- as low as possible, since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) some newer BIOSes have begun to allocate some rather large amounts of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) memory, called the Extended BIOS Data Area, near the top of low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) memory. The boot loader should use the "INT 12h" BIOS call to verify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) how much low memory is available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) Unfortunately, if INT 12h reports that the amount of memory is too
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) low, there is usually nothing the boot loader can do but to report an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) error to the user. The boot loader should therefore be designed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) take up as little space in low memory as it reasonably can. For
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) zImage or old bzImage kernels, which need data written into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 0x90000 segment, the boot loader should make sure not to use memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) above the 0x9A000 point; too many BIOSes will break above that point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) For a modern bzImage kernel with boot protocol version >= 2.02, a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) memory layout like the following is suggested::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ~ ~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) | Protected-mode kernel |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 100000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) | I/O memory hole |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 0A0000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) | Reserved for BIOS | Leave as much as possible unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ~ ~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) | Command line | (Can also be below the X+10000 mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) X+10000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) | Stack/heap | For use by the kernel real-mode code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) X+08000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) | Kernel setup | The kernel real-mode code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) | Kernel boot sector | The kernel legacy boot sector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) X +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) | Boot loader | <- Boot sector entry point 0000:7C00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 001000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) | Reserved for MBR/BIOS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 000800 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) | Typically used by MBR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 000600 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) | BIOS use only |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 000000 +------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ... where the address X is as low as the design of the boot loader permits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) The Real-Mode Kernel Header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ===========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) In the following text, and anywhere in the kernel boot sequence, "a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) sector" refers to 512 bytes. It is independent of the actual sector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) size of the underlying medium.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) The first step in loading a Linux kernel should be to load the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) real-mode code (boot sector and setup code) and then examine the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) following header at offset 0x01f1. The real-mode code can total up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 32K, although the boot loader may choose to load only the first two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) sectors (1K) and then examine the bootup sector size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) The header looks like:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) =========== ======== ===================== ============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) Offset/Size Proto Name Meaning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) =========== ======== ===================== ============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 01F1/1 ALL(1) setup_sects The size of the setup in sectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 01F2/2 ALL root_flags If set, the root is mounted readonly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 01F4/4 2.04+(2) syssize The size of the 32-bit code in 16-byte paras
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 01F8/2 ALL ram_size DO NOT USE - for bootsect.S use only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 01FA/2 ALL vid_mode Video mode control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 01FC/2 ALL root_dev Default root device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 01FE/2 ALL boot_flag 0xAA55 magic number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 0200/2 2.00+ jump Jump instruction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 0202/4 2.00+ header Magic signature "HdrS"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 0206/2 2.00+ version Boot protocol version supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 0208/4 2.00+ realmode_swtch Boot loader hook (see below)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 020C/2 2.00+ start_sys_seg The load-low segment (0x1000) (obsolete)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 020E/2 2.00+ kernel_version Pointer to kernel version string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 0210/1 2.00+ type_of_loader Boot loader identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 0211/1 2.00+ loadflags Boot protocol option flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 0212/2 2.00+ setup_move_size Move to high memory size (used with hooks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 0214/4 2.00+ code32_start Boot loader hook (see below)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 0218/4 2.00+ ramdisk_image initrd load address (set by boot loader)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 021C/4 2.00+ ramdisk_size initrd size (set by boot loader)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 0220/4 2.00+ bootsect_kludge DO NOT USE - for bootsect.S use only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 0224/2 2.01+ heap_end_ptr Free memory after setup end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 0226/1 2.02+(3) ext_loader_ver Extended boot loader version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 0227/1 2.02+(3) ext_loader_type Extended boot loader ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 0228/4 2.02+ cmd_line_ptr 32-bit pointer to the kernel command line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 022C/4 2.03+ initrd_addr_max Highest legal initrd address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 0230/4 2.05+ kernel_alignment Physical addr alignment required for kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 0234/1 2.05+ relocatable_kernel Whether kernel is relocatable or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 0235/1 2.10+ min_alignment Minimum alignment, as a power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 0236/2 2.12+ xloadflags Boot protocol option flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 0238/4 2.06+ cmdline_size Maximum size of the kernel command line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 023C/4 2.07+ hardware_subarch Hardware subarchitecture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 0248/4 2.08+ payload_offset Offset of kernel payload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 024C/4 2.08+ payload_length Length of kernel payload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 0250/8 2.09+ setup_data 64-bit physical pointer to linked list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) of struct setup_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 0258/8 2.10+ pref_address Preferred loading address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 0260/4 2.10+ init_size Linear memory required during initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 0264/4 2.11+ handover_offset Offset of handover entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 0268/4 2.15+ kernel_info_offset Offset of the kernel_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) =========== ======== ===================== ============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) (1) For backwards compatibility, if the setup_sects field contains 0, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) real value is 4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) (2) For boot protocol prior to 2.04, the upper two bytes of the syssize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) field are unusable, which means the size of a bzImage kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) cannot be determined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) (3) Ignored, but safe to set, for boot protocols 2.02-2.09.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) If the "HdrS" (0x53726448) magic number is not found at offset 0x202,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) the boot protocol version is "old". Loading an old kernel, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) following parameters should be assumed::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) Image type = zImage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) initrd not supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) Real-mode kernel must be located at 0x90000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) Otherwise, the "version" field contains the protocol version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) e.g. protocol version 2.01 will contain 0x0201 in this field. When
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) setting fields in the header, you must make sure only to set fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) supported by the protocol version in use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) Details of Header Fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) ========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) For each field, some are information from the kernel to the bootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ("read"), some are expected to be filled out by the bootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ("write"), and some are expected to be read and modified by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) bootloader ("modify").
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) All general purpose boot loaders should write the fields marked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) (obligatory). Boot loaders who want to load the kernel at a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) nonstandard address should fill in the fields marked (reloc); other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) boot loaders can ignore those fields.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) The byte order of all fields is littleendian (this is x86, after all.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ============ ===========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) Field name: setup_sects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) Offset/size: 0x1f1/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) Protocol: ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) ============ ===========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) The size of the setup code in 512-byte sectors. If this field is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 0, the real value is 4. The real-mode code consists of the boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) sector (always one 512-byte sector) plus the setup code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) ============ =================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) Field name: root_flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) Type: modify (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) Offset/size: 0x1f2/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) Protocol: ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ============ =================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) If this field is nonzero, the root defaults to readonly. The use of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) this field is deprecated; use the "ro" or "rw" options on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) command line instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ============ ===============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) Field name: syssize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) Offset/size: 0x1f4/4 (protocol 2.04+) 0x1f4/2 (protocol ALL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) Protocol: 2.04+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) ============ ===============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) The size of the protected-mode code in units of 16-byte paragraphs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) For protocol versions older than 2.04 this field is only two bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) wide, and therefore cannot be trusted for the size of a kernel if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) the LOAD_HIGH flag is set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) Field name: ram_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) Type: kernel internal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) Offset/size: 0x1f8/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) Protocol: ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) This field is obsolete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) ============ ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) Field name: vid_mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) Type: modify (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) Offset/size: 0x1fa/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) ============ ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) Please see the section on SPECIAL COMMAND LINE OPTIONS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) ============ =================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) Field name: root_dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) Type: modify (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) Offset/size: 0x1fc/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) Protocol: ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) ============ =================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) The default root device device number. The use of this field is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) deprecated, use the "root=" option on the command line instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) ============ =========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) Field name: boot_flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) Offset/size: 0x1fe/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) Protocol: ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) ============ =========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) Contains 0xAA55. This is the closest thing old Linux kernels have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) to a magic number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) Field name: jump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) Offset/size: 0x200/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) Contains an x86 jump instruction, 0xEB followed by a signed offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) relative to byte 0x202. This can be used to determine the size of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) the header.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) Field name: header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) Offset/size: 0x202/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) Contains the magic number "HdrS" (0x53726448).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) Field name: version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) Offset/size: 0x206/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) Contains the boot protocol version, in (major << 8)+minor format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 10.17.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) ============ =================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) Field name: realmode_swtch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) Type: modify (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) Offset/size: 0x208/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) ============ =================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) Boot loader hook (see ADVANCED BOOT LOADER HOOKS below.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) ============ =============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) Field name: start_sys_seg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) Offset/size: 0x20c/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) ============ =============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) The load low segment (0x1000). Obsolete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) Field name: kernel_version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) Offset/size: 0x20e/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) If set to a nonzero value, contains a pointer to a NUL-terminated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) human-readable kernel version number string, less 0x200. This can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) be used to display the kernel version to the user. This value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) should be less than (0x200*setup_sects).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) For example, if this value is set to 0x1c00, the kernel version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) number string can be found at offset 0x1e00 in the kernel file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) This is a valid value if and only if the "setup_sects" field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) contains the value 15 or higher, as::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 0x1c00 < 15*0x200 (= 0x1e00) but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 0x1c00 >= 14*0x200 (= 0x1c00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 0x1c00 >> 9 = 14, So the minimum value for setup_secs is 15.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) Field name: type_of_loader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) Type: write (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) Offset/size: 0x210/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) If your boot loader has an assigned id (see table below), enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 0xTV here, where T is an identifier for the boot loader and V is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) a version number. Otherwise, enter 0xFF here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) For boot loader IDs above T = 0xD, write T = 0xE to this field and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) write the extended ID minus 0x10 to the ext_loader_type field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) Similarly, the ext_loader_ver field can be used to provide more than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) four bits for the bootloader version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) For example, for T = 0x15, V = 0x234, write::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) type_of_loader <- 0xE4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) ext_loader_type <- 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) ext_loader_ver <- 0x23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) Assigned boot loader ids (hexadecimal):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) == =======================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 0 LILO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) (0x00 reserved for pre-2.00 bootloader)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 1 Loadlin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 2 bootsect-loader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) (0x20, all other values reserved)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 3 Syslinux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 4 Etherboot/gPXE/iPXE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 5 ELILO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 7 GRUB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 8 U-Boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 9 Xen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) A Gujin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) B Qemu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) C Arcturus Networks uCbootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) D kexec-tools
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) E Extended (see ext_loader_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) F Special (0xFF = undefined)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 10 Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 11 Minimal Linux Bootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) <http://sebastian-plotz.blogspot.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 12 OVMF UEFI virtualization stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) == =======================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) Please contact <hpa@zytor.com> if you need a bootloader ID value assigned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) ============ ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) Field name: loadflags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) Type: modify (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) Offset/size: 0x211/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ============ ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) This field is a bitmask.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) Bit 0 (read): LOADED_HIGH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) - If 0, the protected-mode code is loaded at 0x10000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) - If 1, the protected-mode code is loaded at 0x100000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) Bit 1 (kernel internal): KASLR_FLAG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) - Used internally by the compressed kernel to communicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) KASLR status to kernel proper.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) - If 1, KASLR enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) - If 0, KASLR disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) Bit 5 (write): QUIET_FLAG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) - If 0, print early messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) - If 1, suppress early messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) This requests to the kernel (decompressor and early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) kernel) to not write early messages that require
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) accessing the display hardware directly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) Bit 6 (obsolete): KEEP_SEGMENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) Protocol: 2.07+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) - This flag is obsolete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) Bit 7 (write): CAN_USE_HEAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) Set this bit to 1 to indicate that the value entered in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) heap_end_ptr is valid. If this field is clear, some setup code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) functionality will be disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) ============ ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) Field name: setup_move_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) Type: modify (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) Offset/size: 0x212/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) Protocol: 2.00-2.01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) ============ ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) When using protocol 2.00 or 2.01, if the real mode kernel is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) loaded at 0x90000, it gets moved there later in the loading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) sequence. Fill in this field if you want additional data (such as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) the kernel command line) moved in addition to the real-mode kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) The unit is bytes starting with the beginning of the boot sector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) This field is can be ignored when the protocol is 2.02 or higher, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if the real-mode code is loaded at 0x90000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) ============ ========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) Field name: code32_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) Type: modify (optional, reloc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) Offset/size: 0x214/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) ============ ========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) The address to jump to in protected mode. This defaults to the load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) address of the kernel, and can be used by the boot loader to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) determine the proper load address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) This field can be modified for two purposes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 1. as a boot loader hook (see Advanced Boot Loader Hooks below.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 2. if a bootloader which does not install a hook loads a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) relocatable kernel at a nonstandard address it will have to modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) this field to point to the load address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) Field name: ramdisk_image
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) Type: write (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) Offset/size: 0x218/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) The 32-bit linear address of the initial ramdisk or ramfs. Leave at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) zero if there is no initial ramdisk/ramfs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) Field name: ramdisk_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) Type: write (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) Offset/size: 0x21c/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) Size of the initial ramdisk or ramfs. Leave at zero if there is no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) initial ramdisk/ramfs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) Field name: bootsect_kludge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) Type: kernel internal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) Offset/size: 0x220/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) Protocol: 2.00+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) This field is obsolete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) Field name: heap_end_ptr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) Type: write (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) Offset/size: 0x224/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) Protocol: 2.01+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) Set this field to the offset (from the beginning of the real-mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) code) of the end of the setup stack/heap, minus 0x0200.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) ============ ================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) Field name: ext_loader_ver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) Type: write (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) Offset/size: 0x226/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) Protocol: 2.02+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) ============ ================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) This field is used as an extension of the version number in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) type_of_loader field. The total version number is considered to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) (type_of_loader & 0x0f) + (ext_loader_ver << 4).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) The use of this field is boot loader specific. If not written, it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) is zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) Kernels prior to 2.6.31 did not recognize this field, but it is safe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) to write for protocol version 2.02 or higher.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) ============ =====================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) Field name: ext_loader_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) Type: write (obligatory if (type_of_loader & 0xf0) == 0xe0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) Offset/size: 0x227/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) Protocol: 2.02+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) ============ =====================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) This field is used as an extension of the type number in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) type_of_loader field. If the type in type_of_loader is 0xE, then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) the actual type is (ext_loader_type + 0x10).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) This field is ignored if the type in type_of_loader is not 0xE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) Kernels prior to 2.6.31 did not recognize this field, but it is safe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) to write for protocol version 2.02 or higher.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) Field name: cmd_line_ptr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) Type: write (obligatory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) Offset/size: 0x228/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) Protocol: 2.02+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) Set this field to the linear address of the kernel command line.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) The kernel command line can be located anywhere between the end of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) the setup heap and 0xA0000; it does not have to be located in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) same 64K segment as the real-mode code itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) Fill in this field even if your boot loader does not support a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) command line, in which case you can point this to an empty string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) (or better yet, to the string "auto".) If this field is left at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) zero, the kernel will assume that your boot loader does not support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) the 2.02+ protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) Field name: initrd_addr_max
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) Offset/size: 0x22c/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) Protocol: 2.03+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) The maximum address that may be occupied by the initial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) ramdisk/ramfs contents. For boot protocols 2.02 or earlier, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) field is not present, and the maximum address is 0x37FFFFFF. (This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) address is defined as the address of the highest safe byte, so if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) your ramdisk is exactly 131072 bytes long and this field is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 0x37FFFFFF, you can start your ramdisk at 0x37FE0000.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) ============ ============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) Field name: kernel_alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) Type: read/modify (reloc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) Offset/size: 0x230/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) Protocol: 2.05+ (read), 2.10+ (modify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) ============ ============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) Alignment unit required by the kernel (if relocatable_kernel is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) true.) A relocatable kernel that is loaded at an alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) incompatible with the value in this field will be realigned during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) kernel initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) Starting with protocol version 2.10, this reflects the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) alignment preferred for optimal performance; it is possible for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) loader to modify this field to permit a lesser alignment. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) min_alignment and pref_address field below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) Field name: relocatable_kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) Type: read (reloc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) Offset/size: 0x234/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) Protocol: 2.05+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) If this field is nonzero, the protected-mode part of the kernel can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) be loaded at any address that satisfies the kernel_alignment field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) After loading, the boot loader must set the code32_start field to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) point to the loaded code, or to a boot loader hook.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) ============ =============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) Field name: min_alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) Type: read (reloc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) Offset/size: 0x235/1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) Protocol: 2.10+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) ============ =============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) This field, if nonzero, indicates as a power of two the minimum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) alignment required, as opposed to preferred, by the kernel to boot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) If a boot loader makes use of this field, it should update the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) kernel_alignment field with the alignment unit desired; typically::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) kernel_alignment = 1 << min_alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) There may be a considerable performance cost with an excessively
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) misaligned kernel. Therefore, a loader should typically try each
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) power-of-two alignment from kernel_alignment down to this alignment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) ============ ==========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) Field name: xloadflags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) Offset/size: 0x236/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) Protocol: 2.12+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) ============ ==========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) This field is a bitmask.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) Bit 0 (read): XLF_KERNEL_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) - If 1, this kernel has the legacy 64-bit entry point at 0x200.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) Bit 1 (read): XLF_CAN_BE_LOADED_ABOVE_4G
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) - If 1, kernel/boot_params/cmdline/ramdisk can be above 4G.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) Bit 2 (read): XLF_EFI_HANDOVER_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) - If 1, the kernel supports the 32-bit EFI handoff entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) given at handover_offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) Bit 3 (read): XLF_EFI_HANDOVER_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) - If 1, the kernel supports the 64-bit EFI handoff entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) given at handover_offset + 0x200.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) Bit 4 (read): XLF_EFI_KEXEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) - If 1, the kernel supports kexec EFI boot with EFI runtime support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) ============ ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) Field name: cmdline_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) Offset/size: 0x238/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) Protocol: 2.06+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) ============ ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) The maximum size of the command line without the terminating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) zero. This means that the command line can contain at most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) cmdline_size characters. With protocol version 2.05 and earlier, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) maximum size was 255.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) ============ ====================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) Field name: hardware_subarch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) Type: write (optional, defaults to x86/PC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) Offset/size: 0x23c/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) Protocol: 2.07+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) ============ ====================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) In a paravirtualized environment the hardware low level architectural
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) pieces such as interrupt handling, page table handling, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) accessing process control registers needs to be done differently.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) This field allows the bootloader to inform the kernel we are in one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) one of those environments.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) ========== ==============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 0x00000000 The default x86/PC environment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 0x00000001 lguest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 0x00000002 Xen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 0x00000003 Moorestown MID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 0x00000004 CE4100 TV Platform
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) ========== ==============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) ============ =========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) Field name: hardware_subarch_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) Type: write (subarch-dependent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) Offset/size: 0x240/8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) Protocol: 2.07+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) ============ =========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) A pointer to data that is specific to hardware subarch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) This field is currently unused for the default x86/PC environment,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) do not modify.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) Field name: payload_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) Offset/size: 0x248/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) Protocol: 2.08+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) If non-zero then this field contains the offset from the beginning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) of the protected-mode code to the payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) The payload may be compressed. The format of both the compressed and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) uncompressed data should be determined using the standard magic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) numbers. The currently supported compression formats are gzip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) (magic numbers 1F 8B or 1F 9E), bzip2 (magic number 42 5A), LZMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) (magic number 5D 00), XZ (magic number FD 37), LZ4 (magic number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 02 21) and ZSTD (magic number 28 B5). The uncompressed payload is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) currently always ELF (magic number 7F 45 4C 46).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) Field name: payload_length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) Offset/size: 0x24c/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) Protocol: 2.08+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) The length of the payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) Field name: setup_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) Type: write (special)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) Offset/size: 0x250/8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) Protocol: 2.09+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) The 64-bit physical pointer to NULL terminated single linked list of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) struct setup_data. This is used to define a more extensible boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) parameters passing mechanism. The definition of struct setup_data is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) as follow::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) struct setup_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) u64 next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) u32 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) u32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) u8 data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) Where, the next is a 64-bit physical pointer to the next node of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) linked list, the next field of the last node is 0; the type is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) to identify the contents of data; the len is the length of data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) field; the data holds the real payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) This list may be modified at a number of points during the bootup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) process. Therefore, when modifying this list one should always make
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) sure to consider the case where the linked list already contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) entries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) The setup_data is a bit awkward to use for extremely large data objects,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) both because the setup_data header has to be adjacent to the data object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) and because it has a 32-bit length field. However, it is important that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) intermediate stages of the boot process have a way to identify which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) chunks of memory are occupied by kernel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) Thus setup_indirect struct and SETUP_INDIRECT type were introduced in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) protocol 2.15::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) struct setup_indirect {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) __u32 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) __u32 reserved; /* Reserved, must be set to zero. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) __u64 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) __u64 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) The type member is a SETUP_INDIRECT | SETUP_* type. However, it cannot be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) SETUP_INDIRECT itself since making the setup_indirect a tree structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) could require a lot of stack space in something that needs to parse it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) and stack space can be limited in boot contexts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) Let's give an example how to point to SETUP_E820_EXT data using setup_indirect.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) In this case setup_data and setup_indirect will look like this::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) struct setup_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) __u64 next = 0 or <addr_of_next_setup_data_struct>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) __u32 type = SETUP_INDIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) __u32 len = sizeof(setup_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) __u8 data[sizeof(setup_indirect)] = struct setup_indirect {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) __u32 type = SETUP_INDIRECT | SETUP_E820_EXT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) __u32 reserved = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) __u64 len = <len_of_SETUP_E820_EXT_data>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) __u64 addr = <addr_of_SETUP_E820_EXT_data>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) SETUP_INDIRECT | SETUP_NONE objects cannot be properly distinguished
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) from SETUP_INDIRECT itself. So, this kind of objects cannot be provided
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) by the bootloaders.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) ============ ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) Field name: pref_address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) Type: read (reloc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) Offset/size: 0x258/8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) Protocol: 2.10+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) ============ ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) This field, if nonzero, represents a preferred load address for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) kernel. A relocating bootloader should attempt to load at this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) address if possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) A non-relocatable kernel will unconditionally move itself and to run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) at this address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) Field name: init_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) Offset/size: 0x260/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) ============ =======
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) This field indicates the amount of linear contiguous memory starting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) at the kernel runtime start address that the kernel needs before it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) is capable of examining its memory map. This is not the same thing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) as the total amount of memory the kernel needs to boot, but it can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) be used by a relocating boot loader to help select a safe load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) address for the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) The kernel runtime start address is determined by the following algorithm::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) if (relocatable_kernel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) runtime_start = align_up(load_address, kernel_alignment)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) runtime_start = pref_address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) Field name: handover_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) Offset/size: 0x264/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) ============ ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) This field is the offset from the beginning of the kernel image to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) the EFI handover protocol entry point. Boot loaders using the EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) handover protocol to boot the kernel should jump to this offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) See EFI HANDOVER PROTOCOL below for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) Field name: kernel_info_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) Type: read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) Offset/size: 0x268/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) Protocol: 2.15+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) ============ ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) This field is the offset from the beginning of the kernel image to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) kernel_info. The kernel_info structure is embedded in the Linux image
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) in the uncompressed protected mode region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) The kernel_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) ===============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) The relationships between the headers are analogous to the various data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) sections:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) setup_header = .data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) boot_params/setup_data = .bss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) What is missing from the above list? That's right:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) kernel_info = .rodata
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) We have been (ab)using .data for things that could go into .rodata or .bss for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) a long time, for lack of alternatives and -- especially early on -- inertia.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) Also, the BIOS stub is responsible for creating boot_params, so it isn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) available to a BIOS-based loader (setup_data is, though).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) setup_header is permanently limited to 144 bytes due to the reach of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) 2-byte jump field, which doubles as a length field for the structure, combined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) with the size of the "hole" in struct boot_params that a protected-mode loader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) or the BIOS stub has to copy it into. It is currently 119 bytes long, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) leaves us with 25 very precious bytes. This isn't something that can be fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) without revising the boot protocol entirely, breaking backwards compatibility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) boot_params proper is limited to 4096 bytes, but can be arbitrarily extended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) by adding setup_data entries. It cannot be used to communicate properties of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) the kernel image, because it is .bss and has no image-provided content.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) kernel_info solves this by providing an extensible place for information about
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) the kernel image. It is readonly, because the kernel cannot rely on a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) bootloader copying its contents anywhere, but that is OK; if it becomes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) necessary it can still contain data items that an enabled bootloader would be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) expected to copy into a setup_data chunk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) All kernel_info data should be part of this structure. Fixed size data have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) be put before kernel_info_var_len_data label. Variable size data have to be put
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) after kernel_info_var_len_data label. Each chunk of variable size data has to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) be prefixed with header/magic and its size, e.g.::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) kernel_info:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) .ascii "LToP" /* Header, Linux top (structure). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) .long kernel_info_var_len_data - kernel_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) .long kernel_info_end - kernel_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) .long 0x01234567 /* Some fixed size data for the bootloaders. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) kernel_info_var_len_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) example_struct: /* Some variable size data for the bootloaders. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) .ascii "0123" /* Header/Magic. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) .long example_struct_end - example_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) .ascii "Struct"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) .long 0x89012345
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) example_struct_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) example_strings: /* Some variable size data for the bootloaders. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) .ascii "ABCD" /* Header/Magic. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) .long example_strings_end - example_strings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) .asciz "String_0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) .asciz "String_1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) example_strings_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) kernel_info_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) This way the kernel_info is self-contained blob.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) Each variable size data header/magic can be any 4-character string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) without \0 at the end of the string, which does not collide with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) existing variable length data headers/magics.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) Details of the kernel_info Fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) =================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) ============ ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) Field name: header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) Offset/size: 0x0000/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) ============ ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) Contains the magic number "LToP" (0x506f544c).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) ============ ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) Field name: size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) Offset/size: 0x0004/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) ============ ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) This field contains the size of the kernel_info including kernel_info.header.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) It does not count kernel_info.kernel_info_var_len_data size. This field should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) used by the bootloaders to detect supported fixed size fields in the kernel_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) and beginning of kernel_info.kernel_info_var_len_data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) ============ ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) Field name: size_total
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) Offset/size: 0x0008/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) ============ ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) This field contains the size of the kernel_info including kernel_info.header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) and kernel_info.kernel_info_var_len_data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) Field name: setup_type_max
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) Offset/size: 0x000c/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) ============ ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) This field contains maximal allowed type for setup_data and setup_indirect structs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) The Image Checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) From boot protocol version 2.08 onwards the CRC-32 is calculated over
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) the entire file using the characteristic polynomial 0x04C11DB7 and an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) initial remainder of 0xffffffff. The checksum is appended to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) file; therefore the CRC of the file up to the limit specified in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) syssize field of the header is always 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) The Kernel Command Line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) =======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) The kernel command line has become an important way for the boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) loader to communicate with the kernel. Some of its options are also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) relevant to the boot loader itself, see "special command line options"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) The kernel command line is a null-terminated string. The maximum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) length can be retrieved from the field cmdline_size. Before protocol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) version 2.06, the maximum was 255 characters. A string that is too
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) long will be automatically truncated by the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) If the boot protocol version is 2.02 or later, the address of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) kernel command line is given by the header field cmd_line_ptr (see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) above.) This address can be anywhere between the end of the setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) heap and 0xA0000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) If the protocol version is *not* 2.02 or higher, the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) command line is entered using the following protocol:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) - At offset 0x0020 (word), "cmd_line_magic", enter the magic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) number 0xA33F.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) - At offset 0x0022 (word), "cmd_line_offset", enter the offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) of the kernel command line (relative to the start of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) real-mode kernel).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) - The kernel command line *must* be within the memory region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) covered by setup_move_size, so you may need to adjust this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) Memory Layout of The Real-Mode Code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) ===================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) The real-mode code requires a stack/heap to be set up, as well as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) memory allocated for the kernel command line. This needs to be done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) in the real-mode accessible memory in bottom megabyte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) It should be noted that modern machines often have a sizable Extended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) BIOS Data Area (EBDA). As a result, it is advisable to use as little
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) of the low megabyte as possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) Unfortunately, under the following circumstances the 0x90000 memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) segment has to be used:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) - When loading a zImage kernel ((loadflags & 0x01) == 0).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) - When loading a 2.01 or earlier boot protocol kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) For the 2.00 and 2.01 boot protocols, the real-mode code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) can be loaded at another address, but it is internally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) relocated to 0x90000. For the "old" protocol, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) real-mode code must be loaded at 0x90000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) When loading at 0x90000, avoid using memory above 0x9a000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) For boot protocol 2.02 or higher, the command line does not have to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) located in the same 64K segment as the real-mode setup code; it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) thus permitted to give the stack/heap the full 64K segment and locate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) the command line above it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) The kernel command line should not be located below the real-mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) code, nor should it be located in high memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) Sample Boot Configuartion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) =========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) As a sample configuration, assume the following layout of the real
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) mode segment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) When loading below 0x90000, use the entire segment:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) ============= ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 0x0000-0x7fff Real mode kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 0x8000-0xdfff Stack and heap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 0xe000-0xffff Kernel command line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) ============= ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) When loading at 0x90000 OR the protocol version is 2.01 or earlier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) ============= ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 0x0000-0x7fff Real mode kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 0x8000-0x97ff Stack and heap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 0x9800-0x9fff Kernel command line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) ============= ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) Such a boot loader should enter the following fields in the header::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) unsigned long base_ptr; /* base address for real-mode segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) if ( setup_sects == 0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) setup_sects = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) if ( protocol >= 0x0200 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) type_of_loader = <type code>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) if ( loading_initrd ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) ramdisk_image = <initrd_address>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) ramdisk_size = <initrd_size>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) if ( protocol >= 0x0202 && loadflags & 0x01 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) heap_end = 0xe000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) heap_end = 0x9800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) if ( protocol >= 0x0201 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) heap_end_ptr = heap_end - 0x200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) loadflags |= 0x80; /* CAN_USE_HEAP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) if ( protocol >= 0x0202 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) cmd_line_ptr = base_ptr + heap_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) strcpy(cmd_line_ptr, cmdline);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) cmd_line_magic = 0xA33F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) cmd_line_offset = heap_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) setup_move_size = heap_end + strlen(cmdline)+1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) strcpy(base_ptr+cmd_line_offset, cmdline);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) /* Very old kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) heap_end = 0x9800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) cmd_line_magic = 0xA33F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) cmd_line_offset = heap_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) /* A very old kernel MUST have its real-mode code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) loaded at 0x90000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) if ( base_ptr != 0x90000 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) /* Copy the real-mode kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) memcpy(0x90000, base_ptr, (setup_sects+1)*512);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) base_ptr = 0x90000; /* Relocated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) strcpy(0x90000+cmd_line_offset, cmdline);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) /* It is recommended to clear memory up to the 32K mark */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) memset(0x90000 + (setup_sects+1)*512, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) (64-(setup_sects+1))*512);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) Loading The Rest of The Kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) ==============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) The 32-bit (non-real-mode) kernel starts at offset (setup_sects+1)*512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) in the kernel file (again, if setup_sects == 0 the real value is 4.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) It should be loaded at address 0x10000 for Image/zImage kernels and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 0x100000 for bzImage kernels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) The kernel is a bzImage kernel if the protocol >= 2.00 and the 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) bit (LOAD_HIGH) in the loadflags field is set::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) is_bzImage = (protocol >= 0x0200) && (loadflags & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) load_address = is_bzImage ? 0x100000 : 0x10000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) Note that Image/zImage kernels can be up to 512K in size, and thus use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) the entire 0x10000-0x90000 range of memory. This means it is pretty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) much a requirement for these kernels to load the real-mode part at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 0x90000. bzImage kernels allow much more flexibility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) Special Command Line Options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) ============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) If the command line provided by the boot loader is entered by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) user, the user may expect the following command line options to work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) They should normally not be deleted from the kernel command line even
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) though not all of them are actually meaningful to the kernel. Boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) loader authors who need additional command line options for the boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) loader itself should get them registered in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) Documentation/admin-guide/kernel-parameters.rst to make sure they will not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) conflict with actual kernel options now or in the future.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) vga=<mode>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) <mode> here is either an integer (in C notation, either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) decimal, octal, or hexadecimal) or one of the strings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) "normal" (meaning 0xFFFF), "ext" (meaning 0xFFFE) or "ask"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) (meaning 0xFFFD). This value should be entered into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) vid_mode field, as it is used by the kernel before the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) line is parsed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) mem=<size>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) <size> is an integer in C notation optionally followed by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) (case insensitive) K, M, G, T, P or E (meaning << 10, << 20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) << 30, << 40, << 50 or << 60). This specifies the end of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) memory to the kernel. This affects the possible placement of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) an initrd, since an initrd should be placed near end of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) memory. Note that this is an option to *both* the kernel and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) the bootloader!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) initrd=<file>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) An initrd should be loaded. The meaning of <file> is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) obviously bootloader-dependent, and some boot loaders
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) (e.g. LILO) do not have such a command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) In addition, some boot loaders add the following options to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) user-specified command line:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) BOOT_IMAGE=<file>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) The boot image which was loaded. Again, the meaning of <file>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) is obviously bootloader-dependent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) auto
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) The kernel was booted without explicit user intervention.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) If these options are added by the boot loader, it is highly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) recommended that they are located *first*, before the user-specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) or configuration-specified command line. Otherwise, "init=/bin/sh"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) gets confused by the "auto" option.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) Running the Kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) The kernel is started by jumping to the kernel entry point, which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) located at *segment* offset 0x20 from the start of the real mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) kernel. This means that if you loaded your real-mode kernel code at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 0x90000, the kernel entry point is 9020:0000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) At entry, ds = es = ss should point to the start of the real-mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) kernel code (0x9000 if the code is loaded at 0x90000), sp should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) set up properly, normally pointing to the top of the heap, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) interrupts should be disabled. Furthermore, to guard against bugs in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) the kernel, it is recommended that the boot loader sets fs = gs = ds =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) es = ss.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) In our example from above, we would do::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) /* Note: in the case of the "old" kernel protocol, base_ptr must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) be == 0x90000 at this point; see the previous sample code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) seg = base_ptr >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) cli(); /* Enter with interrupts disabled! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) /* Set up the real-mode kernel stack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) _SS = seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) _SP = heap_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) _DS = _ES = _FS = _GS = seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) jmp_far(seg+0x20, 0); /* Run the kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) If your boot sector accesses a floppy drive, it is recommended to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) switch off the floppy motor before running the kernel, since the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) kernel boot leaves interrupts off and thus the motor will not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) switched off, especially if the loaded kernel has the floppy driver as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) a demand-loaded module!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) Advanced Boot Loader Hooks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) ==========================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) If the boot loader runs in a particularly hostile environment (such as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) LOADLIN, which runs under DOS) it may be impossible to follow the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) standard memory location requirements. Such a boot loader may use the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) following hooks that, if set, are invoked by the kernel at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) appropriate time. The use of these hooks should probably be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) considered an absolutely last resort!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) IMPORTANT: All the hooks are required to preserve %esp, %ebp, %esi and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) %edi across invocation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) realmode_swtch:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) A 16-bit real mode far subroutine invoked immediately before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) entering protected mode. The default routine disables NMI, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) your routine should probably do so, too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) code32_start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) A 32-bit flat-mode routine *jumped* to immediately after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) transition to protected mode, but before the kernel is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) uncompressed. No segments, except CS, are guaranteed to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) set up (current kernels do, but older ones do not); you should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) set them up to BOOT_DS (0x18) yourself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) After completing your hook, you should jump to the address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) that was in this field before your boot loader overwrote it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) (relocated, if appropriate.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 32-bit Boot Protocol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) ====================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) For machine with some new BIOS other than legacy BIOS, such as EFI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) LinuxBIOS, etc, and kexec, the 16-bit real mode setup code in kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) based on legacy BIOS can not be used, so a 32-bit boot protocol needs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) to be defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) In 32-bit boot protocol, the first step in loading a Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) should be to setup the boot parameters (struct boot_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) traditionally known as "zero page"). The memory for struct boot_params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) should be allocated and initialized to all zero. Then the setup header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) from offset 0x01f1 of kernel image on should be loaded into struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) boot_params and examined. The end of setup header can be calculated as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) follow::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 0x0202 + byte value at offset 0x0201
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) In addition to read/modify/write the setup header of the struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) boot_params as that of 16-bit boot protocol, the boot loader should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) also fill the additional fields of the struct boot_params as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) described in chapter :doc:`zero-page`.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) After setting up the struct boot_params, the boot loader can load the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 32/64-bit kernel in the same way as that of 16-bit boot protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) In 32-bit boot protocol, the kernel is started by jumping to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 32-bit kernel entry point, which is the start address of loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 32/64-bit kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) At entry, the CPU must be in 32-bit protected mode with paging
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) disabled; a GDT must be loaded with the descriptors for selectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) __BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) segment; __BOOT_CS must have execute/read permission, and __BOOT_DS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) must have read/write permission; CS must be __BOOT_CS and DS, ES, SS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) must be __BOOT_DS; interrupt must be disabled; %esi must hold the base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) address of the struct boot_params; %ebp, %edi and %ebx must be zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 64-bit Boot Protocol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) ====================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) For machine with 64bit cpus and 64bit kernel, we could use 64bit bootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) and we need a 64-bit boot protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) In 64-bit boot protocol, the first step in loading a Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) should be to setup the boot parameters (struct boot_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) traditionally known as "zero page"). The memory for struct boot_params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) could be allocated anywhere (even above 4G) and initialized to all zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) Then, the setup header at offset 0x01f1 of kernel image on should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) loaded into struct boot_params and examined. The end of setup header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) can be calculated as follows::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 0x0202 + byte value at offset 0x0201
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) In addition to read/modify/write the setup header of the struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) boot_params as that of 16-bit boot protocol, the boot loader should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) also fill the additional fields of the struct boot_params as described
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) in chapter :doc:`zero-page`.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) After setting up the struct boot_params, the boot loader can load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 64-bit kernel in the same way as that of 16-bit boot protocol, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) kernel could be loaded above 4G.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) In 64-bit boot protocol, the kernel is started by jumping to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 64-bit kernel entry point, which is the start address of loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 64-bit kernel plus 0x200.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) At entry, the CPU must be in 64-bit mode with paging enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) The range with setup_header.init_size from start address of loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) kernel and zero page and command line buffer get ident mapping;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) a GDT must be loaded with the descriptors for selectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) __BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) segment; __BOOT_CS must have execute/read permission, and __BOOT_DS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) must have read/write permission; CS must be __BOOT_CS and DS, ES, SS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) must be __BOOT_DS; interrupt must be disabled; %rsi must hold the base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) address of the struct boot_params.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) EFI Handover Protocol (deprecated)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) ==================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) This protocol allows boot loaders to defer initialisation to the EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) boot stub. The boot loader is required to load the kernel/initrd(s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) from the boot media and jump to the EFI handover protocol entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) which is hdr->handover_offset bytes from the beginning of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) startup_{32,64}.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) The boot loader MUST respect the kernel's PE/COFF metadata when it comes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) to section alignment, the memory footprint of the executable image beyond
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) the size of the file itself, and any other aspect of the PE/COFF header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) that may affect correct operation of the image as a PE/COFF binary in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) execution context provided by the EFI firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) The function prototype for the handover entry point looks like this::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) efi_main(void *handle, efi_system_table_t *table, struct boot_params *bp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 'handle' is the EFI image handle passed to the boot loader by the EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) firmware, 'table' is the EFI system table - these are the first two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) arguments of the "handoff state" as described in section 2.3 of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) UEFI specification. 'bp' is the boot loader-allocated boot params.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) The boot loader *must* fill out the following fields in bp::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) - hdr.cmd_line_ptr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) - hdr.ramdisk_image (if applicable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) - hdr.ramdisk_size (if applicable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) All other fields should be zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) NOTE: The EFI Handover Protocol is deprecated in favour of the ordinary PE/COFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) entry point, combined with the LINUX_EFI_INITRD_MEDIA_GUID based initrd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) loading protocol (refer to [0] for an example of the bootloader side of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) this), which removes the need for any knowledge on the part of the EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) bootloader regarding the internal representation of boot_params or any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) requirements/limitations regarding the placement of the command line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) and ramdisk in memory, or the placement of the kernel image itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) [0] https://github.com/u-boot/u-boot/commit/ec80b4735a593961fe701cc3a5d717d4739b0fd0