Autor Thema: Triple Fault nach laden eines Segementregisters  (Gelesen 7027 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 25. June 2012, 21:35 »
Hallo,
nachdem ich die GDT initialisiert habe lade ich die Segmentregister neu und es gibt einen Triple fault und ich verstehe nicht warum.
Hier mein Code
Code: (C) [Auswählen]
void setGDTEntry(int i, unsigned int base, unsigned int limit, char access, char flags)
{
gdt[i] = limit & 0xFFFF;
gdt[i] |= (base & 0xFFFFFF) << 16;
gdt[i] |= (access & 0xFF) << 40;
gdt[i] |= ((limit >> 16) & 0xF) << 48;
gdt[i] |= (flags & 0xF) << 52;
gdt[i] |= ((base >> 24) & 0xFF) << 56;
}

void GDTInit()
{
setGDTEntry(0, 0, 0, 0, 0); //NULL-Deskriptor
setGDTEntry(1, 0, 0xFFFFF, 0x9A, 0xC); //Codesegment, ausführ- und lesbar, 32-bit
setGDTEntry(2, 0, 0xFFFFF, 0x92, 0xC); //Datensegment, les- und schreibbar
setGDTEntry(3, 0, 0xFFFFF, 0x9A, 0xA); //Codesegment, ausführ- und lesbar, 64-bit

gdtr.limit = GDT_ENTRIES *8 -1;
gdtr.pointer = gdt;
asm("lgdt %0": :"m"(gdtr));
asm(
"mov $0x10,%ax;"
"mov %ax,%ds;"               //hier gibt es den Triple-Fault
"mov %ax,%es;"
"mov %ax,%ss;"
"mov %ax,%fs;"
"mov %ax,%gs;"
"ljmp $0x8,$.1;"
".1:"
);
}
Danke vielmals.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. June 2012, 22:40 »
Du rechnest auf 32-Bit-Integern (und auch das nur, weil du das Glück hast, dass für chars die Integer Promotion greift). Wenn du die um mehr als 32 Bit shiftest, kommt Müll raus. Die einfachste Lösung ist, deine Bitmasken z.B. zu 0xFFLL zu ändern, dann wird die Berechnung in long long durchgeführt. Oder du kannst natürlich auch einfach alle Variablen vor der Benutzung entsprechend casten.

Wenn du die Compilerwarnungen ein bisschen aufdrehst, dann hättest du dafür übrigens eine bekommen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 26. June 2012, 00:42 »
Ich habe eine Bekommen, aber ich habe mir dabei nichts weiter gedacht. Danke für deine Hilfe. Jetzt funktioniert es.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

 

Einloggen