hey,
pass auf, probier einfach folgendes und versuch beim coden nachzuvollziehen, was genau passiert:
du hast einen bootloader, der den kernel lädt und dann in den pm springt. das sieht in etwa so aus:
;boot.asm
[BITS16]
org 0x7c00
start:
...; hier steht der code, der dir den kernel an eine bestimmte adresse lädt
...; du musst dabei darauf achten, dass du dir vorher überlegst, wohin du den kernel laden willst
...; sagen wir du hättest dir die lineare adresse 0x20000 ausgesucht
;
; so, jetzt steht der kernel bei 0x20000
; jetzt musst du in den pm schalten
;
lgdt ...
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 0x8 : pmode
;
; das müsstest du ja soweit implementiert haben
[BITS32]
pmode:
mov eax, 0x10
mov ds, eax
mov es, eax
mov ss, eax
mov gs, eax
mov fs, eax
mov esp, stack_size
; na das kennst ja alles
; soooo
; das tolle ist, dass du weißt, wo dein kernel liegt. du hast ihn ja nach 0x20000 geladen
; da springen wir nun hin...
jmp 0x8 : 0x20000
;
; fertig
jetzt brauchst du noch einen kernel...
// kernel.c
void main()
{
// welcome
for(;;);
}
jetzt noch etwas, das nicht unbedingt notwendig ist, aber manchmal ganz nützlich ist...
; asm32.asm
[BITS 32]
[global _stopsystem]
[extern _main]
_start:
call _main
_stopsystem:
cli
hlt
jetzt musst du nur noch gucken, wie das alles zusammen gehört.
also den bootlader assemblierst du ganz normal mit nasm:
nasm -f bin -o boot.bin boot.asm
boot.bin schreibst in sektor null...
asm32.asm musst du anders assemblieren:
nasm -f aout -o asm32.o asm32asm
jetzt hast du die erste objekt-datei asm32.o
den kernel kompilierst du so:
gcc -ffreestanding -c -o kernel.o kernel.c
jetzt hast du die zweite objekt-datei.
um alles zusammen zu linken, brauchst du noch eine sogenannte linker-file:
OUTPUT_FORMAT("binary")
INPUT(asm32.o kernel.o)
ENTRY(_start)
SECTIONS
{
.text 0x20000 : {
*(.text)
}
.data : {
*(.data)
}
.bss :
{
*(.bss)
}
}
die datei erklärt sich ja sogut wie von selbst... wenn nicht, fragen!
das ganze muss nur noch gelinkt werden:
ld -T link.ld -o kernel.bin
nach diesem befehl hast du eine datei namens kernel.bin, die der bootloader laden kann...
da du in der link.ld die reihenfolge INPUT(asm32.asm kernel.o) hast, ist der allererste befehl in kernel.bin "jmp _main"... dadurch ist sichergestellt, dass selbst wenn _main nicht ganz vorne anfängt, trotzdem der kernel-code aufgerufen wird.
gruß
Cheebi
ps: meld dich, wenns funktioniert... hab den code jetzt nicht getestet...