Interrupt — Änderungen 4243 → 4344

Zeile 1: Zeile 1:
−
Ein Interrupt ist eine Unterbrechung der CPU. Er kann durch eine [[Exception]], einen [[IRQ]] oder einen Software-Interrupt ausgelöst werden. Software-Interrupts werden mit der Instruktion ''int <n>'' ausgelöst.
+
Ein Interrupt ist ein Ereignis, das die CPU unterbricht, um eine andere Routine auszuführen. Die CPU kann durch verschiedene Ursachen unterbrochen werden:
 +
* ein Peripheriegerät fordert die Behandlung eines Interrupts ([[IRQ]])
 +
* im Programmfluss wird mit der Instruktion ''int <n>'' ein Software-Interrupt ausgelöst
 +
* im Programm tritt eine [[Exception]] auf
  
−
Wenn ein Interrupt ausgelöst wird, werden ''eip'',''cs'' und ''eip'' auf dem Stack gesichert.
+
== Arten von Interrupts ==
 +
Es wird zwischen synchronen und asynchronen Unterbrechungen unterschieden. Als asynchrone Unterbrechungen werden Interrupts bezeichnet, die nicht vorhersagbar und nicht reproduzierbar sind. Sie treten bei wiederholter Ausführung des Programms nicht wieder oder nicht an der selben Stelle auf. Synchrone Interrupts werden hingegen ausgelöst, wenn die CPU genau definierte Bedingungen vorfindet, während sie eine Instruktion ausführt. Sie sind somit reproduzierbar und vorhersagbar.
  
−
http://wonsheimlan.wo.funpic.de/int_stack.png
+
=== Synchrone Interrupts ===
 +
Synchrone Interrupts werden bei der Intel Architektur in 3 Klassen aufgeteilt:
 +
* Traps: Breakpoints, Overflow (INTO)
 +
* Exceptions: z.B. Division durch 0, Page Faults
 +
* Aborts: Double Fault
  
−
Aus einem Interrupt wird zurückgekehrt mit der Instruktion ''iret''
+
=== Asynchrone Interrupts ===
 +
Asynchrone Interrupts treten bei Ereignissen auf, die nicht vom Programm gezielt hervorgerufen wurden. Darunter fallen [[IRQ]]s, die von Peripheriegeräten ausgelöst werden, sowie z.B. Page Faults, die die Folge einer Auslagerung von Seiten aus dem RAM auf die Festplatte sind. <!-- wo erzählen wir, dass asynchrone interrupts probleme bei präzisen zeitmessungen machen? </rhetorische frage> -->
  
−
Interrupts können mithilfe von ''sti'' und ''cli'' eingeschaltet bzw. ausgeschaltet werden. Dabei wird das 9. Bit im Register ''eflags'' gesetzt bzw. zurückgesetzt.
+
== Interrupt-Behandlung ==
 +
Wenn ein Interrupt ausgelöst wird, sichert die CPU die Register [[EFLAGS]], CS und EIP auf dem Stack. Danach wird eine Behandlungsroutine angesprungen, die in der [[IDT]] (Protected Mode) bzw. in der [[IVT]] (Real Mode) angegeben ist. Diese kehrt nach ihrer Ausführung im Allgemeinen mit dem Befehl ''iret'' zur Stelle, an der unterbrochen wurde, zurück.
 +
 
 +
In Interrupt-Behandlungsroutinen sollte je nach Art des Interrupts reagiert werden:
 +
* In IRQs muss in der Regel das entsprechende Gerät ausgelesen werden. Außerdem muss der Erhalt der IRQs beim [[PIC]] quittiert werden.
 +
* Bei Software Interrupts sollte z.B. eine Systemfunktion im Kernel ausgeführt werden
 +
* Exceptions müssen entweder gelöst werden, oder zum Abbruch des Programms führen
 +
 
 +
== Sperrung der Interrupts ==
 +
Interrupts können mit Hilfe der Instruktionen ''sti'' und ''cli'' ein- bzw. ausgeschaltet werden. Dabei wird das [[EFLAGS#IF_-_Interrupt_Enable_Flag_.28Bit_9.29|Interrupt Flag]] im Register EFLAGS gesetzt bzw. zurückgesetzt. Der Aufruf von Software-Interrupts, sowie Non-Maskable Interrupts können damit nicht unterbunden werden.
  
 
== Siehe auch ==
 
== Siehe auch ==
Zeile 15: Zeile 33:
 
* [[Non Maskable Interrupt]]
 
* [[Non Maskable Interrupt]]
 
* [[Interrupt 13h]]
 
* [[Interrupt 13h]]
 +
* Intel Manuals Volume 1A - Chapter 6 und Volume 3A - Chapter 5
 
== Links ==
 
== Links ==
 
[http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html Liste von BIOS-Interrupts]
 
[http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html Liste von BIOS-Interrupts]