Hallo, ich bins mal wieder
Ich versuche Software-Multitasking zu implementieren. Auf Ring 0 klappt das auch schon super. Jetzt möchte ich das ganze noch zusätzlich für Ring 3 auf die Beine stellen. Ich orientiere mich dabei an diesem
Tutorial.
Was ändert sich für uns mit Ring-3-Tasks? An sich ist es nicht viel. Wie oben schon angemerkt, kommt zum bereits Bekannten nur noch ein Stackwechsel dazu.
Das heißt, es gibt jetzt 2 Stacks pro Task, User- und Kernelstack. Soweit, so gut.
Wenn der Prozessor bei einem Interrupt in Ring 3 ist, also einen Ringwechsel durchführen muss, sichert er esp und ss auf den Stack (wie es in struct cpu_state schon vorgesehen ist). Beim Zurückspringen aus dem Interrupt mittels iret stellt er diese Register auch wieder her.
Auf welchen Stack sichert er esp und ss? Wahrscheinlich ja auf den Kernelstack des alten Tasks.
Nachdem er die Register gesichert hat, lädt der Prozessor den Kernel-Stack (bestehend aus ss und esp). Diese beiden Werte kommen aus dem aktiven Task State Segment (TSS).
Jetzt lädt er also den Kernel Stack des nächsten Tasks aus der TSS. An dieser Stelle frage ich mich, wann tut er das? Beim Betreten oder beim Verlassen der ISR? Oder macht er das garnicht automatisch und ich muss das irgendwo tun?
Bei der Implementierung der TSS steht im Tutorial außerdem folgende Codezeile:
tss[1] = (uint32_t) (new_cpu + 1);
Dazu frage ich mich: Wieso wird der Zeiger um 1 erhöht?
Ich hoffe meine Fragen sind (irgendwo) nachvollziehbar.
lg
Developer30