Hallo,
da ich es als Hilfreich ansehe, einen Debugger zu haben, auch ausserhalb eines Debuggers (z.B. bei einem echten PC), habe ich mich entschlossen einen Debugger zu schreiben, der den Interruptvektor 2 benutzt. Momentan sieht der Code so aus:
ihs_t *exception_Debug(ihs_t *ihs)
{
#ifdef DEBUGMODE
static uint64_t Stack[1000];
static ihs_t State;
static ihs_t *oldState;
if(Debugged == false) //Wenn noch nicht debugged wurde
{
//vorübergehend einen neuen Zustand herstellen
ihs_t new_state = {
.cs = 0x8, //Kernelspace
.ss = 0x10,
.es = 0x10,
.ds = 0x10,
.gs = 0x10,
.fs = 0x10,
.rdi = ihs, //Als Parameter die Adresse zum Zustand des Programms geben
.rip = (uint64_t)Debug_Main, //Einsprungspunkt der Debugfunktion
.rsp = &Stack[1000],
//IRQs einschalten (IF = 1)
.rflags = 0x202
};
memmove(&State, &new_state, sizeof(ihs_t));
oldState = ihs;
return &State;
}
else //Wenn schon Debugged wurde wieder normalen Zustand herstellen
{
if(ihs->rax == DEBUG_SINGLESTEP)
oldState->rflags |= 0x100;
return oldState;
}
#endif
}
Und der Debugger selber:
#ifdef DEBUGMODE
void Debug_Init()
{
Debugged = false;
}
void Debug_Main(ihs_t *ihs)
{
static char lastInput[50];
static char buffer[50];
uint64_t *value;
//Debugconsole
setColor(BG_GREEN | CL_WHITE);
printf("Debugconsole\n");
setColor(BG_BLACK | CL_WHITE);
traceRegisters(ihs);
printf("RFLAGS: 0x");
IntToHex(ihs->rflags, buffer);
printf("\n");
printf(itoa(ihs->cs, buffer));
printf(":");
IntToHex(ihs->rip, buffer);
printf(buffer);
printf(": 0x");
value = ihs->rip;
IntToHex(*value, buffer);
printf(buffer);
printf("\n");
//asm volatile("sti");
gets(buffer);
if(strcmp(buffer, "s"))
return DEBUG_SINGLESTEP;
}
#endif
Bis zum ersten Befehl nach dem iret des Debug-Interrupts funktioniert alles einwandfrei. Der nächste Befehl, der ausgeführt werden sollte ist ein "push %rbp", da es ein Funktionsaufruf ist und der Compiler automatisch den Stackframe anlegt. Nur beim Ausführen des Befehls entsteht ein Double Fault!!!? Wieso gibt es dort einen Double Fault? Ich dachte der entsteht nur bei einem Fehler beim Aufruf eines anderen Exception-Handlers? Aber laut Bochs entsteht der Double Fault sofort nach dem push-Befehl, also es wird vorher nicht der General Protection oder irgendeine andere Exception aufgerufen.
Ich hoffe ihr könnt mir helfen.