Hallo liebe Kollegen,
ich habe momentan Probleme mit meinem Multitasking. Irgendwie werden Daten auf dem Stack überschrieben. Ich programmiere meinen Kernel für den Long Mode (64-Bit Mode). Ich habe, um mein Multitaskingsystem zu testen zwei Tasks erstellt, die einfach Sachen ausgeben mit denen man identifieren kann, welcher Task gerade etwas ausgibt. Zuerst aber gab nachdem der zweite Task an der Reihe war, der erste nie mehr etwas aus, obwohl er auch an die Reihe kam. Ich dachte vielleicht ist etwas falsch an der Sleep-Funkion, die ich in beiden Tasks verwendete. Deswegen änderte ich die Ausgabe in "A" bei Task A und "B" bei Task B. Jetzt kommt aber ein Page Fault, wenn Task A wieder an der Reihe ist, d.h. jeder Task kommt einmal an die Reihe und danach krachts.
Nach einigem Debuggen bin ich darauf gestossen, dass beim Laden einer lokalen Variablen vom Stack, plötzlich der Wert eines Segementregisters auftaucht und dieser dann als Addresse verwendet wird (0x10).
Mir ist dann aufgefallen, dass der Compiler (gcc) zwar bei jeder Funktion einen Stackframe anlegt und zwar wie folgt:
push %rbp
mov %rsp,%rbp
Folgender Code wird aber nur hinzugefügt, wenn innerhalb der Funktion eine andere Funktion aufgerufen wird:
sub $Wert,%rsp
Und deshalb frage ich mich, was passiert, wenn eine Funktion durch einen Interrupt abgebrochen wird, bei dem der Compiler vom Stackpointer nichts abzieht? Denn eigentlich müsste doch dann die CPU und der Interrupthandler die lokalen Daten der Funktion überschreibt. Ist das so oder ist das nur eine falsche Überlegung von mir?
Und wenn das stimmt, wie kann man sowas verhindern?
Danke.