Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: OsDevNewbie am 25. June 2012, 21:35

Titel: Triple Fault nach laden eines Segementregisters
Beitrag von: OsDevNewbie 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.
Titel: Re: Triple Fault nach laden eines Segementregisters
Beitrag von: kevin 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.
Titel: Re: Triple Fault nach laden eines Segementregisters
Beitrag von: OsDevNewbie 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.