Autor Thema: Kernelinterner-Debugger  (Gelesen 4791 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #1 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

 

Einloggen