Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: OsDevNewbie am 16. March 2013, 21:40

Titel: Kernelinterner-Debugger
Beitrag von: OsDevNewbie am 16. March 2013, 21:40
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.
Titel: Re: Kernelinterner-Debugger
Beitrag von: OsDevNewbie am 18. April 2014, 18:55
Hallo,
mein Kernelinterner Debugger funktioniert jetzt. Jetzt benötige ich nur noch einen Disassembler.

Kennt vielleicht einer einen, bei dem man einfach eine Funktion aufrufen muss und die Addresse zum Code übergeben muss und dann ein String zurück kommt?

Ich wünsche euch noch schöne Ostern.