Software unterbricht VS Systemaufrufe

8

Ich hatte eine Frage, von der ich nicht weiß, ob sie überhaupt Sinn ergibt: Wenn es in einem Unterbrechungsvektor eine Unterbrechungsfunktion gibt, bei der jeder Adressenschlitz ein Zeiger auf eine Funktion ist, die den Interrupt behandelt (Art eines Dienstes und im Kernel-Modus läuft), lautet meine Frage:

Würde es einen Unterschied machen, einen Software-Interrupt anstelle eines Systemaufrufs (aka Funktion) zu machen? Nehmen wir ein Beispiel: Ich kann einen Prozess auf zwei Arten in Windows zerstören:

  1. Ich rufe einfach "ExitProcess"
  2. an
  3. Ich benutze einfach den Interrupt "int80h" in Assembly (naja, zumindest unter Linux. Ist das in Windows möglich?)

Beide würden funktionieren und das gleiche Ergebnis liefern. Der einzige Unterschied ist, dass ein Interrupt die CPU stoppt, während der Systemaufruf, da es kein Interrupt ist, die CPU nicht daran hindert, andere Dinge zu tun (dies erlaubt Multithreading und nicht für etwas anhalten muss nicht wirklich anhalten) die gesamte CPU).

Ich möchte damit meinen, dass alle Funktionen in WIN32API (oder einem anderen Betriebssystem) stattdessen als Interrupts implementiert werden können und keinen Unterschied machen würden. Dann würde das WIN32API eine nicht benötigte Schicht machen. Denkst du nicht? Worin besteht dann der Unterschied zwischen Software-Interrupts und Systemaufrufen? Sie müssen nur die Funktion in der WIN32API aufrufen, um den Dienst anzufordern, und bei Interrupts müssen Sie nur die Parameter übergeben (sei es über Stack oder Register) und den angegebenen Interrupt aufrufen, der durch eine Nummer identifiziert wird. Der einzige Grund, an den ich denken kann, ist, dass DLLs (Instanzen davon) pro Prozess erstellt werden und Sie nur die Funktionen verwenden, die Sie benötigen.

Dies ist nicht möglich mit Interrupts und alle Prozesse würden die gleichen Daten teilen, was nicht immer das ist, was man wünscht.

PD: Dies ist eine zusätzliche Frage, die außerhalb des Themas liegt, aber eine kleine Frage ist: Wo kann ich eine Referenz / Liste aller Interrupts sehen, die ich in einem OS aufrufen kann? Ich kann nirgendwo eine Dokumentation sehen.

    
Hashirama Senju 14.08.2014, 01:05
quelle

1 Antwort

9

Ein Systemaufruf bedeutet im Grunde genommen nur, dass ein vom Betriebssystem bereitgestellter Dienst aufgerufen wird. Der eigentliche Mechanismus kann je nach Architektur und Betriebssystem einen Interrupt, ein Call-Gate oder andere spezialisierte Anweisungen (syscall, sysenter, swi, trap) beinhalten.

Der winapi verbirgt diesen Mechanismus, es ist ein Implementierungsdetail, um das Sie sich keine Sorgen machen müssen. Es könnte auch undokumentiert sein und Änderungen unterliegen, während die öffentliche API stabil sein soll.

In 32-Bit-x86-Linux ist die Verwendung von Interrupt 0x80 zum Ausführen von Systemaufrufen seit mehr als einem Jahrzehnt aus Leistungsgründen veraltet. Im 32-Bit-Modus stellt der Kernel selbst Code zur Verfügung, der den Systemaufruf mit dem Mechanismus ausführt, den der Kernel für den besten hält. Dieser Code wird in jeden Prozess eingebunden (lesen Sie hier hier ). In x86-64 Linux wird die spezialisierte syscall Anweisung verwendet.

Außerdem gibt es OS-Funktionen, die nicht in den Kernel-Modus wechseln müssen (was eine kostspielige Operation ist). Ein API-Layer kann diesen Unterschied ebenfalls verbergen und Ihnen automatisch den effizientesten Weg bieten.

    
Jester 14.08.2014, 01:24
quelle