| Zeile 216: | Zeile 216: | ||
Unser Ansatz besteht dabei aus folgenden Änderungen: | Unser Ansatz besteht dabei aus folgenden Änderungen: | ||
* Für Interrupts, die keinen Fehlercode auf den Stack legen, legen wir am Anfang der ISR, noch vor den anderen ''push''s einfach eine 0 auf den Stack. Damit erreichen wir, dass der Stack für alle Interrupts gleich aussieht. | * Für Interrupts, die keinen Fehlercode auf den Stack legen, legen wir am Anfang der ISR, noch vor den anderen ''push''s einfach eine 0 auf den Stack. Damit erreichen wir, dass der Stack für alle Interrupts gleich aussieht. | ||
| − | * Ein kurzer (3- bis 4-zeiliger) Interrupt Stub, der die Nummer des Interrupts auf den Stack legt | + | * Ein kurzer (3- bis 4-zeiliger) Interrupt Stub, der die Nummer des Interrupts auf den Stack legt und dann zum gemeinsamen Code springt: |
<asm>exception_0: | <asm>exception_0: | ||
push dword 0 ; Der Ersatz für den Fehlercode | push dword 0 ; Der Ersatz für den Fehlercode | ||
| Zeile 369: | Zeile 369: | ||
struct stack_frame * sf = (struct stack_frame *)esp; | struct stack_frame * sf = (struct stack_frame *)esp; | ||
| − | /* | + | /* Hier ESP verändern. Der ganze Apparat sollte über mehrere |
| + | Funktionen verteilt werden, aber könnte zum Beispiel so aussehen: */ | ||
if (sf->interrupt >= 0 && sf->interrupt <= 0x1f) { | if (sf->interrupt >= 0 && sf->interrupt <= 0x1f) { | ||
/* Exceptions */ | /* Exceptions */ | ||
| Zeile 379: | Zeile 380: | ||
if (sf->interrupt == 0x20) { | if (sf->interrupt == 0x20) { | ||
| − | /* Timer*/ | + | /* Timer */ |
| − | esp = schedule(esp); | + | /* Den Scheduler aufrufen. Der ist jemand, der ESP |
| + | ändern will, um einen Taskwechsel zu veranlassen. */ | ||
| + | esp = schedule(esp); | ||
} | } | ||
| − | /* die anderen IRQs auch ... */ | + | /* die anderen IRQs auch behandeln ... */ |
/* Die Bearbeitung des IRQs beim PIC bestätigen */ | /* Die Bearbeitung des IRQs beim PIC bestätigen */ | ||
| Zeile 389: | Zeile 392: | ||
/* Systemaufruf */ | /* Systemaufruf */ | ||
switch (sf->eax) { | switch (sf->eax) { | ||
| − | case 0: /* ... was auch immer Systemaufruf 0 | + | case 0: /* ... tun, was auch immer Systemaufruf 0 tut */ break; |
/* und so weiter */ | /* und so weiter */ | ||
} | } | ||