1
Lowlevel-Coding / Re: Fehler bei GDT: Triple fault
« am: 03. October 2008, 17:02 »
Der Triple Fault wird bei der Ausführung das lgdt-Befehls gemeldet. Ich bin mir aber zu 99% sicher, dass der Fehler nicht im Assembler-Part liegt.
Die GDT-Einträge und der Zeiger sind bei mir Klassenelemente, aber das sollte keine Rolle spielen, da sie ja trotzdem als zusammenhängende Speicherbereiche stehen.
Die Funktion, die einen GDT-Eintrag setzt, sieht folgendermaßen aus:
Der Konstruktor der Klasse:
Die GDT-Einträge und der Zeiger sind bei mir Klassenelemente, aber das sollte keine Rolle spielen, da sie ja trotzdem als zusammenhängende Speicherbereiche stehen.
Die Funktion, die einen GDT-Eintrag setzt, sieht folgendermaßen aus:
Code: [Auswählen]
inline void GDT::set_entry(byte numb,u_dword base,u_dword size,byte access,byte granularity)
{
//move bits...
this->entries[numb].base_1 = (base & 0xFFFF);
this->entries[numb].base_2 = (base >> 16) & 0xFF;
this->entries[numb].base_3 = (base >> 24) & 0xFF;
this->entries[numb].size_1 = (size & 0xFFFF);
this->entries[numb].size_2 = (size >> 16) & 0x0F;
this->entries[numb].size_2 |= granularity & 0xF0;
this->entries[numb].access = access;
return;
}
Der Setup-Code ist der hier:Code: [Auswählen]
void GDT::init(void)
{
this->set_entry(0,0,0,0,0);//Null entry
this->set_entry(1,0,0xFFFFFFFF,0x9A,0xCF);//kernel code segment
this->set_entry(2,0,0xFFFFFFFF,0x92,0xCF);//kernel data segment
this->set_entry(3,0,0xFFFFFFFF,0xFA,0xCF);//user code segment
this->set_entry(4,0,0xFFFFFFFF,0xF2,0xCF);//user data segment
return;
}
Der Konstruktor der Klasse:
Code: [Auswählen]
GDT::GDT(void)
{
//set pointer
this->pointer.limit = (sizeof(gdt_entry_t) * 5) - 1;
this->pointer.base = (u_dword)&entries;
this->init();
setup_gdt((u_dword)&this->pointer);
}