Interrupt Service Routine — Änderungen 4472 → 4473

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, und dann zum gemeinsamen Code springt:
+
* 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. Zum Beispiel so: */
+
     /* 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 ist */ break;
+
             case 0: /* ... tun, was auch immer Systemaufruf 0 tut */ break;
 
             /* und so weiter */
 
             /* und so weiter */
 
         }
 
         }