Hi
was mich wundert, was macht dein kernel, das er einen eigenen stack braucht? wieso kehrst du mittels eines interrupts aus deinem program zurück? ist es damit beendet oder läuft es noch weiter?
Ich nehm mal an, das hier ggf schon grundlegende probleme existieren. Das einrichten einer neuen Task geschieht bereits von einer task aus. ( auch wenn es die bisher einzigste deines systems ist ) Diese task richtet eine neue Verwaltungsstrucktur für eine Task ein, initallisiert die dort eingetragenen register, stackpointer, .... anschliesend, wird diese strucktur in die zentralle verwaltungstruktur eingetragen. Der sceduler arbeitet auf der Zentrallen verwaltungsstruktur. er kann eigentlich erstmal ohne eigene n registersatz und stack aus. Seine einzige aufgabe ist es, die registerwerte der aktuellen task in der dazugehöhrenden struktur zu sichern, die nächste task zu suchen, die register anhand der Verwaltungsstruktur zu rekonstruieren und sich anschliessend selbst zu beenden. damit wird die neue task gestartet/fortgesetzt und zwar genau an der stelle, wo sie unterbrochen wurde.
was du dazu brauchst
1. eine verwaltungsstrucktur für deine tasks. in der registerwerte, Prioritäten, stackpointer, taskstatus, ... gesichert werden
2. eine funktion, die die in einer Verwaltungsstruktur hinterlegten registerwerte, stackpointer wieder herstellt. anschliesend die task wieder ausführt.
3. eine funktion die die register in einer verwaltunsstrucktur sichert
4. eine interupthandler / sceduler, der ohne den stack zu manipulieren, die funktion 3 aufruft, die nächste taks sucht, und funktion 2 aufruft.
eine möglichkeit die mir einfällt, währe, den stack zu missbrauchen, wen der sceduler zuschlägt, werden ja bektanlicherweise IP, CS und PSW auf dem stack gesichert. man könnte jetzt die restlichen register eins nach dem anderen mit auf dem stack sichern, bis alle register gesichert sind. ( den SP muss man nicht sichern, da wir mit dem ja was anderes vorhaben ) danach kann man dann den SP in der dazugehörigen struktur aktuallisieren.
jetzt kann man sich einen neuen sp besorgen, fals man irgendwelchen hässlichen komlexen sachen vorhat, oder versuchen ohne stack auszukommen. der nächste schritt ist dann die nächste task struktur zu ermitteln. Wie ist mal egal, hat man sie gefunden, wird der stack pointer der dazugehörigen strucktur geladen, anschliessend die register in umgekehrter reihenfolge vom stack geholt ( wir erinnern und, wie haben sie ja irgendwann mal so abgelegt ) und zum schluss verbleiben nur noch IP, CS und PSW auf dem stack, die dann mit einem RET / IRET vom stack verschwinden und gleichzeitig die task wieder zu leben erwecken.
beim erzeugen einer neuen task muss man
1. IP, CS und PSW auf dem stack vorinitallisieren, so das sie bei einem ret auch richtig geladen werden, um den gewünschten code auszuführen
2. die restlichen register müssen auch auf dem stack hintelegt werden.
solltest du im sceduler einen stack brauchen, ist darauf zu achten, das dieser sich nicht ins unendliche aufbaut. ggf kann es da zu etwas verwirrenden verhalten kommen. aber das dann bei gelegenheit bei entsprechenden problemen.
gruss
(ps ich hab zwar was im script gefunden, ich bin aber zu faul 2 seiten asm code abzutippen, und 4 seiten c code )