title: Multiboot specification
text: # Multiboot specification
  
  The Multiboot specification is an open standard describing how a boot loader can load an x86 operating system kernel. The specification allows any compliant boot-loader implementation to boot any compliant operating-system kernel. Thus, it allows different operating systems and boot loaders to work together and interoperate, without the need for operating system–specific boot loaders. As a result, it also allows easier coexistence of different operating systems on a single computer, which is also known as multi-booting.
  
  The specification was originally created in 1995 and developed by the Free Software Foundation. GNU Hurd, VMware ESXi, Xen, and L4 microkernels all need to be booted using this method. GNU GRUB is the reference implementation used in the GNU operating system and other operating systems. As of July 2019, the latest version of Multiboot specification is 0.6.96, defined in 2009. An incompatible second iteration with UEFI support, Multiboot2 specification, was later introduced. As of April 2019, the latest version of Multiboot2 is 2.0, defined in 2016.
  
  ## Technical overview
  
  While Multiboot defines a header as a struct, which needs to be present in the image file as a whole, in Multiboot2, fields or group of fields have a type tag, which allows them to be omitted from the Multiboot2 header.
  
  Within the OS image file, the header must be in the first 8192 $(2^{13})$ bytes for Multiboot and 32768 $(2^{15})$ bytes for Multiboot2. The loader searches for a magic number to find the header, which is 0x1BADB002 for Multiboot and 0xE85250D6 for Multiboot2.
  
  In the header, entry_addr points to the code where control is handed over to the OS. This allows different executable file formats (see Comparison of executable file formats). If the OS kernel is an ELF file (Executable and Linkable Format), which it is for the Linux kernel, this can be omitted for Multiboot2. The ELF format is very common in the open source world and has its own field (e_entry) containing the entry point.
  
  Before jumping to the OS entry point, the boot loader must provide a boot information structure to tell the OS how it left the system; for Multiboot, this is a struct, and for Multiboot2, every field (group) has a type tag and a size.
  
  