Softwareinterrupt

Softwareinterrupt

Ein Software-Interrupt ist ein expliziter Aufruf einer Unterfunktion (meist einer Betriebssystem-Funktion). Er hat nichts mit einem Interrupt (asynchrone Unterbrechung) zu tun, obwohl häufig der gleiche Sprungverteiler (Interrupt-Tabelle) benutzt wird. Übliche Mnemonics sind:

Solche Funktionsaufrufe werden von Programmen mit Hilfe von speziellen architekturabhängigen Befehlen aufgerufen. Dazu muss die Nummer für die benötigte Unterfunktion bekannt sein. Diese Nummer wird als Index in einer Sprungtabelle (meist Interrupt-Vektor-Tabelle) verwendet, die die Startadresse des Unterprogrammes enthält.

Inhaltsverzeichnis

Hintergründe

Ursprünglich nur als bequemer und portabler Sprungverteiler (MS-DOS) verwendet - man vermied damit versionsabhängige Einsprünge direkt in den Betriebssystem-Code (z.B. JSR $EDB9) - haben diese Funktionsaufrufe bei modernen Betriebssystemen weitere Funktionen bekommen. Mit diesen Befehlen sind Context- und Task-Wechsel möglich, die sich mit klassischen Befehlen (absichtlich) nicht realisieren lassen. So lässt sich der INT 21h unter MS-DOS auch durch klassische Befehlen (ca. 20 Stück) nachbilden, allerdings nicht mehr der INT 80h, der zum Aufruf von Betriebssystemfunktionen in Unix-Binarys verwendet wird.

Dadurch sind geschützte Betriebssysteme überhaupt erst möglich, da der Wechsel in den Context des Betriebssystems an genau definierten Stellen erfolgt und nur erfolgen kann.

Beispiel für Aufruf (Unix, Intel i386)

Es soll die POSIX-Funktion read (Lesen von Daten von einem Filehandle in den Speicher) implementiert werden:

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

Die (Minimal-)Implementierung (in der libc) sieht dann so aus:

    read  proc
          push ebx
          push ecx
          push edx
          mov  ebx, [esp+16]    ; FileHandle
          mov  ecx, [esp+20]    ; Buffer
          mov  edx, [esp+24]    ; BufferLength
          mov  eax, 0003h       ; Funktionnummer für read
          int  80h
          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 werden die Fehlernummern 1...123
          mov  __errno, eax     ; Fehler in errno abspeichern
          mov  eax, -1
    .noError:
          ret
          end  proc

Behandlung vom Prozessor und Betriebssystem

Der Befehl INT 80h bewirkt folgendes:

  • Da der Sprung über ein Call Gate geht, findet ein Wechsel des Prioritätslevel von 3 (User) auf 0 (Kernel) statt,
  • dann wird durch den Prozessor vom Userspace-Stack auf den Kernelspace-Stack umgeschaltet,
  • dann das Flagregister gerettet und
  • zu guter Letzt erfolgt einen Sprung zu einer vom Betriebssystem hinterlegten Adresse.

Die erste Aktion im Betriebssystem-Kern ist das Abspeichern und Testen der Argumente:

  • Darf der Prozess den Speicherbereich zwischen Buffer und Buffer+BufferLength-1 beschreiben?
    • wenn nein => EFAULT
  • Ist der FileHandle für diesen Prozess gültig?
    • wenn nein => EBADF
  • Ist der Speicherbereich zwischen Buffer und Buffer+BufferLength-1 im Hauptspeicher?
  • ...

Ein ungenügender Test der Argumente war Anfang bis Mitte der 1990er Jahre noch üblich. Das Aufrufen von Systemrufen mit rein zufälligen Werten reichte aus, um Betriebssysteme zu crashen, das Testprogramm crashme konnte das eindrucksvoll zeigen. Heutzutage ist jedes Betriebssystem um Größenordnungen resistenter gegen solche Angriffe. Mit zufälligen Werten sind keine Angriffe mehr möglich, dafür sind ausgefeilte Szenarien notwendig.

Am Ende hat der Kernel den Funktionsaufruf abgearbeitet und gibt mittels IRET die Kontrolle wieder an das Programm zurück. Der Rücksprung erfolgt wieder über ein Call Gate.

  • Rücksprungadresse vom Stack holen
  • Flagregister rekonstruieren
  • Auf Userspace-Stack zurückschalten
  • Prioritätslevel wieder auf 3 setzen

Siehe auch


Wikimedia Foundation.

Игры ⚽ Нужна курсовая?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Liste von Hallo-Welt-Programmen/Programmiersprachen — Dies ist eine Liste von Hallo Welt Programmen für gebräuchliche Programmiersprachen. Weitere Beispiele für grafische Benutzeroberflächen, Web Technologien, exotische Programmiersprachen und Textauszeichnungssprachen sind unter Liste von Hallo… …   Deutsch Wikipedia

  • Syscall — Ein Systemaufruf, auch Systemcall (von engl. system call) oder kurz Syscall, ist in der Computertechnik eine von Anwendungsprogrammen benutzte Methode, um vom Betriebssystem bereitgestellte Funktionalitäten auszuführen. Inhaltsverzeichnis 1… …   Deutsch Wikipedia

  • System Call — Ein Systemaufruf, auch Systemcall (von engl. system call) oder kurz Syscall, ist in der Computertechnik eine von Anwendungsprogrammen benutzte Methode, um vom Betriebssystem bereitgestellte Funktionalitäten auszuführen. Inhaltsverzeichnis 1… …   Deutsch Wikipedia

  • Systemcall — Ein Systemaufruf, auch Systemcall (von engl. system call) oder kurz Syscall, ist in der Computertechnik eine von Anwendungsprogrammen benutzte Methode, um vom Betriebssystem bereitgestellte Funktionalitäten auszuführen. Inhaltsverzeichnis 1… …   Deutsch Wikipedia

  • TSR-Programme — Die Abkürzung TSR stammt aus dem DOS Umfeld und steht für „Terminate and Stay Resident“. Dieses Konzept wurde als Vorläufer zu späteren Multitaskinganwendungen entwickelt, damit bestimmte Aufgaben (Uhr, Treiber, Systemdienste) permanent im… …   Deutsch Wikipedia

  • Terminate and Stay Resident — Die Abkürzung TSR stammt aus dem DOS Umfeld und steht für „Terminate and Stay Resident“. Dieses Konzept wurde als Vorläufer zu späteren Multitaskinganwendungen entwickelt, damit bestimmte Aufgaben (Uhr, Treiber, Systemdienste) permanent im… …   Deutsch Wikipedia

  • Systemaufruf — Ein Systemaufruf, auch Systemcall (von engl. system call) oder kurz Syscall, ist in der Computertechnik eine von Anwendungsprogrammen benutzte Methode, um vom Betriebssystem bereitgestellte Funktionalitäten auszuführen, wie etwa das Lesen einer… …   Deutsch Wikipedia

  • Interrupt Service Routine — Ein Interrupthandler (auch Unterbrechungsroutine oder Unterbrechungsbehandlung genannt) ist ein Programmstück, das von einer CPU ausgeführt wird, wenn sie durch einen Softwareinterrupt oder Interrupt Request (Unterbrechungsanforderung) gezwungen… …   Deutsch Wikipedia

  • Slow Start — TCP (Transmission Control Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Zuverlässiger bidirektionaler Datentransport TCP im TCP/IP‑Protokollstapel: Anwendung HTTP SMTP … Transport …   Deutsch Wikipedia

  • TCP-Header — TCP (Transmission Control Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Zuverlässiger bidirektionaler Datentransport TCP im TCP/IP‑Protokollstapel: Anwendung HTTP SMTP … Transport …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”