Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
teknopedia

teknopedia

teknopedia

teknopedia

teknopedia
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Software-Interrupt – Wikipedia
Software-Interrupt – Wikipedia
aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Softwareinterrupt)
Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Angaben ohne ausreichenden Beleg könnten demnächst entfernt werden. Bitte hilf Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst.

Ein Software-Interrupt ist ein expliziter Aufruf einer Unterfunktion (meist einer Betriebssystem-Funktion).[1] Er hat nichts mit einem Interrupt (asynchrone Unterbrechung) zu tun, obwohl häufig der gleiche Sprungverteiler (Interrupt-Tabelle) benutzt wird. 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.

Mnemonics

[Bearbeiten | Quelltext bearbeiten]

Übliche Mnemonics sind:

  • BKPT (Breakpoint bei Motorola 68000)[2]
  • INT xxh (Interrupt bei Intel 8086)
  • RST p (Restart at p bei Zilog Z80)[3]
  • SC xxh (System Call bei Zilog Z8000)
  • TRAP xh (Trap bei Motorola 68000)[4]
  • CALL 0005h (CP/M-80, der Intel 8080 hatte keinen speziellen Befehl dafür)
  • ecall (Environment Call bei RISC-V)[5]
  • svc (Supervisor Call bei ARM)[6]

Hintergründe

[Bearbeiten | Quelltext bearbeiten]

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 Befehle (ca. 20 Stück) nachbilden, allerdings nicht mehr der INT 80h, der zum Aufruf von Betriebssystemfunktionen in Unix-Binaries verwendet wird.

Diese Technik ermöglicht erst geschützte Betriebssysteme, da der Wechsel in den Kontext des Betriebssystems nur an genau definierten Stellen erfolgen kann.

Beispiel für Aufruf (Unix, Intel i386)

[Bearbeiten | Quelltext bearbeiten]

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:

; Intel-Syntax: Instruktion Ziel Quelle
    read  proc
          push ebx              ; Sichern des Inhalts des Registers ebx auf den Stack
          push ecx              ; Sichern des Inhalts des Registers ecx auf den Stack
          push edx              ; Sichern des Inhalts des Registers edx auf den Stack
          mov  ebx, [esp+16]    ; FileHandle
          mov  ecx, [esp+20]    ; Buffer
          mov  edx, [esp+24]    ; BufferLength
          mov  eax, 0003h       ; Funktionnummer für read
          int  80h              ; Interruptaufruf
          pop  edx              ; Zuvor gesicherte Inhalte werden in umgekehrter Reihenfolge vom Stack
                                ; zurück in die entsprechenden Register kopiert
          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

[Bearbeiten | Quelltext bearbeiten]

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
  • schließlich erfolgt ein Sprung zu einer vom Betriebssystem hinterlegten Adresse.

Die erste Aktion im Kernel 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 Systemfunktionen 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

[Bearbeiten | Quelltext bearbeiten]
  • Systemaufruf

Einzelbelege

[Bearbeiten | Quelltext bearbeiten]
  1. ↑ Jörg Wiegelmann: Softwareentwicklung in C für Mikroprozessoren und Mikrocontroller: C-Programmierung für Embedded-Systeme. 7. Auflage. VDE Verlag GmbH, Berlin/Offenbach 2017, ISBN 978-3-8007-4328-5, S. 82–83. 
  2. ↑ MOTOROLA M68000 FAMILY PROGRAMMER’S REFERENCE MANUAL. Motorola Inc. 1992, Seite 4-53, Archivierte Kopie (Memento vom 27. März 2023 im Internet Archive)
  3. ↑ Rodnay Zaks: PROGRAMMING THE Z80. Sybex Inc. 1979, 1981, ISBN 0-89588-094-6, Seiten 182 und 417. http://www.z80.info/zip/programming_the_z80_3rd_edition.pdf
  4. ↑ MOTOROLA M68000 FAMILY PROGRAMMER’S REFERENCE MANUAL. Motorola Inc. 1992, Seite 4-188, Archivierte Kopie (Memento vom 27. März 2023 im Internet Archive)
  5. ↑ Andrew Waterman, Krste Asanović, RISC-V Foundation: The RISC-V Instruction Set Manual, Volume I: User-Level ISA, Document Version 20191213. (pdf) 13. Dezember 2019, S. 27, abgerufen am 18. Juli 2023 (englisch). 
  6. ↑ ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition: SVC (previously SWI). In: Documentation – Arm Developer. Arm Limited, 2022, abgerufen am 15. Dezember 2023 (englisch). 
Abgerufen von „https://de.teknopedia.teknokrat.ac.id/w/index.php?title=Software-Interrupt&oldid=254638281“
Kategorien:
  • Programmierung
  • Betriebssystemkomponente
  • Mikroelektronik
Versteckte Kategorie:
  • Wikipedia:Belege fehlen

  • indonesia
  • Polski
  • العربية
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • مصرى
  • Nederlands
  • 日本語
  • Português
  • Sinugboanong Binisaya
  • Svenska
  • Українська
  • Tiếng Việt
  • Winaray
  • 中文
  • Русский
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id