The loader is a multiboot compliant binary that forms the initial boot code which is loaded by GRUB on startup.
The loader binary is loaded to
0x00100000. It itself reserves some memory (in its BSS) that
is used as its own stack.
At first, the logger (and if possible the COM port serial logger) are initialized. This provides basic output for informative and debug messages.
A basic GDT is set up which contains only kernel segment & data descriptors. Next, space for the physical memory bitmap is allocated and a
g_bitmap_page_allocatoris initialized writing to this area. The GRUB memory map is now interpreted and all free physical pages are marked in the bitmap.
A page directory is allocated. The directory maps recursively. The memory from
0x00000000to the end of all memory used by the loader is identity-mapped. The remaining multiboot-modules get relocated so they are mapped after the end of the loader binary. Then, paging is enabled.
The kernel itself is a simple ELF32 binary that has
0xC0000000as the start address. The loader searches for a module at
"/boot/kernel"and loads it into memory. After loading the kernel, the rest of the page tables in the kernel area are pre-allocated and 0’ed. A initialization stack is allocated after the kernel image, and after the stack the kernel heap is allocated with an initial size of 16MiB.
Enter kernel main
The loader finally switches to the prepared kernel stack and enters the kernels main entry function
When the kernel is entered, the memory in the prepared page directory has the following layout.