logo

Einführung des Systemaufrufs

In der Informatik a Systemaufruf ist eine programmatische Methode, bei der ein Computerprogramm einen Dienst vom Kernel des Betriebssystems anfordert, auf dem es ausgeführt wird. Ein Systemaufruf ist eine Möglichkeit für Programme mit dem Betriebssystem interagieren . Ein Computerprogramm führt einen Systemaufruf durch, wenn es eine Anfrage an den Kernel des Betriebssystems stellt. Systemaufruf bietet die Dienste des Betriebssystems an die Benutzerprogramme über Application Program Interface (API). Es stellt eine Schnittstelle zwischen einem Prozess und einem Betriebssystem bereit, damit Prozesse auf Benutzerebene Dienste des Betriebssystems anfordern können. Systemaufrufe sind die einzigen Einstiegspunkte in die Kernel System. Alle Programme, die Ressourcen benötigen, müssen Systemaufrufe verwenden.

Ein Benutzerprogramm kann über einen Systemaufruf mit dem Betriebssystem interagieren. Das Programm fordert eine Reihe von Diensten an, und das Betriebssystem reagiert, indem es eine Reihe von Systemaufrufen startet, um die Anforderung zu erfüllen. Ein Systemaufruf kann in Hochsprachen wie C oder Pascal oder in Assembler geschrieben werden. Wenn eine Hochsprache verwendet wird, kann das Betriebssystem Systemaufrufe, bei denen es sich um vordefinierte Funktionen handelt, direkt aufrufen.



Ein Systemaufruf ist ein Mechanismus, den Programme verwenden, um Dienste von anzufordern Betriebssystem (Betriebssystem). Einfacher ausgedrückt handelt es sich um eine Möglichkeit für ein Programm, mit dem zugrunde liegenden System zu interagieren, beispielsweise auf Hardwareressourcen zuzugreifen oder privilegierte Vorgänge auszuführen.

Ein Systemaufruf wird dadurch initiiert, dass das Programm eine bestimmte Anweisung ausführt, die einen Wechsel zu auslöst Kernel Modus, der es dem Programm ermöglicht, einen Dienst vom Betriebssystem anzufordern. Das Betriebssystem verarbeitet dann die Anfrage, führt die erforderlichen Vorgänge aus und gibt das Ergebnis an das Programm zurück.

Systemaufrufe sind für das ordnungsgemäße Funktionieren eines Betriebssystems von wesentlicher Bedeutung, da sie Programmen eine standardisierte Möglichkeit bieten, auf Systemressourcen zuzugreifen. Ohne Systemaufrufe müsste jedes Programm seine eigenen Methoden für den Zugriff auf Hardware und Systemdienste implementieren, was zu inkonsistentem und fehleranfälligem Verhalten führen würde.



Durch Systemaufrufe bereitgestellte Dienste

  • Prozesserstellung und -management
  • Hauptspeicherverwaltung
  • Dateizugriff, Verzeichnis- und Dateisystemverwaltung
  • Gerätehandhabung (I/O)
  • Schutz
  • Vernetzung usw.
    • Prozesssteuerung: beenden, abbrechen, erstellen, beenden, zuweisen und Speicher freigeben.
    • Dokumentenverwaltung: Erstellen, Öffnen, Schließen, Löschen, Lesen von Dateien usw.
    • Geräteverwaltung
    • Informationspflege
    • Kommunikation

Funktionen von Systemaufrufen

  • Schnittstelle: Systemaufrufe stellen eine klar definierte Schnittstelle zwischen Benutzerprogrammen und dem Betriebssystem bereit. Programme stellen Anfragen, indem sie bestimmte Funktionen aufrufen, und das Betriebssystem antwortet, indem es den angeforderten Dienst ausführt und ein Ergebnis zurückgibt.
  • Schutz: Systemaufrufe werden verwendet, um auf privilegierte Vorgänge zuzugreifen, die normalen Benutzerprogrammen nicht zur Verfügung stehen. Das Betriebssystem nutzt dieses Privileg, um das System vor böswilligem oder unbefugtem Zugriff zu schützen.
  • Kernel-Modus: Bei einem Systemaufruf wird das Programm vorübergehend vom Benutzermodus in den Kernelmodus umgeschaltet. Im Kernel-Modus hat das Programm Zugriff auf alle Systemressourcen, einschließlich Hardware, Speicher und andere Prozesse.
  • Kontextwechsel: Ein Systemaufruf erfordert einen Kontextwechsel, bei dem der Status des aktuellen Prozesses gespeichert und in den Kernelmodus gewechselt wird, um den angeforderten Dienst auszuführen. Dies kann zu einem Overhead führen, der sich auf die Systemleistung auswirken kann.
  • Fehlerbehandlung: Systemaufrufe können Fehlercodes zurückgeben, um auf Probleme mit dem angeforderten Dienst hinzuweisen. Programme müssen nach diesen Fehlern suchen und sie entsprechend behandeln.
  • Synchronisation: Systemaufrufe können verwendet werden, um den Zugriff auf gemeinsam genutzte Ressourcen wie Dateien oder Netzwerkverbindungen zu synchronisieren. Das Betriebssystem stellt Synchronisationsmechanismen wie Sperren oder Semaphoren bereit, um sicherzustellen, dass mehrere Programme sicher auf diese Ressourcen zugreifen können.

Vorteile von Systemaufrufen

  • Zugriff auf Hardwareressourcen: Systemaufrufe ermöglichen Programmen den Zugriff auf Hardwareressourcen wie Festplatten, Drucker und Netzwerkgeräte.
  • Speicherverwaltung: Systemaufrufe bieten Programmen die Möglichkeit, Speicher zuzuweisen und freizugeben sowie auf speicherzugeordnete Hardwaregeräte zuzugreifen.
  • Prozessmanagement: Systemaufrufe ermöglichen es Programmen, Prozesse zu erstellen und zu beenden sowie die Kommunikation zwischen Prozessen zu verwalten.
  • Sicherheit: Systemaufrufe bieten Programmen die Möglichkeit, auf privilegierte Ressourcen zuzugreifen, z. B. die Möglichkeit, Systemeinstellungen zu ändern oder Vorgänge auszuführen, die Administratorrechte erfordern.
  • Standardisierung: Systemaufrufe bieten eine standardisierte Schnittstelle für Programme zur Interaktion mit dem Betriebssystem und gewährleisten so Konsistenz und Kompatibilität über verschiedene Hardwareplattformen und Betriebssystemversionen hinweg.

Wie funktioniert ein Systemaufruf?

Hier ist die detaillierte Schritt-für-Schritt-Erklärung, wie Systemaufrufe funktionieren:

  • Benutzer benötigen spezielle Ressourcen: Manchmal müssen Programme spezielle Dinge tun, die ohne die Erlaubnis des Betriebssystems nicht möglich sind, z. B. das Lesen aus einer Datei, das Schreiben in eine Datei, das Abrufen von Informationen von der Hardware oder das Anfordern von Speicherplatz.
  • Das Programm stellt eine Systemaufrufanforderung: Es gibt spezielle vordefinierte Anweisungen, um eine Anfrage an das Betriebssystem zu stellen. Diese Anweisungen sind nichts anderes als nur ein Systemaufruf. Das Programm verwendet diese Systemaufrufe bei Bedarf in seinem Code.
  • Das Betriebssystem sieht den Systemaufruf: Wenn das Betriebssystem den Systemaufruf sieht, erkennt es, dass das Programm zu diesem Zeitpunkt Hilfe benötigt, stoppt daher vorübergehend die Programmausführung und übergibt die gesamte Kontrolle an einen speziellen Teil von sich selbst namens „Kernel“. Jetzt löst „Kernel“ den Bedarf an Programmen.
  • Das Betriebssystem führt die folgenden Operationen aus: Jetzt führt das Betriebssystem den vom Programm angeforderten Vorgang aus. Beispiel: Inhalt aus einer Datei lesen usw.
  • Das Betriebssystem gibt dem Programm die Kontrolle zurück: Nach der Durchführung der Sonderoperation gibt das Betriebssystem die Kontrolle an das Programm zurück, damit es weiter ausgeführt werden kann.

Beispiele für einen Systemaufruf in Windows und Unix

Systemaufrufe für Windows und Unix gibt es in vielen verschiedenen Formen. Diese sind in der folgenden Tabelle wie folgt aufgeführt:

Verfahren Windows Unix
Prozesssteuerung

CreateProcess()



ExitProcess()

WaitForSingleObject()

Gabel()

Rückruf Hölle in Javascript

Ausfahrt()

Warten()

Dateimanipulation

Erstelle Datei()

ReadFile()

WriteFile()

Offen()

Lesen()

Schreiben()

Schließen()

Geräteverwaltung

SetConsoleMode()

ReadConsole()

WriteConsole()

Ioctl()

Lesen()

Schreiben()

Informationspflege

GetCurrentProcessID()

SetTimer()

Schlafen()

Getpid()

Alarm()

Schlafen()

Kommunikation

CreatePipe()

CreateFileMapping()

MapViewOfFile()

Rohr()

Shmget()

Mmap()

Schutz

SetFileSecurity()

InitializeSecurityDescriptor()

SetSecurityDescriptorgroup()

Chmod()

entlarven()

Chown()

offen(): Der Zugriff auf eine Datei in einem Dateisystem ist mit dem Systemaufruf open() möglich. Es stellt die benötigten Dateiressourcen und ein Handle zur Verfügung, das der Prozess verwenden kann. Eine Datei kann von mehreren Prozessen gleichzeitig oder nur von einem Prozess geöffnet werden. Alles basiert auf der Struktur und dem Dateisystem.

lesen(): Damit werden Daten aus einer Datei im Dateisystem abgerufen. Im Allgemeinen werden drei Argumente akzeptiert:

  1. Eine Beschreibung einer Datei.
  2. Ein Puffer zum Speichern von Lesedaten.
  3. Wie viele Bytes sollen aus der Datei gelesen werden
    Vor dem Lesen konnte die zu lesende Datei anhand ihres Dateideskriptors identifiziert und mit der Funktion open() geöffnet werden.

Warten(): In einigen Systemen muss ein Prozess möglicherweise warten, bis die Ausführung eines anderen Prozesses abgeschlossen ist, bevor er fortfahren kann. Wenn ein übergeordneter Prozess einen untergeordneten Prozess erstellt, wird die Ausführung des übergeordneten Prozesses angehalten, bis der untergeordnete Prozess abgeschlossen ist. Der übergeordnete Prozess wird mit dem Systemaufruf wait() gestoppt. Der übergeordnete Prozess erlangt die Kontrolle zurück, sobald die Ausführung des untergeordneten Prozesses abgeschlossen ist.

schreiben(): Daten aus einem Benutzerpuffer werden damit wie eine Datei auf ein Gerät geschrieben. Auf diese Weise kann ein Programm Daten auf eine bestimmte Weise erzeugen Systemaufruf . Im Allgemeinen gibt es drei Argumente:

  1. Eine Beschreibung einer Datei.
  2. Ein Verweis auf den Puffer, in dem Daten gespeichert sind.
  3. Die Datenmenge, die aus dem Puffer geschrieben wird, in Bytes.

Gabel(): Der Systemaufruf fork() wird von Prozessen verwendet, um Kopien von sich selbst zu erstellen. Es ist eine der in Betriebssystemen am häufigsten verwendeten Methoden zur Erstellung von Prozessen. Wenn ein übergeordneter Prozess einen untergeordneten Prozess erstellt, wird die Ausführung des übergeordneten Prozesses angehalten, bis der untergeordnete Prozess abgeschlossen ist. Der übergeordnete Prozess erlangt die Kontrolle zurück, sobald die Ausführung des untergeordneten Prozesses abgeschlossen ist.

Ausfahrt(): Zum Beenden eines Programms wird ein Systemaufruf namens „exit()“ verwendet. In Umgebungen mit mehreren Threads zeigt dieser Aufruf an, dass die Thread-Ausführung abgeschlossen ist. Nach Verwendung der Systemfunktion „exit()“ stellt das Betriebssystem die vom Prozess verwendeten Ressourcen wieder her.

Methoden zur Übergabe von Parametern an das Betriebssystem

Wenn ein Systemaufruf erfolgt, müssen wir Parameter an den Kernel-Teil des Betriebssystems übergeben.

Schauen Sie sich zum Beispiel das Gegebene an offen() Systemaufruf:

C




//function call example> #include> int> open(>const> char> *pathname,>int> flags, mode_t mode);>

>

>

Hier Pfadname , Flaggen Und mode_t sind die Parameter.

Es ist also zu beachten:

  • Wir können die Parameter nicht wie bei einem gewöhnlichen Funktionsaufruf direkt übergeben.
  • Im Kernal-Modus gibt es eine andere Möglichkeit, einen Funktionsaufruf durchzuführen.

Daher können wir es nicht im normalen Adressraum ausführen, den der Prozess bereits erstellt hat, und daher können wir die Parameter nicht oben im Stapel platzieren, da sie dem Kernel des Betriebssystems nicht zur Verarbeitung zur Verfügung stehen. Daher müssen wir andere Methoden anwenden, um die Parameter an den Kernel des Betriebssystems zu übergeben.

Wir können es schaffen, indem wir

  1. Übergabe von Parametern in Registern
  2. Die Adresse des Blocks wird als Parameter in einem Register übergeben.
  3. Parameter werden in einen Stapel verschoben.

Lassen Sie uns die einzelnen Punkte im Detail besprechen:

1. Übergabe von Parametern in Registern.

  • Es ist die einfachste der drei Methoden
  • Hier übergeben wir die Parameter direkt an Register.
  • Dies ist jedoch begrenzt, wenn die Anzahl der Parameter größer als die Anzahl der Register ist.
  • Hier ist der C-Programmcode:

C




// Passing parameters in registers.> #include> #include> int> main()> {> >const> char>* pathname =>'example.txt'>;> >int> flags = O_RDONLY;> >mode_t mode = 0644;> >int> fd = open(pathname, flags, mode);> >// in function call open(), we passed the parameters pathanme,flags,mode to the kernal directly> >if> (fd == -1) {> >perror>(>'Error opening file'>);> >return> 1;> >}> >// File operations here...> >close(fd);> >return> 0;> }>

>

>

2. Die Adresse des Blocks wird als Parameter übergeben

  • Es kann angewendet werden, wenn die Anzahl der Parameter größer ist als die Anzahl der Register.
  • Parameter werden in Blöcken oder Tabellen gespeichert.
  • Die Adresse des Blocks wird als Parameter an ein Register übergeben.
  • Am häufigsten unter Linux und Solaris verwendet.
  • Hier ist der C-Programmcode:

C




//Address of the block is passed as parameters> #include> #include> int> main() {> >const> char> *pathname =>'example.txt'>;> >int> flags = O_RDONLY;> >mode_t mode = 0644;> >int> params[3];> >// Block of data(parameters) in array> >params[0] = (>int>)pathname;> >params[1] = flags;> >params[2] = mode;> >int> fd = syscall(SYS_open, params);> >// system call> >if> (fd == -1) {> >perror>(>'Error opening file'>);> >return> 1;> >}> >// File operations here...> >close(fd);> >return> 0;> }>

Java-Ende für Schleife
>

>

3. Parameter werden in einem Stapel abgelegt

  • Bei dieser Methode können Parameter mithilfe des Programms eingefügt und mithilfe des Betriebssystems wieder entfernt werden
  • So kann der Kernal leicht auf die Daten zugreifen, indem er Informationen von der Oberseite des Stapels abruft.
  • Hier ist der C-Programmcode

C




//parameters are pushed into the stack> #include> #include> #include> int> main() {> >const> char> *pathname =>'example.txt'>;> >int> flags = O_RDONLY;> >mode_t mode = 0644;> >int> fd;> >asm>volatile>(> >'mov %1, %%rdi '> >'mov %2, %%rsi '> >'mov %3, %%rdx '> >'mov , %%rax '> >'syscall'> >:>'=a'> (fd)> >:>'r'> (pathname),>'r'> (flags),>'r'> (mode)> >:>'%rdi'>,>'%rsi'>,>'%rdx'> >);> >if> (fd == -1) {> >perror>(>'Error opening file'>);> >return> 1;> >}> >// File operations here...> >close(fd);> >return> 0;> }>

>

>

Oft gestellte Frage

F.1: Wie funktioniert ein Systemaufruf?

Antwort:

Wenn ein Programm einen Systemaufruf ausführt, wechselt es vom Benutzermodus in den Kernelmodus, der ein Modus mit höheren Privilegien ist. Der Übergang wird typischerweise durch den Aufruf einer bestimmten Funktion oder eine Unterbrechungsanweisung der Programmiersprache oder des Betriebssystems eingeleitet.

Im Kernelmodus wird der Systemaufruf vom Betriebssystem abgewickelt. Der Kernel führt die angeforderte Operation im Namen des Programms aus und gibt das Ergebnis zurück. Anschließend wird die Kontrolle an das Programm auf Benutzerebene zurückgegeben, das seine Ausführung fortsetzt.

F.2: Warum sind Systemaufrufe notwendig?

Antwort:

Systemaufrufe sind aus mehreren Gründen notwendig:

Zugriff auf privilegierte Vorgänge: Für viele Vorgänge, beispielsweise die Verwaltung von Hardwaregeräten oder die Änderung von Systemkonfigurationen, sind höhere Berechtigungen erforderlich, auf die nur über Systemaufrufe zugegriffen werden kann.

Resourcenmanagement: Systemaufrufe bieten eine standardisierte Schnittstelle zum Zuweisen und Verwalten von Systemressourcen wie Speicher, Dateien und Geräten und gewährleisten so einen fairen und kontrollierten Zugriff durch verschiedene Prozesse.

Abstraktion: Systemaufrufe abstrahieren die zugrunde liegende Komplexität des Betriebssystems und ermöglichen es Anwendungsentwicklern, auf einer höheren Ebene und plattformunabhängig mit dem System zu interagieren.

Sicherheit und Schutz: Systemaufrufe erzwingen Zugriffskontroll- und Sicherheitsrichtlinien, verhindern unbefugten Zugriff auf sensible Ressourcen und schützen die Integrität des Systems.