| Zeile 202: | Zeile 202: | ||
=== Weitere Nachteile === | === Weitere Nachteile === | ||
| − | + | *Einige Exceptions legen zusätzlich einen Fehlercode auf den Stack, nachdem sie EIP auf den Stack gelegt haben. Dieser Fehlercode enthält weitere Informationen zur Ursache des Fehlers. Genaueres steht dazu im Intel Manual. | |
| − | * | ||
| − | |||
| − | Deswegen arbeiten wir im Folgenden an einer Generalisierung und Vereinfachung | + | *Um präemptives oder kooperatives Software-[[Multitasking]] zu implementieren, muss man den Stack Pointer wechseln. Zwar legt unsere Variante mit dem ''pusha'' einen Stack Pointer (_esp) auf den Stack, aber das ''popa'' ignoriert den immer. Dieser Stack Pointer zeigt übrigens auf den Kernel Stack, denn entweder wurde er aus dem TSS geladen, wenn der Interrupt im Ring 3 auftrat, oder wir haben uns die ganze Zeit schon im Kernel Mode (Ring 0) befunden. Der Stack Pointer, der zusätzlich auf den Stack gelegt wird, wenn ein Interrupt im Ring 3 aufgetreten ist (esp), nützt uns wenig. Wenn wir diesen austauschen, dann tauschen wir maximal die Stacks von zwei Tasks aus, aber dann ist es bereits zu spät für einen kompletten Kontextwechsel: Die General Purpose Register, sowie EIP und EFLAGS wurden noch vom alten Stack geladen. Das heißt wir müssen den Stack irgendwie anders wechseln. |
| + | |||
| + | Deswegen arbeiten wir im Folgenden an einer Generalisierung und Vereinfachung des gesamten Aufbaus unserer ISRs. | ||
== Allgemeiner Interruptstub == | == Allgemeiner Interruptstub == | ||