Hallo, ich versuche schon seit Stunden meinen C Kernel zum laufen zu bringen.
Einen Bootloader habe ich schon gemacht, der in den ProtectMode schaltet, wenn ich aber dann in den Kernel springen will passiert garnichts.
Hier mal der Bootloader:
Der Kernel (*.c)
Linker-Script (*.ld)
Und so mach ich das ganze zu einer IMG-Datei.
nasm -f bin -o boot.bin boot.asm
gcc -ffreestanding -c -o kernel.o kernel.c
ld link.ld -o kernel.bin
copy /b boot.bin + kernel.bin os.img
Weiß jemand woran das liegt das der Kernel nicht geladen wird?
Hab schon viel rumprobiert, z.B. die Addresse dess Kernels,
hat alles nichts geholfen
.
Bitte um Hilfe!
Einen Bootloader habe ich schon gemacht, der in den ProtectMode schaltet, wenn ich aber dann in den Kernel springen will passiert garnichts.
Hier mal der Bootloader:
Code: [Auswählen]
[BITS 16]
org 0x7c00
%define STACKSEGMENT 0x9000 ; lineare Adresse des Stacks : 0x90000
%define STACKSIZE 0x200 ; Größe des Stacks : 512Byte
%define KERNELSEGMENT 0x10000 ; lineare Adresse des Kernels : 0x40000
jmp START
GDTR:
limit dw (GDT_END - GDT - 1)
base dd (0)
GDT:
NULL_DESCRIPTOR EQU $-GDT
dd 0
dd 0
CODE_DESCRIPTOR EQU $-GDT
dw 0ffffh
dw 0
db 0
db 09ah
db 0cfh
db 0
DATA_DESCRIPTOR EQU $-GDT
dw 0ffffh
dw 0
db 0
db 092h
db 0cfh
db 0
GDT_END:
START:
cli ; keine Interrupts
mov ax, STACKSEGMENT
mov ss, ax ; Stacksegment setzen
mov sp, STACKSIZE ; Größe des Stacks festlegen
xor ax, ax ; ax = 0
mov ds, ax ; Datensegment auf 0 setzen
sti
xor bx, bx ; Ziel-Offset : 0x0
mov ax, KERNELSEGMENT ; Ziel-Segment : 0x4000
mov es, ax
mov ah, 0x2 ; Funktion 0x2 : Sektor lesen
mov al, 1 ; Anzahl der Sektoren : 1
mov ch, 0 ; Track : 0
mov cl, 2 ; LSN : 2
mov dh, 0 ; Head : 0
mov dl, 0 ; Laufwerk : A
int 0x13 ; Interrupt : 0x13
cli ; keine Interrupts
mov ax, cs ; Code-Segment holen
mov ds, ax ; Daten-Segment gleichsetzen
xor eax, eax ; ax = 0
mov es, ax ; Extra-Segment auf Null setzen
mov si, GDT ; Quelle : GDT
xor di, di ; Ziel : 0x0000
mov cx, 6 ; 6 DoubleWords kopieren (ganze GDT)
rep movsd
lgdt [GDTR]
mov eax, cr0
or eax, 1 ; Bit0 setzen (PE-Bit enabled)
mov cr0, eax
db 0xea ; FAR-JUMP zum Codesegment
dw (PMODE)
dw 0x8
[BITS 32] ; 32 Bit-Code erstellen
PMODE:
xor eax, eax
mov eax, 2 ; Selektor für das Datensegment erstellen
shl eax, 3
mov ds, ax ; Daten-, Stack- und Extrasegment mit
mov ss, ax ; Datensegmentdeskriptor laden
mov es, ax
xor ax, ax
mov fs, ax ; fs und gs mit Nulldeskriptor laden
mov gs, ax
mov esp, 09000h ; Stack setzen
jmp 08h:010000h
stop:
jmp stop
times 512-($-$$)-2 db 0
dw 0x0AA55
Der Kernel (*.c)
Code: [Auswählen]
int begin()
{
char *Text = "Welcome to Protected Mode";
char *VideoMem = (char*)0xA8000;
while(*Text)
{
*VideoMem = *Text;
*VideoMem++;
*VideoMem = 7;
*VideoMem++;
*Text++;
}
return(0);
}
Linker-Script (*.ld)
Code: [Auswählen]
OUTPUT_FORMAT("binary")
INPUT("kernel.o")
ENTRY(_begin)
SECTIONS
{
.text 0x10000 :
{
*(.text)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
Und so mach ich das ganze zu einer IMG-Datei.
nasm -f bin -o boot.bin boot.asm
gcc -ffreestanding -c -o kernel.o kernel.c
ld link.ld -o kernel.bin
copy /b boot.bin + kernel.bin os.img
Weiß jemand woran das liegt das der Kernel nicht geladen wird?
Hab schon viel rumprobiert, z.B. die Addresse dess Kernels,
hat alles nichts geholfen
.Bitte um Hilfe!

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert
), aber:
.