Hi,
seit letzten Mittwoch hab auch ich vor ein kleines OS zu proggen.
Ich hab mich durch die Tutorials von LowLevel (btw. nette Seite!) durchgewühlt und bin jetzt bei der Global Deskriptor Table hängen geblieben.
Undzwar habe ich folgenden Code:
(alternativer Link)
Der Kernel (naja ist mir etwas peinlich das schon Kernel zu nennen
) wird von GRUB geladen und ruft diese load_gdt-funktion auf, die eine Standard-GDT laden soll. (Danach ruft er den C-Kernel auf, der in einer anderen Datei liegt, für mein Problem aber unwichtig ist).
Wenn ich den Kernel allerdings wie gewohnt in ein Image schreibe und mit qemu öffne, stürtzt er mir ab und gibt mir einen Triple Fault (was üblich sein soll, wenn was an der GDT faul ist). Ich bin mir ziemlich sicher, dass es am GDT-Teil liegt, da der Kernel ohne die GDT einwandfrei lief.
Die Ausgabe von qemu ist:
Ich benutzte Ubuntu 8.04, den gcc, nasm, und als linker ld.
Könnt ihr mir weiterhelfen?
Danke im Voraus
seit letzten Mittwoch hab auch ich vor ein kleines OS zu proggen.
Ich hab mich durch die Tutorials von LowLevel (btw. nette Seite!) durchgewühlt und bin jetzt bei der Global Deskriptor Table hängen geblieben.
Undzwar habe ich folgenden Code:
(alternativer Link)
Code: [Auswählen]
global loader ; loader für Linker sichtbar machen
extern main ; main-Funktion des C-Kernels
FLAGS equ 0
MAGIC equ 0x1BADB002 ; Magicnumber - Erkennungsmerkmal für Grub
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
section .text
align 4
align 4
MultiBootHeader:
dd MAGIC ; Magic number
dd FLAGS ; Flags
dd CHECKSUM ; Checksum
loader:
mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren
push eax ; Multiboot Magicnumber auf den Stack legen
push ebx ; Adresse der Multiboot-Structure auf den Stack legen
cli
call load_gdt
call main ; main-Funktion des C-Kernels aufrufen
cli ; falls der Kernel bis hier her kommt, CPU anhalten
hlt
load_gdt:
lgdt [gdtable] ; GDT laden
mov eax, cs ; Daten-, Stack und Extrasegment mit Datensegmentdesktriptor laden
shl eax, 4
add eax, gdt
mov ds, ax
mov ss, ax
mov es, ax
mov eax, 0 ; FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;; == GDT == ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
gdtable: ; Deskriptortabelle
dw gdt_end-gdt-1 ; Limit
dd gdt ; Basis
gdt:
Null_Desc:
dd 0 ; Nulldeskriptor, bestehend aus Nullen
dd 0 ; Das gleiche. Insgesamt 8 Byte
Code_Desc: ; Code Deskriptor, erstreckt sich über den ganzen Speicher
dw 0xFFFF ; Segmentgrösse: 0xFFFFF (zusammen mit dem zweitletzten Byte)
dw 0 ; Segmentbasisadresse
db 0
db 0x9A
db 0xCF
db 0
Data_Desc: ; Daten Deskriptor, entspricht in etwa dem Code Deskriptor
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt_end: ; GDT End
Der Kernel (naja ist mir etwas peinlich das schon Kernel zu nennen
) wird von GRUB geladen und ruft diese load_gdt-funktion auf, die eine Standard-GDT laden soll. (Danach ruft er den C-Kernel auf, der in einer anderen Datei liegt, für mein Problem aber unwichtig ist). Wenn ich den Kernel allerdings wie gewohnt in ein Image schreibe und mit qemu öffne, stürtzt er mir ab und gibt mir einen Triple Fault (was üblich sein soll, wenn was an der GDT faul ist). Ich bin mir ziemlich sicher, dass es am GDT-Teil liegt, da der Kernel ohne die GDT einwandfrei lief.
Die Ausgabe von qemu ist:
Code: [Auswählen]
EAX=00100316 EBX=0002d8e4 ECX=00008c79 EDX=00000001
ESI=00054527 EDI=00054528 EBP=00067eac ESP=001ffff4
EIP=00100283 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300
CS =0008 00000000 ffffffff 00cf9a00
SS =0010 00000000 ffffffff 00cf9300
DS =0316 f053f000 0000ff53 f000ff53
FS =0010 00000000 ffffffff 00cf9300
GS =0010 00000000 ffffffff 00cf9300
LDT=0000 00000000 0000ffff 00008000
TR =0000 00000000 0000ffff 00008000
GDT= 00100296 00000017
IDT= 00000000 000003ff
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
CCS=00100296 CCD=00100316 CCO=ADDL
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
Aborted
Ich benutzte Ubuntu 8.04, den gcc, nasm, und als linker ld.
Könnt ihr mir weiterhelfen?
Danke im Voraus


Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
