As per the Linux kernel documentation https://www.kernel.org/doc/Documentation/x86/boot.txt, there is a kernel real mode code from X+10000 to X+08000. There are two question I have;

For a modern bzImage kernel with boot protocol version >= 2.02, a
memory layout like the following is suggested:

    ~                        ~
        |  Protected-mode kernel |
100000  +------------------------+
    |  I/O memory hole   |
0A0000  +------------------------+
    |  Reserved for BIOS     |  Leave as much as possible unused
    ~                        ~
    |  Command line      |  (Can also be below the X+10000 mark)
X+10000 +------------------------+
    |  Stack/heap        |  For use by the kernel real-mode code.
X+08000 +------------------------+  
    |  Kernel setup      |  The kernel real-mode code.
    |  Kernel boot sector    |  The kernel legacy boot sector.
X       +------------------------+
    |  Boot loader       |  <- Boot sector entry point 0000:7C00
001000  +------------------------+
    |  Reserved for MBR/BIOS |
000800  +------------------------+
    |  Typically used by MBR |
000600  +------------------------+ 
    |  BIOS use only     |
000000  +------------------------+

1.Is the real mode code is part of GRUB or it is part of bzImage. 2.If the real mode code is in between X+10000 to X+08000 where is the physical location of the long mode/64 bit mode kernel code?

  • Note that the real mode code is unused if the machine is booted with UEFI firmware (unless in BIOS compatibility mode). This is a quite common scenario in 2020. Jul 22, 2020 at 10:14

1 Answer 1


(I’ll refer to the latest version of the boot protocol documentation, the document you looked at is old.)

The real-mode kernel boot sector and setup code are part of the kernel; see section 1.2. They live between X and X+0x08000.

The protected-mode kernel is loaded at 0x100000, it’s the first item in the table above.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .