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
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.