Software-Interrupt



Ein Software-Interrupt ist ein Expliziter Aufruf einer Unterfunion (Meistern einer Betriebssystem-Funktion). Ist Hass nichts mit Einem Interrupt (asynchrone Unterbrechung) zu tun, obwohl Hauf same Sprungverteiler (Interrupt Tabelle) der Benutzt Wird. Übliche Mnemoniken

    • INT XXII ( Interrupt bei Intel 8086 )
    • SC XXII ( Systemaufruf bei Zilog Z8000 )
    • TRAP xh ( Trap bei Motorola 68000 )
    • CALL 0005h ( CP / M-80 , Intel 8080 / Zilog Z80 Tastaturspiegel Befehl dafür)

Solke-Funktionsaufrufe wurden von den Programmen mit Hilfe von bestimmten Architekten erhalten. Dazu muss die Nummer für die benötigte Unterfunktion bekannt sein. Diese Nummer wird als Index in einer Sprungtabelle (meist Interrupt-Vektor-Tabelle) verwöhnt, welche Startadresse des Unterprogrammses enthält.

Hintergründe

Ursprünglich nur als Bequemer und porta Möbel Sprungverteiler ( MS-DOS ) used – ein vermied DAMIT versionsabhängige Einsprünge direkt im Betriebssystem-Kodex (z B.. JSR $EDB9) – Haben this Funktionsaufrufe bei Modernen Betriebssystem weitere Die Leistung bekommen. Mit Diesen befehlen Sind Kontext- und Aufgaben Wechsel Möglich, sterben sich mit Klassisches befehlen (absichtlich) nicht Realisiert lassen. So Läßt ich die INT 21hunter MS-DOS Auch Durch klassische befehle (ca. 20 Stück) nachbilden, allerdings nicht mehr die in INT 80hden zum Aufruf von Betriebssystemfunktionen in Unix -Binaries used Wird.

This Technik ermöglicht erst Geschützte Betriebssystem, wenn es Wechsel in dem Kontext des Betriebssystem nur ein genau definierten Stellen ERFOLG Kann.

Beispiel für Aufruf (Unix, Intel i386)

Es soll die POSIX-Funktion lesen (implementiert im Speicher) implementiert werden:

 read ( int FileHandle , void * Puffer , unsigned int BufferLength ) ;

Die (minimale) Implementierung (in der Bibliothek) sieht so aus:

 lesen proc
 drücken ebx
 push ecx
 push edx
 mov ebx , [ esp + 16 ] ; FileHandle
 mov ecx , [ esp + 20 ] ; Puffer
 mov edx , [ esp + 24 ] ; BufferLength
 mov eax , 0003 h ; Funktionsnummer für lesen
 int 80 h
 pop edx
 pop ecx
 pop ebx
 cmp eax, - 124 ; Werte von 0 ... 0FFFFFF84h Sind Rückgabewerte, -123 ...- 1 Sind (negierte) Fehlernummern
 JBE .noError
 neg eax ; Aus Rückgabewerten -1 ...- 123 wurde die Fehlernummer 1 ... 123
 mov __errno , eax ; Fehler in errno abspeichern
 mov eax , - 1
 .noError:
 ret
 Ende proc

Behandlung vom Prozessor und Betriebssystem

Der Befehl ist INT 80hfolgendermassen schuldig:

  • Bei einem Call Gate Hit haben wir einen Wechsel des Prioritätslevel von 3 (User) auf 0 ( Kernel ) gefunden
  • den Prozessor vom Userspace-Stack auf dem Kernelspace-Stack umgeschaltet,
  • formiere dein Flaggenregister korrigiert und
  • Zu einem späteren Zeitpunkt wird eine Änderung des Betriebssystems angezeigt.

Die wichtigste Aktion ist das Abspeichern und Test der Argumente:

  • Werfen Sie einen Blick auf den Prozess den Speicherbereich Zwischen Buffer und Buffer + BufferLength-1?
    • wenn nein ⇒ EFAULT
  • Ist der FileHandle für diesen Prozess gültig?
    • wenn nein ⇒ EBADF
  • Ist der Speicherbereich Zwischen Puffer und Puffer + PufferLength-1 im Hauptspeicher?

Ein unerwarteter Test der Argumente war Anfang bis Mitte der 1990er Jahre noch üüblich. Das von Systemfunktionen aufrufen mit rein Zufällig Wert reicht aus, um zu Betriebssystem Absturz wir sind , das Testprogramm crashmeKönnte das Eindrucksvoll zeigen. Heavutage ist jedes Betriebssystem gegen Größenordnungen. Ich bin oft wütend auf mich und mein Verstand ist still.

Am dede hat der Kernel den Funktionsaufruf abgearbeitet und gibt IRETden Controller wieder zurück. Der Rücksprung war wieder über ein Call Gate.

  • Rücksprung vom Stack
  • Flagregister rekonstruieren
  • Auf Userspace-Stack zurückgeschalten
  • Prioritätslevel wieder auf 3 Sets