Notwendigkeit einiger Systemaufrufe

Notwendigkeit einiger Systemaufrufe

Ich verstehe im Großen und Ganzen, wie der Systemaufruf funktioniert und warum Systemaufrufe im Allgemeinen notwendig sind. Allerdings verstehe ich nicht, warum einige Systemaufrufe wie create() file, read() file und close() nur im Kernelmodus ausgeführt werden sollten.

Warum kann dies beispielsweise bei create()- und read()-Dateien nicht im Benutzerbereich oder Benutzermodus geschehen? Wie könnte der Benutzer das System möglicherweise beschädigen, indem er eine Datei erstellt und liest? Ich habe dieselben Zweifel auch beim Systemaufruf close().

Antwort1

Ich verstehe nicht, warum einige Systemaufrufe wie „create() file“, „read() file“ und „close()“ nur im Kernelmodus ausgeführt werden sollten.

Nun, Systemaufrufe werden per Definition im Kernelmodus ausgeführt. Im Benutzerbereich sind diese normalerweise über gleichnamige Wrapper-Funktionen für Bibliotheken verfügbar. Von man 2 intro:

Ein Systemaufruf ist ein Einstiegspunkt in den Linux-Kernel. Normalerweise werden Systemaufrufe nicht direkt aufgerufen: Stattdessen haben die meisten Systemaufrufe entsprechende Wrapper-Funktionen in der C-Bibliothek, die die erforderlichen Schritte ausführen (z. B. Umschalten in den Kernelmodus), um den Systemaufruf aufzurufen. Daher sieht das Ausführen eines Systemaufrufs genauso aus wie das Aufrufen einer normalen Bibliotheksfunktion.

(siehe auch man 2 syscall)

Wie @dirkt und @StephenKitt in den Kommentaren sagten, müssen die von Ihnen erwähnten Systemaufrufe im Kernelspeicher ausgeführt werden, da sie in die Dateideskriptortabelle schreiben, auf die Treiber für Datei-E/A zugreifen, Zugriffsrechte überprüfen usw. müssen.

Antwort2

Warum kann dies beispielsweise in create()einer read()Datei nicht im Benutzerbereich geschehen?

Auf einigen Plattformen (einschließlich Linux-basierter) ist es durchaus möglich, Dateisystem-IO aus dem Benutzerbereich auszuführen. Es ist als FUSE bekannt und Sie können lesenDateisystem im Userspacefür eine Einführung in das Thema.

Es sind viele FUSE-basierte Dateisysteme verfügbar, darunterSSHFS(Dateisystem über ssh) undS3QL(Dateisystem im Cloud-Speicher).

Der Kernel vermittelt die Schicht zwischen dem User-Space-Client (einem Anwendungsprogramm) und der FUSE-Implementierung, sodass die Dateisystem-Semantik validiert und konsistent ist, der eigentliche IO-Code für creat(), open(), read(), write(), fcntl(), close(), usw. jedoch vollständig von einem User-Space-Dienst ausgeführt wird.

verwandte Informationen