Bindeglied in Boot-Prozess
Basic Input Output System
Power On Self Test
Master Boot Record
0xAA55
0x7C00
0x7C00-0x7E00
0x7E00-0xFC00
(~32KiB)64bit | 32bit | 16bit | 8bit-h | 8bit-l | Verwendung |
---|---|---|---|---|---|
rax | eax | ax | ah | al | Accumulator |
rbx | ebx | bx | bh | bl | Base |
rcx | ecx | cx | ch | cl | Counter |
rdx | edx | dx | dh | dl | Data |
rbp | ebp | bp | / | / | Base pointer |
rsp | esp | sp | / | / | Stack pointer |
rip | eip | ip | / | / | Instruction pointer |
__asm__
,
*(u8*)0x7E00
), kein Interpreter
org 0x7C00
bits 16
mbr:
; Register leeren (manche BIOS sind komisch)
xor bx, bx
mov ds, bx
mov es, bx
mov ss, bx
; Manche Register sind wichtig (z.B. dl mit boot disk)
mov sp, 0x7C00 ; Stack: 0x7C00 -> wächst nach unten
; Text mode VGA mit BIOS interrupts leeren
mov ax, SCREEN_CLEAR
int SCREEN_INT
call disk_support ; Ist disk unterstützt?
jmp load_stage ; 2. Stage laden und ausführen
bits 16
load_stage:
mov bx, loader
mov [dap.dest], bx
call disk_read ; Nutzt dap, dl und BIOS INTs
lgdt [gdt] ; Lade GDT
; Protected mode (32-Bit)
mov eax, cr0
or ax, 1 ; PE (Protection Enable) Bit
mov cr0, eax
; 0x08 GDT offset -> 1. Eintrag -> Code segment (cs)
jmp 0x08:protected
bits 32
protected:
; Segment register auf 2. GDT Eintrag (non-executable)
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
push dx ; Disk (in dl) zu kernel pushen
call loader ; Zweite Stage!
[...]
dw 0xAA55 ; MBR magic
loader: incbin "build/loader.bin" ; 2. Stage (C)
Bilder
Informationen (aufgerufen 13.07.2021)