Peta Memori Detail Boot Sequence Ragam OS

Urutan Booting tiap-tiap Sistem Operasi berbeda-beda. Dan pengetahuan ini adalah hal yang penting bagi seorang low level programmer, terutama jika dia hendak mengembangkan Sistem Operasinya sendiri.

Berikut diagram peta memori detail untuk masing-masing boot sequence:

1. DOS (MS-DOS/FreeDOS) Memory Map

MEMORY MAP DOS (Total: 640KB Conventional Memory)

0x00000 ┌─────────────────────────────────────────┐
│ Interrupt Vector Table (IVT) - 1KB │
0x00400 ├─────────────────────────────────────────┤
│ BIOS Data Area (BDA) - 256 bytes │
0x00500 ├─────────────────────────────────────────┤
│ DOS Communication Area │
0x00600 ├─────────────────────────────────────────┤
│ IO.SYS - BIOS Extension │
│ (MSDOS.SYS setelah IO.SYS) │
0x07000 ├─────────────────────────────────────────┤
│ DOS Kernel & Buffers │
│ Disk buffers, file tables, etc. │
0x0A000 ├─────────────────────────────────────────┤
│ VIDEO MEMORY (Text Mode) │
│ 0xB8000 - Color Text Buffer │
│ (DOS selalu pakai BIOS int 0x10) │
0x0C000 ├─────────────────────────────────────────┤
│ VIDEO ROM & HARDWARE ROMS │
0x0F000 ├─────────────────────────────────────────┤
│ SYSTEM BIOS ROM (64KB) │
0x10000 └─────────────────────────────────────────┘
│ EXTENDED MEMORY (>1MB) │
│ (DOS tidak bisa akses tanpa HIMEM.SYS) │
└─────────────────────────────────────────┘

CHARACTERISTIC:
- SELALU di Real Mode (16-bit)
- SELALU pakai BIOS interrupts untuk I/O
- Memory terfragmentasi untuk TSRs (Terminate Stay Resident)
- COMMAND.COM load di high memory area (HMA) jika ada

2. Windows NT (XP/7/10) Memory Map

BOOT PROCESS MEMORY MAP WINDOWS NT:

PHASE 1: BOOTMGR (Real Mode/Protected Mode Hybrid)
0x00000 ┌─────────────────────────────────────────┐
│ IVT, BDA (masih BIOS) │
0x07C00 ├─────────────────────────────────────────┤ ← MBR
0x07E00 ├─────────────────────────────────────────┤ ← VBR
0x08000 ├─────────────────────────────────────────┤ ← BOOTMGR Stage 1
│ (masih 16-bit, pakai BIOS disk read) │
0x10000 ├─────────────────────────────────────────┤ ← BOOTMGR Stage 2
│ (32-bit, filesystem driver minimal) │
│ Baca BCD, cari winload.exe │
0x20000 ├─────────────────────────────────────────┤
│ BOOTMGR Code & Data │
0x7C000 └─────────────────────────────────────────┘ ← Upper bound sebelum winload

PHASE 2: WINLOAD.EXE (Protected Mode)
0x00100000 (1MB) ┌────────────────────────────────┐
│ WINLOAD.EXE loaded here │
│ (sudah 32/64-bit PE executable)│
│ Initialize kernel env │
│ Load HAL, drivers, registry │
│ Parse ACPI tables │
0x00200000 ├────────────────────────────────┤
│ ntoskrnl.exe buffer │
│ (kernel image compressed) │
0x00800000 ├────────────────────────────────┤ ← WINLOAD Setup Memory
│ Page tables, GDT, IDT │
│ Boot driver stack │
0x01000000 └────────────────────────────────┘

PHASE 3: NTOSKRNL.EXE (Kernel)
0x80000000 (2GB) ┌────────────────────────────────┐ ← KERNEL SPACE (Ring 0)
│ ntoskrnl.exe │
│ Executive subsystems │
│ Memory Manager │
│ Process Manager │
│ I/O Manager │
0xC0000000 ├────────────────────────────────┤ ← SESSION SPACE
│ Win32k.sys (GUI subsystem) │
│ Video drivers │
0xFFC00000 ├────────────────────────────────┤ ← HYPERSPACE
│ Page tables, working sets │
0xFFFFFFFF └────────────────────────────────┘

CHARACTERISTIC:
- Hybrid boot: BIOS → Protected Mode transition
- winload.exe adalah titik transisi terakhir pakai BIOS
- Kernel punya driver model sendiri (WDM)

3. Linux (GRUB Legacy) Memory Map

BOOT PROCESS MEMORY MAP LINUX (GRUB Legacy):

PHASE 1: GRUB Stage 1 (MBR - 512 bytes)
0x00000 ┌─────────────────────────────────────────┐
│ IVT, BDA │
0x07C00 ├─────────────────────────────────────────┤ ← MBR loaded here by BIOS
│ GRUB Stage 1 (446 bytes code) │
│ Load Stage 1.5 dari sector 2-18 │
0x07E00 └─────────────────────────────────────────┘

PHASE 2: GRUB Stage 1.5 (Disk ~8KB)
0x08000 ┌─────────────────────────────────────────┐ ← Stage 1.5 loaded here
│ Filesystem driver minimal │
│ (ext2, FAT, etc.) untuk baca Stage 2 │
0x0A000 └─────────────────────────────────────────┘

PHASE 3: GRUB Stage 2 (~64KB)
0x0A000 ┌─────────────────────────────────────────┐ ← Stage 2 loaded here
│ GRUB main code │
│ Menu interface, config parser │
│ Kernel loading logic │
0x20000 ├─────────────────────────────────────────┤
│ Kernel image buffer │
│ initrd/initramfs buffer │
0x90000 └─────────────────────────────────────────┘ ← Max address GRUB gunakan

PHASE 4: Linux Kernel Setup Code
0x10000 (64KB) ┌──────────────────────────────────┐ ← Protected Mode Kernel
│ Linux Kernel Setup Code │
│ (arch/x86/boot/ code) │
│ Decompress kernel │
│ Parse memory map (e820) │
│ Setup page tables │
0x20000 ├──────────────────────────────────┤
│ Decompressed kernel image │
│ (vmlinuz bzImage format) │
0x100000 (1MB) ├──────────────────────────────────┤ ← Kernel proper mulai
│ Kernel text + data │
│ _text = 0x100000 │
│ Kernel drivers, subsystems │
0xC0000000 (3GB)├──────────────────────────────────┤ ← PAGE_OFFSET (x86)
│ Kernel virtual memory space │
│ vmalloc area, modules │
0xFFFFFFFF └──────────────────────────────────┘

CHARACTERISTIC:
- GRUB handle semua BIOS access untuk kernel
- Kernel punya setup code khusus untuk BIOS handoff
- Memory map dari BIOS (int 0x15, eax=0xE820) passed ke kernel

4. MINIX/OSDev Simple Kernel Memory Map

SIMPLE OS DEVELOPMENT MEMORY MAP:

BOOT SECTOR PHASE (512 bytes - Real Mode)
0x00000 ┌─────────────────────────────────────────┐
│ IVT, BDA │
0x07C00 ├─────────────────────────────────────────┤ ← Boot Sector loaded here
│ Your boot.asm code (512 bytes) │
│ Loads kernel.bin to 0x1000 │
0x07E00 ├─────────────────────────────────────────┤ ← Free after boot
0x01000 └─────────────────────────────────────────┘

KERNEL LOAD PHASE (Protected Mode)
0x01000 (4KB) ┌───────────────────────────────────┐ ← Kernel loaded here
│ Kernel Entry (assembly stub) │
│ Setup stack, call kernel_main() │
0x02000 ├───────────────────────────────────┤
│ Kernel C Code │
│ Text/Code section │
0x10000 (64KB) ├───────────────────────────────────┤
│ Kernel Data + BSS │
│ Global variables, heap start │
0x20000 ├───────────────────────────────────┤ ← End of initial kernel

SYSTEM MEMORY MAP (After Kernel Initialize)
0x00000000 ┌──────────────────────────────────────┐
│ NULL pointer guard page │
0x00001000 ├──────────────────────────────────────┤ ← Kernel text/code
│ Kernel executable │
│ (0x10000 if position-dependent) │
0x00100000 (1MB) ├────────────────────────────────┤ ← Free Physical Memory
│ Page Frame Allocator bitmap │
│ Heap area (kmalloc) │
│ Process memory regions │
0xC0000000 (3GB) ├────────────────────────────────┤ ← Kernel Virtual Space
│ Kernel stack per process │
│ Kernel data structures │
│ Memory-mapped devices │
0xFFFFFFFF └────────────────────────────────┘

CHARACTERISTIC:
- Simple linear loading (boot sector → kernel)
- Minimal transition code
- Often position-dependent (linked to specific address)
- Manual memory management

Perbandingan Memory Usage Pattern:

OSBootloader MemoryKernel Load AddressSpecial Characteristics
DOS0x07C00-0x08000IO.SYS at ~0x00600Everything < 1MB, TSRs fragment memory
Windows0x07C00-0x7C000ntoskrnl at ~0x80000000High kernel address, winload at 1MB
Linux0x07C00-0x90000Kernel at 0x100000 (1MB)GRUB uses < 1MB, kernel > 1MB
MINIX/OSDev0x07C00-0x07E00Kernel at 0x1000 (4KB)Simple, often position-dependent

Key Insights:

  1. DOS: Everything crammed below 640KB, heavy BIOS dependency
  2. Windows: Complex staged loading, winload.exe as transition point
  3. Linux: GRUB as sophisticated bootloader, kernel at fixed 1MB address
  4. MINIX/OSDev: Simplest possible, direct boot sector to kernel