2009-08-07 13 views
5

diese Frage InspiredWas ist INT 21h?

How can I force GDB to disassemble?

ich über die INT 21h als ein Konzept gewundert. Nun, ich habe ein sehr rostiges Wissen über die Interna, aber nicht so viele Details. Ich erinnere mich, dass Sie in C64 regelmäßige Interrupts und nicht maskierbare Interrupts hatten, aber mein Wissen hört hier auf. Könnten Sie mir bitte einen Hinweis geben? Ist es eine DOS-bezogene Strategie?

+0

Der andere Beitrag, den Sie verlinken, hat nicht wirklich viel mit INT 21h zu tun - es ist nicht etwas, wo Sie stoßen werden, wenn Sie mit 16-Bit-DOS-Code zu tun haben. Andere Betriebssysteme verwenden auch einen Interrupt für Systemaufrufe, allerdings nicht 21h - und nicht alte OS + CPUs verwenden stattdessen den neueren SYSCALL-Befehl. – snemarch

Antwort

12

Von here: Ein Mehrzweck-DOS-Interrupt für verschiedene Funktionen einschließlich Lesen der Tastatur und Schreiben auf die Konsole und Drucker verwendet. Es wurde auch zum Lesen und Schreiben von Datenträgern mit der früheren FCB-Methode (File Control Block) verwendet.

3

Der INT-Befehl ist ein Software-Interrupt. Es bewirkt einen Sprung zu einer Routine, auf die ein Unterbrechungsvektor zeigt, der ein fester Ort im Speicher ist. Der Vorteil des INT-Befehls besteht darin, dass er nur 2 Byte lang ist, wie bei 6 für einen JMP, und dass er leicht durch Ändern des Inhalts des Interrupt-Vektors umgeleitet werden kann.

1

(Fast) die gesamte DOS-Schnittstelle wurde als INT21h-Befehle zur Verfügung gestellt, mit Parametern in den verschiedenen Registern. Es ist ein kleiner Trick, mit einer eingebauten Hardware-Tabelle zum richtigen Code zu springen. Auch INT 33h war für die Maus.

2

ist von den großen The Art of Assembly Language Programming über Interrupts:

Auf der 80x86, gibt es drei Arten von Ereignissen allgemein bekannt als Interrupts: Fallen, Ausnahmen und Interrupts (Hardware-Interrupts). Dieses Kapitel beschreibt jedes dieser Formulare und erläutert deren -Unterstützung auf den 80x86-CPUs und PC-kompatiblen Geräten.

Obwohl die Begriffe trap und exception oft synonym verwendet werden, verwenden wir den Begriff trap, um eine programmiererinitiierte und erwartete Übertragung der Steuerung an eine spezielle Handlerroutine zu bezeichnen. Eine Trap ist in vieler Hinsicht nichts anderes als ein spezialisierter Unterprogrammaufruf. Viele Texte beziehen sich auf Traps als Software-Interrupts. Die 80x86-Int-Anweisung ist das Hauptfahrzeug zum Ausführen eines Traps. Beachten Sie, dass Traps in der Regel bedingungslos sind; Das heißt, wenn Sie eine int-Anweisung ausführen, wird das Steuerelement immer an die Prozedur übergeben, die dem Trap zugeordnet ist. Da Traps über eine explizite Anweisung ausgeführt werden, ist es einfach zu bestimmen, welche Anweisungen in einem Programm eine Trap-Routine aufrufen, die behandelt.

Chapter 17 - Interrupt Structure and Interrupt Service Routines

2

Int 0x21 ist ein Software-Interrupt-x86 - im Grunde die bedeutet, eine Interrupt-Tabelle an einem festen Punkt in dem Speicher die Adressen der Software-Interrupt-Funktionen Listing ist.Wenn eine x86-CPU den Interrupt-Opcode empfängt (oder anderweitig entscheidet, dass ein bestimmter Software-Interrupt ausgeführt werden soll), verweist sie auf diese Tabelle, um einen Aufruf an diesen Punkt auszuführen (die Funktion muss iret anstelle von ret zurückgeben).

Es ist möglich, Int 0x21 und andere Software-Interrupts neu zu ordnen (auch innerhalb von DOS, obwohl dies negative Nebenwirkungen haben kann). Ein interessanter Software-Interrupt zum Zuordnen oder Verketten ist Int 0x1C (oder 0x08, wenn Sie vorsichtig sind), das ist der Systemtick-Interrupt, der 18.2 Mal pro Sekunde aufgerufen wird. Dies kann verwendet werden, um "Hintergrund" -Prozesse zu erzeugen, sogar im Singlethread-Real-Modus (der Real-Mode-Prozess wird 18.2 Mal pro Sekunde unterbrochen, um Ihre Interrupt-Funktion aufzurufen).

Auf dem DOS-Betriebssystem (oder einem System, das einige DOS-Emulation wie Windows-Konsole bereitstellt) wird Int 0x21 zugeordnet, was die DOS-Betriebssysteme Haupt "API" ist. Indem dem AH-Register verschiedene Werte zur Verfügung gestellt werden, können verschiedene DOS-Funktionen ausgeführt werden, wie das Öffnen einer Datei (AH = 0x3D) oder das Drucken auf dem Bildschirm (AH = 0x09).

+1

Windows-Konsole führt keine DOS-Emulation durch - Konsolenmodus-Apps sind vollwertige 32-Bit-Windows-Anwendungen. 'command.com! = cmd.exe' :) - 32bit Windows Versionen haben jedoch NTVDM, welches DOS Emulation bietet. – snemarch

1

Es ist ein "Software-Interrupt"; Also kein Hardware-Interrupt.

Wenn eine Anwendung einen Software-Interrupt aufruft, ist das im Wesentlichen der gleiche wie der Unterprogrammaufruf, außer dass (im Gegensatz zu einem Unterprogrammaufruf) die genaue Speicheradresse des Codes, den sie aufruft, nicht bekannt sein muss.

Systemsoftware (z. B. DOS und das BIOS) setzen ihre APIs der Anwendung als Software-Interrupts aus.

Der Software-Interrupt ist also eine Art Dynamic-Linking.

9

DOS kann als eine Bibliothek betrachtet werden, die verwendet wird, um eine Datei-/Verzeichnisabstraktion für den PC bereitzustellen (und ein bisschen mehr). int 21h ist ein einfacher Hardware- "Trick", der es einfach macht, Code aus dieser Bibliothek aufzurufen, ohne vorher zu wissen, wo er sich im Speicher befindet. Alternativ können Sie sich das als den Weg zur Nutzung der DOS-API vorstellen.

Jetzt ist das Thema der Software-Interrupts eine komplexe, zum Teil, weil die Konzepte im Laufe der Zeit entwickelt, wie Intel Funktionen der x86-Familie hinzugefügt, während versucht, mit alter Software kompatibel zu bleiben. Eine richtige Erklärung würde ein paar Seiten brauchen, aber ich werde versuchen, mich kurz zu fassen.

Die wichtigste Frage ist, ob Sie in real-Modus oder geschützten Modus sind.

Real-Modus ist die einfache, "ursprüngliche" Betriebsart für den x86-Prozessor. Dies ist der Modus, in dem DOS ausgeführt wird (wenn Sie DOS-Programme unter Windows ausführen, wird ein Real-Modus-Prozessor virtualisiert, in dem die gleichen Regeln gelten). Das gerade laufende Programm hat die volle Kontrolle über den Prozessor. Im Realmodus gibt es eine Vektortabelle, die dem Prozessor mitteilt, zu welcher Adresse er für jeden Interrupt von 0 bis 255 springen soll. Diese Tabelle wird vom BIOS und DOS sowie von Gerätetreibern und manchmal von Programmen mit gefüllt besondere Bedürfnisse. Einige dieser Unterbrechungen können durch Hardware (z. B. durch einen Tastendruck) erzeugt werden. Andere werden durch bestimmte Software-Bedingungen erzeugt (z. B. dividiere durch 0). Alle von ihnen können durch Ausführen der int n Anweisung generiert werden.

Programme können das Flag "enable interrupts" setzen/löschen; Dieses Flag betrifft nur Hardware-Interrupts und wirkt sich nicht auf int Anweisungen aus.

Die DOS-Entwickler entschieden sich für die Interrupt-Nummer 21h, um DOS-Anfragen zu bearbeiten - die Nummer hat keine wirkliche Bedeutung: Sie war zu der Zeit nur ein ungenutzter Eintrag. Es gibt viele andere (Nummer 10h ist eine BIOS-installierte Interrupt-Routine, die sich beispielsweise mit Grafiken beschäftigt). Beachten Sie auch, dass dies nur für IBM PC-kompatible Geräte gilt. x86-Prozessoren in zB eingebetteten Systemen können ihre Software- und Interrupt-Tabellen sehr unterschiedlich angeordnet haben!

Geschützter Modus ist der komplexe, "sicherheitsbewusste" Modus, der in den 286-Prozessor eingeführt und auf dem 386 erweitert wurde. Er bietet mehrere Berechtigungsebenen. Das Betriebssystem muss das alles konfigurieren (und wenn das Betriebssystem es falsch versteht, haben Sie einen potenziellen Sicherheits-Exploit). Benutzerprogramme sind im Allgemeinen auf einen "Minimalprivileg" -Modus beschränkt, bei dem der Versuch, auf Hardwareports zuzugreifen oder das Unterbrechungsflag zu ändern oder auf bestimmte Speicherbereiche zuzugreifen, das Programm anhält und das OS entscheidet, was zu tun ist (sei es Beenden) das Programm oder geben Sie dem Programm, was es zu wollen scheint).

Interrupt-Behandlung wird komplexer. Es genügt zu sagen, dass im Allgemeinen, wenn ein Benutzerprogramm einen Software-Interrupt ausführt, die Interrupt-Nummer nicht als ein Vektor in die Interrupt-Tabelle verwendet wird. Stattdessen wird eine allgemeine Schutzausnahme generiert, und der OS-Handler für diese Ausnahme kann (falls das Betriebssystem auf diese Weise entworfen wurde) herausfinden, was der Prozess wünscht und die Anfrage bearbeiten. Ich bin mir ziemlich sicher, dass Linux und Windows in der Vergangenheit (wenn nicht gerade) einen solchen Mechanismus für ihre Systemaufrufe verwendet haben. Aber es gibt andere Möglichkeiten, dies zu erreichen, wie zum Beispiel die SYSENTER-Anweisung.

0

Eigentlich gibt hier viele Konzepte sind. Beginnen wir mit den Grundlagen.

Ein Interrupt ist ein Mittel der Aufmerksamkeit von der CPU anzufordern, zu dem aktuellen Programmablauf unterbrechen, springen zu einem Interrupt-Handler (ISR - Interrupt Service Routine), einige Arbeit (in der Regel von dem OS-Kernel oder ein Gerät Fahrer) und dann zurück.

Was sind einige typische Anwendungen für Interrupts?

  • Hardware-Interrupts: Ein Gerät fragt die CPU ab, indem es eine Interrupt-Anforderung absetzt.
  • CPU Exceptions: Wenn eine abnormale CPU - Bedingung auftritt, wie z. B. eine Division durch Null, ein Seitenfehler, ... springt die CPU zum entsprechenden Interrupt - Handler, damit das Betriebssystem alles tun kann (Senden eines Signals an ein Prozess, laden Sie eine Seite aus Swap und aktualisieren Sie die TLB/Seitentabelle, ...).
  • Software-Interrupts: Da ein Interrupt letztendlich den OS-Kernel aufruft, können Interrupts auf einfache Weise Systemaufrufe implementiert werden. Aber Sie müssen nicht, in x86 können Sie eine Aufrufanweisung zu irgendeiner Struktur (irgendeine Art von TSS IIRC) verwenden, und auf neueren x86 gibt es SYSCALL/SYSENTER-Anweisungen.
  • CPUs entscheiden, wo man zum Betrachten einer Tabelle springt (Ausnahmevektoren, Interruptvektoren, IVT im Realmodus x86, IDT im geschützten Modus x86, ...). Einige CPUs haben einen einzelnen Vektor für Hardware-Interrupts, einen anderen für Ausnahmen und so weiter, und das ISR muss etwas arbeiten, um den Urheber des Interrupts zu identifizieren. Andere haben viele Vektoren und springen direkt zu sehr spezifischen ISRs.

    x86 hat 256 Interrupt-Vektoren. Auf Original-PCs wurden diese in mehrere Gruppen unterteilt:

  • 00-04 CPU-Ausnahmen, einschließlich NMI. Bei späteren CPUs (80186, 286, ...) wurde dieser Bereich überlappend mit den folgenden Bereichen erweitert.
  • 08-0F Dies sind Hardware-Interrupts, normalerweise als IRQ0-7 bezeichnet. Der PC-AT hinzugefügt IRQ8-15
  • 10-1F BIOS-Aufrufe. Konzeptionell können diese als Systemaufrufe betrachtet werden, da das BIOS der Teil von DOS ist, der von der konkreten Maschine abhängt (so wurde sie in CP/M definiert).
  • 20-2F DOS Anrufe. Einige davon sind gemultiplext und bieten eine Vielzahl von Funktionen. Der wichtigste ist INT 21h, der die meisten DOS-Dienste anbietet.
  • 30-FF Der Rest, für die Verwendung von externen Treibern und Benutzerprogrammen.