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 21h
unter MS-DOS Auch Durch klassische befehle (ca. 20 Stück) nachbilden, allerdings nicht mehr die in INT 80h
den 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 80h
folgendermassen 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 IRET
den 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