Zum Inhalt springen

Was ist denn ein INTERRUPT!!


 Teilen

Empfohlene Beiträge

MOIN MOIN!!!

Wer kann mir sagen, was ein Interrupt ist???

War letztens bei einem Vorstellungsgespräch wegen einer Ausbildung zum Fachinformatiker - Systemintegration und wurde bezüglich diesen Begriffes gefragt.

Danke im Vorraus Leute !!! :confused:

<FONT COLOR="#a62a2a" SIZE="1">[ 23. August 2001 17:41: Beitrag 1 mal editiert, zuletzt von zerocool1612 ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Zero,

gib doch einfach mal "Interrupt" in eine Suchmaschine ein oder schau auf einer Lexikon- bzw. Hardwareseite nach, dann solltest Du eigentlich fündig werden. :)

Bei Wissen.de findet sich z. B. folgende Erklärung:

Interrupt: Unterbrechung,

ein Signal, meist auf speziellen Interrupt-Leitungen, das die CPU zu einem beliebigen Zeitpunkt erreichen kann, um sie zu einer Reaktion zu veranlassen. Interrupts gibt es auf verschiedenen Ebenen, einige davon sind an und abschaltbar.

<FONT COLOR="#a62a2a" SIZE="1">[ 23. August 2001 18:21: Beitrag 3 mal editiert, zuletzt von P3AC3MAK3R ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Als Ergänzung und zum besseren Verständnis kann man im Brockhaus noch unter Koitus-Interruptus nachlesen - da klärt sich dann vieles auf - und die Parallelen zum Computer sind schnell gefunden.

Gekürzt gesagt: Einfach zwischendrin aufhören - kurz mal was anderes machen - dann wieder weitermachen!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo! :eek:

Also es gibt 16 Interrupts! Jedoch werden nur 15 erkannt weil es 2 DMA Controller gibt! Bei dem 1. Controller wird der 2 Interrupt für die Einbindung des 2. Controller gesetzt! Daher die 15 Interrupts!

Ein Interrupt gibt den Prozessor den Befehl seine aktuelle Aktion zu unterbrechen und die Aufgabe des Interrupts zu bearbeiten.

Je niedriger der Interrupt, desto höher ist die Priorität zu unterbrechen! Das heisst:

zb: Interrupt 7 gibt den Befehl zu Unterbrechen. Plötzlich will Interrupt 3 bearbeitet werden. Der Prozessor unterbricht Interrupt 7 um 3 zu bearbeiten. Nachdem er 3 bearbeitet hat, macht er bei 7 weiter!

Du hast es doch bestimmt schon gehabt, das die Maus nicht mehr funktioniert, aber die Tastatur schon, oder?

Das liegt daran das die TAstatur auf einem niedrigen Interrupt liegt als die Maus.

Alles klar?

Im übrigen werden Interrupts auch IRQ (Interrupt ReQuest) bezeichnet.

:cool: Wasserbett

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich ist jedes ereignisbasierendes Betriebssystem eine einzige Interrupt-Maschine. Jeder Prozess ist ein Interrupt. Jedes interne und externe Ereignis ist ein Interrupt. Nur mit Signal-Listen und gesliceten Interrupts (Interrupt erhält Zusatzinformationen um ihn in weitere Interrupts "einzuteilen") kann man sich hierbei nur noch behelfen. Jede Mausbewegung, jeder Tastendruck und jeder leisteste Pieps an den Schnittstellen führt unweigerlich zu irgendwelchen Interrupts - sogar sowas wie das Erreichen der vertikalen und horizontalen Austastlücke des Monitors - falls gewünscht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zusatz:

wird ein Interrupt ausgelöst, wird der Programm-Zeiger gesichert und springt auf eine bestimmte, fest definierte Speicherstelle(meist an einer sehr niedrigen Adresse) und findet dort ein Sprungziel(Interrupt-Vektor) auf eine Routine (Interrupt-Handler) die beliebig gestaltet sein kann. Meist finden sich hier Verweise auf Treiber-Routinen. Die Interrupt-Vektoren werden in der Regel vom BIOS und dem Betriebssystem eingetragen, je nachdem wer für das Gerät zuständig ist. Am Ende der Routine muss ein Return-Befehl stehen der den alten Programm-Zeiger wieder lädt, was dazu führt das die Applikation weiterläuft wo sie aufgehört hat.

Wenn Bedarf besteht kann ich das auch ein bisschen illustrieren.

Das ist nur ein sehr simples Modell des Prinzips

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man kann es sogar noch genauer erklären:

Beim Auslösen eines Interrupts werden die Adreßregister, Prozessor-Register und die Prozessorflags auf den System-Stack gelegt. Es wird der Vector aus dem IRQ-Array geholt und zwar mit dem Offset des auslösenden Interrupts. In diesen wird dann gesprungen. Die Register Ax-Dx oder auch Al,Ah-Dl,Dh werden unter Umständen mit Zusatz-Informationen wie der Art des auslösenden Interruptes oder Zeigern auf bestimmte System-Strukturen initialisiert bevor in die Interrupts gesprungen wird. Solange das Interrupt-Flag gesetzt ist, kann dieser Interrupt nicht erneut aufgerufen werden. Es gibt maskable und nonmaskable (NMI) Interrupts. NMIs können nicht unterdrückt oder von Programmen gelöscht werden. Sie müssen immer stattfinden falls ausgelöst!

Nach dem Abarbeiten des Interrupts wird mit dem Assembler-Befehl IRET die Prozessor-Daten wieder in den Prozessor geladen. Der Stack-Zeiger wieder zurückgesetzt und an der Stelle fortgefahren, an dem der Prozessor beim Auslösen des Interrupts befunden hat. Das Springen in Unter-Routinen ist im Grunde genommen dasselbe, nur wird hier keine Array mit Einsprungsadressen verwendet, sondern direkt übergeben. In C/C++ werden auf dem Heap zusätzliche Parameter wie Variablen oder Zeiger abgelegt, die in der Unter-Routine abgearbeitet werden sollen (Zeiger in Prozessor-Register). Hier wird dann der RET für den Rücksprung genutzt. Der Unterschied ist: Bei IRQs werden keine Zusatzdaten auf den Stack-gelegt, sondern nur Prozessor-Inhalte. Ein Interrupt kann nicht durch weitere Interrupts derselben Art unterbrochen werden (aber durch Interrupts höherer Priorität) - eine Sub-Routine jedoch ohne weiteres in neue Subs reinspringen (sogar in sich selbst, was dann ein rekursives Programm ist, aber Vorsicht: Abbruchkriterium dann einbauen!). Der Heap erklärt sich leicht. Er ist ein Speicherbereich auf dem ein neuer Stack angelegt werden kann. Ein Heap kann fragmentiert sein - ein Stack muß Linear sein. Ein Heap kann sich über den gesamten physikalischen und virtuellen Speicher erstrecken, während ein "echter" Stack auf 64KB beschränkt ist, wegen der Page-Verwaltung des Speichers (sofern nicht mit verketten Listen ein Künstlicher erzeugt wird). Ein Heap besteht aus einer doppelt verketteten Fragmentierungsliste, ein Stack hat nur eine Stackgröße und einen Stack-Pointer. Angeforderter Speicher (durch malloc) des Heaps enthält keine Informationen über sich selbst, deshalb gibt es den New (Eine Methode, die diese Zusatzdaten des mallocs mitverwaltet - aber immer noch das direkte Delete erfordert). Ein Konstruktor macht dasselbe, allerdings hier werden beim Verlassen der Objekt-/Klassenmethoden der Destruktur mit allen zugehörigen Deletes automatisch aufgerufen. Ein reservierter Heap (also vom System angeforderter Speicher) kann Stacks beinhalten, aber keine weiteren Heaps. Ein Stack kann in Unter-Stacks unterteilt werden (in Maschinensprache). Es Stack ist immer LIFO (last in first out) während andere Strukturen FIFO oder hashes (fast) immer verkettete Listen sind. Man kann natürlich auch einen Stack mit verketteten Listen realisieren, allerdings sind die Prozessor-Unterbrechungen darauf nicht ausgelegt!

Als Anmerkung muß ich noch sagen, daß sich natürlich diese Stacks und Heaps von denen ich rede sich nur auf den System-Speicher beziehen. Natürlich kann man Stack- und Heap-Strukturen selber erzeugen und diese als Message- oder Signal-Pipelines oder für Sortieralgorhythmen verwenden. Diese sind hier jedoch nicht gemeint. Sie haben auch nur "ähnliche" Strukturen, aber einen meist vollkommen anderen Verwendungszweck und werden nicht durch einzelne Prozessorbefehle unterstützt!

Ich glaube man kann sich in diesem Thema verlaufen, wenn man will aber das sollte erstmal verdaut werden.

SO, hoffentlich habe ich nicht zuviele Fehler hier drin, aber wer´s jetzt noch nicht kapiert hat was ein Interrupt ist, dem ist glaub´ nicht mehr zu helfen.

<FONT COLOR="#a62a2a" SIZE="1">[ 25. August 2001 13:44: Beitrag 10 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um mal nen bisschen Korinthenkackerei zu betreiben.

Ein Interrupt ist zunächst einmal ein spezieller Prozessorsprungbefehl, der durch unterschiedliche Quellen ausgelöst werden kann.

Zwei davon sind die beschriebenden externen Quelle.

NMI und IRQ.

IRQ und Interrupt werden oft verwechselt.

Tatsächlich stimmen meist die ausgelösten Interuptnummern nicht mal mit der IRQ-Nummer überein.

Andere Möglichkeiten:

1)

Der Assembler Int Befehl.

Für Dosprogramierer ist hier z.B. der INT 21h

der als Schnittstelle zur DOS-Api ( wenn mans so nennen will ) dient interessant.

2)

Bestimmte Prozessorzustände und -fehler:

- Dividion durch NULL

- Ungültige Prozessorbefehle

- Nutzung von FPU-Befehlen ohne CO-Prozessor (wird genutzt für FPU-Emulatoren)

- Zugriff auf ungültige Speicherseiten/ wird fürs Paging genutzt )

......

Hoagi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Und wen´s interessiert, der kann sich ja mal von mir ein Beispiel für Interruptansteuerung unter C/C++ anschauen:

http://www.fachinformatiker.de/cgi-bin/ubbcgi/ultimatebb.cgi?ubb=get_to pic&f=21&t=000237&counterhit=yes

<FONT COLOR="#a62a2a" SIZE="1">[ 25. August 2001 18:43: Beitrag 1 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush:

Du sagst dass der "echte" Stack nur 64KB gross ist. Das stimmt so nicht ganz. Ich habe auch schon Architekturen mit 3 Byte Stackpointer gesehen.

Ansonsten finde ich deine Erklärung ziemlich gut.

<FONT COLOR="#a62a2a" SIZE="1">[ 27. August 2001 12:18: Beitrag 1 mal editiert, zuletzt von DocNeo ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

@DocNeo & @hoagi

Zitat: während ein "echter" Stack auf 64KB beschränkt ist, wegen der Page-Verwaltung des Speichers

Damit war auch nur MAXIMAL 64KB für einen "echten" Stack, welcher vom Prozessor-Befehlssatz unterstützt wird gemeint. Allerdings muß ich dazu sagen, daß ich mich mit ISSE, MMX und eventuelle neue Pentium-Befehlssätze noch überhaupt nicht auseinandergesetzt habe. Vielleicht kann man ja jetzt auch sogar schon im Real-Mode übergroße Stacks ansprechen. (man kann ja auch nicht alles wissen)

Aber es ging ja eigentlich nur um die Erklärung WAS ein Interrupt überhaupt ist.

Der Unterschied zwischen einem Interrupt und einem IRQ ist, daß der IRQ der "Interrupt Request" ist. Damit ist das setzten der Interrupt-Bits gemeint, welche den Interrupt dann auslösen. Aber so genau braucht man das nun nicht nehmen, weil sich inzwischen eingebürgert hat, daß man IRQ mit Interrupt in der Umgangssprache gleichsetzt. Der Interrupt allein kann sich also nicht auslösen, sondern er wird durch den IRQ ausgelöst!

<FONT COLOR="#a62a2a" SIZE="1">[ 27. August 2001 15:10: Beitrag 2 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit den 64KByte habe ich auch nur den PC gemeint. Monsterstacks: Das wäre auch für entsprechende Simulationen oder extrem rekursive Berechnungen absolut sinnvoll. Ich denke auch, daß es solche Konstruktionen mit Sicherheit gibt, aber nicht in der Welt der Normalsterblichen.

<FONT COLOR="#a62a2a" SIZE="1">[ 27. August 2001 16:42: Beitrag 1 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um mal wieder Korinthen zu kacken ( was für eine schöne Redewendung/ ich hoffe ich habe Korinthen richtig geschrieben/ was fürn Witz Korinthen kacke und dann Korinthen auch noch falsch zu schreiben ).

Diesen Monsterstack gibt es und zwar seit dem 386er.

Zwar nicht im Realmode oder 16 Bit Modus aber mal Hand aufs Herz wer arbeitet heutzutage noch mit nem 16 Bit-Kompiler.

Was macht das E vor dem SP ???

Es extendiert.

Seit dem 386 sind alle Register bis auf die Segmentregister auf 32 Bit aufgebohrt und tragen dann ein E

vor ihrem Namen ( EIP EAX ESP EFLAG usw ).

Und das ganze hat auch nichts mit dem Paging zu tun sondern allein damit ob der Prozessor im 16 oder 32 Bit-Modus läuft.

32 Bit ESP heißt theoretisch 4 GB Stackspeicher.

Und damit läßt sich schon jede Menge rekursierven ( oder wie auch immer das Verb von Rekursiv heißt )

Also nur Mut Crash sei

recursive(recursive(recursive(recursive(...)))).

Hoagi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast Recht, das Problem ist hiermit gelöst ich hab nochmal genau nachgeschaut:

http://developer.intel.com/design/intarch/techinfo/pentium/execenv.htm

Ich wußte zwar, daß es die Extended-Register gibt, aber nicht, daß das auch den Stack-Pointer beinhaltet.

Hier kann man sehen, worin mein Problem liegt: Ich bin ein zu alter Hase und muß wohl nochmal alles ein wenig aufrollen. Ich hatte eh vor meine Assembler-Kenntnisse eneut aufzufrischen.

Ich bin noch von meinem alten Wissensstand ausgegangen. Nachdem war das Segment-Register 16 Bit Offset auf ein 64KB Segment und der Stack-Pointer nur 16 Bit, welcher sich also innerhalb der 64KB bewegen (können sollte).

Mit den extended Registern vergrößert sich der Stack-Pointer tatsächlich auf 32 Bit. Allerdings kann man dann nicht mehr im Page-Mode arbeiten! Und das ist die Lösung!

Jaja, die Zeiten ändern sich ... ist halt alles nicht mehr ganz so einfach wie früher ...

Vielen Dank nochmal - man lernt eben nie aus, gell?

Aber vielleicht mal eine andere Frage: Wie ist denn dann der Speicher geschützt? Angenommen der ESP überschreitet den Bereich des Allokierten Speichers, schaltet sich dann nicht sowas wie eine memory-protection unit ein (irgendwas gab´s da doch). Das sollte aber eigentlich nicht sein, weil sonst würde ja jeder Virenkiller beim Memory scannen eine Privilegs-Verletzung nach der anderen werfen. Meines Wissens (aber ich geb zu, daß das wohl schon veraltet ist) werden Speicherüberschreitungen nur aufs Segment abgegrenzt. Um auf den 32Bit-Zugriff zu kommen wird nach dem obigen Link das Segmentregister und der Offset übereinandergeblendet. Deshalb war ja diese komische Rechnung mit Segment*4+Offset=echte Adresse. Da war doch der Witz, daß man mit x Offset-Segment-Kombinationen dieselbe Adresse erreicht. Also das geht dann doch zu stark ans Eingemachte, nicht wahr? Da blickt ja bald kein Schwein mehr durch.

Vielleicht gibt es dann tatsächlich keinen echten Speicher-Schutz mehr, denn der Debugger vom Studio setzt vor und nach Arrays, Strings, etc. doch sowas wie ein Bitmuster. Wird dieses Bitmuster überschrieben wird eine Bereichsüberschreitung vom Debugger erkannt und er kann sogar den Offset ausrechnen.

Wenn es so etwas wie einen Speicherschutz auf einzelnen Speicher gäbe bräuchte man doch nicht so komisch arbeiten und außerdem würde sich ja der Speichervorrat verkleinern in einem solchen Modus.

<FONT COLOR="#a62a2a" SIZE="1">[ 27. August 2001 19:06: Beitrag 2 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Crush,

ich hab zwei Neuigkeiten für dich.

Eine gute und eine schlechte.

Die Schlechte zuerst:

Das Leben ist noch komplizierter geworden als du denkst.

Nun die gute:

Das kann dir als nicht Betriebssystemprogramierer( und mir als auch nicht Betriebssystemprogramierer auch ) völlig Schnurz-Piep sein.

Also prinzipiell habe ich den Eindruck, daß du da ein paar Sachen durcheinander wirfst.

1. Paging hat nichts mit Segmentierung zu tun.

2. Die durch die Unzulänglichkeit der 16 Bit -Registern

1 MB in einem Stück zu verwalten erzwungende Segmentierung hat so gar nichts damit zu tun irgend ein Program davon abzuhalten auf Speicherbereiche zuzugreifen auf die es nicht zugreifen soll, bzw die es physikalisch gar nicht gibt.

Im Gegenteil im Realmode würdest du Zugriffe auf nicht existierenden Speicher nicht mal merken.

Die Verlaufen klaglos im Leeren.

Schreibbefehle auf im Speicheradressbereich eingeblendete ROM-Bausteine werden genauso verschluckt wie der Versuch Speicher zu lesen wo gar nichts ist ( es gibt halt nur nicht mehr soviele Maschinen mit weniger als 1 MB Speicher )

Und auch die Adressumrechnung 4*Segment + Offset sind schon seit dem 286 Protected Mode obsolet.

Statt dessen verweisen die Segmentregister auf irgendwelche Tabellen( ich habs mal gelesen wie das geht, nie gebraucht und wieder vergessen ). Und irgendwie spielen da auch zwei Register eine Rolle ( GDTR = Global Descriptor Table Register und LDTR = Local Descriptor Table Register )

In den Segmentregistern stehen dann auch noch irgendwo ein paar Bits ( 4 wenn ich mich nicht irre ) die die Art des Segments und die Privilegsstufe des Segments drin ).

Ein Bit kennzeichnet dabei ob es sich um ein Codesegment oder ein Datensegment handelt.

Speicher der über ein Codesegment angesprochen wird kann normalerweise nicht gelesen und nicht beschrieben werden

( ADE selbstmodifizierenden Code) Datensegmente können nicht ausgeführt werden.

Mit einem Bit kann bestimmt werden , daß Codesegmente zumindest gelesen werden können oder Datensegmente Schreibgeschützt sind.

Die beiden anderen Bits bestimmen die Privilegstufe (0 - 3 ).

Wobei Tasks( werden beim Prozessor durch Datenestrukturen dargestellt wo auch irgendwo eine Privilegstufe drinsteht ( glaub ich zumindest, oder war es die aktuelle Privilegstufe des CS ) nur auf ein Segment zugreifen können die eine niedrigere oder gleiche Privilegstufe wie das Segment haben.

Naja das klingt alles furchtbar wirr, aber wie gesagt mal gelesen nie gebraucht.

Wichtig für einen Programmierer ist eigentlich nur, daß er sich an gewisse Regeln halten muß ( nicht mit Segmentregistern rumspielen sonst gibst Ärger mit dem Betriebssystem )

Achso bei eingeschaltetem Paging klappt das genauso nur ein bisschen komplizierter dafür nur zwei Privilegstufen.

Also wenns dich interessiert lies es nochmal wo nach, ansonsten Munter drauf los und Finger weg von den Segmenten.

Um zum Schluß mal wieder den Dreh zum Ursprungsthema zu kriegen:

Alle Verstöße gegen die Regeln werden mit einer Exception quitiert die dann letzlich einen Interrupt auslösen.

Die müßen dann vom Betriebssystem gehandelt werden und der Händler steht dann auch nicht mehr wie im Real Mode im ersten Bereich des physikalischen Speichers, sondern werden wieder über ein spezielles Register dem IDTR ( Interrupt Description Tables Register ) mit Verweis auf einen bestimmten Speicherbereich verwaltet

Hoagi

:)

<FONT COLOR="#a62a2a" SIZE="1">[ 28. August 2001 18:58: Beitrag 1 mal editiert, zuletzt von hoagi ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wow, Hoagi - ich glaube Du bist ab jetzt mein Meister, ist ja noch komplizierter geworden, als ich es mir in meinem schlimmsten Alpträumen vorstellen könnte. Ich glaube das Problem ist, daß die einfach zwangsläufig mal die eine mal die andere Systemarchitektur als sinnvoll fanden und halt wegen der Kompatibilität auf die ja alle pochen den ganzen Mist mitintegrieren, obwohl´s kaum einer mehr braucht. Bestimmt wären die Prozessoren heute 10 mal schneller, wenn man mal die alten Artefakte abschütteln würde.

Naja, auf jeden Fall ist wohl Thema Interrupt damit abgeschlossen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

Fachinformatiker.de, 2022 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung