Interrupt Service Routine — Änderungen 4483 → 4484

Zeile 52: Zeile 52:
 
(Erinnerung: Der Stack wächst nach unten, also in Richtung der niedrigen Adressen)
 
(Erinnerung: Der Stack wächst nach unten, also in Richtung der niedrigen Adressen)
  
 +
<center>
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Wert || Kommentar
 
! Wert || Kommentar
Zeile 70: Zeile 71:
 
|-
 
|-
 
|}
 
|}
 +
</center>
  
 
Diese 3 bzw. 5 Werte, die sich auf dem Stack befinden müssen wir also nicht noch einmal sichern. Allerdings müssen wir noch die General Purpose Register und die 4 Segment Register retten. Dies geschieht mit dem ''pusha'', sowie den 4 ''push''s.  Zum Schluss werden mittels ''pop'' und ''popa'' die alten Werte dieser Register wiederhergestellt, bevor zum Aufrufer zurückgesprungen wird. Dies ist notwendig, um unsere weiter oben formulierte Forderung, dass wir den Zustand des Programms nicht ändern, zu erfüllen. Diese pauschale Sicherung aller Register erlaubt es uns im folgenden Code frei über alle Register zu verfügen.
 
Diese 3 bzw. 5 Werte, die sich auf dem Stack befinden müssen wir also nicht noch einmal sichern. Allerdings müssen wir noch die General Purpose Register und die 4 Segment Register retten. Dies geschieht mit dem ''pusha'', sowie den 4 ''push''s.  Zum Schluss werden mittels ''pop'' und ''popa'' die alten Werte dieser Register wiederhergestellt, bevor zum Aufrufer zurückgesprungen wird. Dies ist notwendig, um unsere weiter oben formulierte Forderung, dass wir den Zustand des Programms nicht ändern, zu erfüllen. Diese pauschale Sicherung aller Register erlaubt es uns im folgenden Code frei über alle Register zu verfügen.
Zeile 79: Zeile 81:
 
(Erinnerung: Der Stack wächst nach unten, also in Richtung der niedrigen Adressen)
 
(Erinnerung: Der Stack wächst nach unten, also in Richtung der niedrigen Adressen)
  
 +
<center>
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Wert || Kommentar
 
! Wert || Kommentar
Zeile 121: Zeile 124:
 
|-
 
|-
 
|}
 
|}
 +
</center>
  
 
=== Kernel-Bedingungen ===
 
=== Kernel-Bedingungen ===
Zeile 301: Zeile 305:
 
; Stubs für die restlichen Interrupts auch noch hierhin schreiben.</asm>
 
; Stubs für die restlichen Interrupts auch noch hierhin schreiben.</asm>
 
* Das Stack-Layout sieht jetzt für alle Interrupts so aus. Der einzige Unterschied sind der Fehlercode und die Interruptnummer:
 
* Das Stack-Layout sieht jetzt für alle Interrupts so aus. Der einzige Unterschied sind der Fehlercode und die Interruptnummer:
−
<code>:           : hohe Adressen  
+
<center>
−
:          :
+
{| {{Prettytable}}
−
+-----------+
+
! Wert || Kommentar
−
| USER SS   |     (nur bei Interrupt in Ring 1-3)
+
|-
−
+-----------+
+
| : || hohe Adressen
−
| USER ESP |     (nur bei Interrupt in Ring 1-3)
+
|-
−
+-----------+
+
| USER SS || nur bei Interrupt in Ring 1-3
−
| EFLAGS   |
+
|-
−
+-----------+
+
| USER ESP || nur bei Interrupt in Ring 1-3
−
| CS       |
+
|-
−
+-----------+
+
| EFLAGS ||
−
| EIP       |
+
|-
−
+-----------+
+
| CS ||
−
| error     |     Fehlercode (oder Ersatz dafür)
+
|-
−
+-----------+
+
| EIP ||
−
| interrupt |     Nummer des Interrupts
+
|-
−
+-----------+
+
| error || Fehlercode (oder Ersatz dafür)
−
| EAX       |
+
|-
−
+-----------+
+
| interrupt || Nummer des Interrupts
−
| ECX       |
+
|-
−
+-----------+
+
| EAX ||  
−
| EDX       |
+
|-
−
+-----------+
+
| ECX ||
−
| EBX       |
+
|-
−
+-----------+
+
| EDX ||
−
| ESP       |     (das ESP das im letzten Bildchen auf EIP gezeigt hat)
+
|-
−
+-----------+
+
| EBX ||
−
| EBP       |
+
|-
−
+-----------+
+
| ESP || das ESP, das in der ersten Tabelle auf EIP gezeigt hat
−
| ESI       |
+
|-
−
+-----------+
+
| EBP ||
−
| EDI       |
+
|-
−
+-----------+
+
| ESI ||
−
| DS       |
+
|-
−
+-----------+
+
| EDI ||
−
| ES       |
+
|-
−
+-----------+
+
| DS ||
−
| FS       |
+
|-
−
+-----------+
+
| ES ||
−
| GS       | <---- ESP zeigt hier hin
+
|-
−
+-----------+
+
| FS ||
−
:           :
+
|-
−
:          : niedrige Adressen</code>
+
| GS || ESP zeigt hier hin
 +
|-
 +
| : || niedrige Adressen
 +
|-
 +
|}
 +
</center>
  
 
* Als nächstes müssen wir den gemeinsamen Teil der Interruptbehandlung anpassen. Das geht recht leicht, denn wir haben ja im Unterschied zu früher nur zwei weitere Werte auf den Stack gelegt. Diese müssen wir also nur entfernen, bevor wir ''iret'' ausführen. Allerdings sollten wir dafür nicht ''pop'' nehmen, weil das immer ein Ziel haben muss. Wir wollen aber nichts überschreiben, deswegen passen wir einfach den Stack Pointer an. Der Fehlercode und die Interruptnummer sind 32-Bit-Worte (dword), also jeweils 4 Bytes groß, und zusammen 8 Bytes. Wenn wir zu esp 8 addieren, wandern wir in unserem Stack Layout zwei Einträge nach oben, und haben diese Werte übersprungen. Das sieht so aus:
 
* Als nächstes müssen wir den gemeinsamen Teil der Interruptbehandlung anpassen. Das geht recht leicht, denn wir haben ja im Unterschied zu früher nur zwei weitere Werte auf den Stack gelegt. Diese müssen wir also nur entfernen, bevor wir ''iret'' ausführen. Allerdings sollten wir dafür nicht ''pop'' nehmen, weil das immer ein Ziel haben muss. Wir wollen aber nichts überschreiben, deswegen passen wir einfach den Stack Pointer an. Der Fehlercode und die Interruptnummer sind 32-Bit-Worte (dword), also jeweils 4 Bytes groß, und zusammen 8 Bytes. Wenn wir zu esp 8 addieren, wandern wir in unserem Stack Layout zwei Einträge nach oben, und haben diese Werte übersprungen. Das sieht so aus: