Systemaufrufe

Was ist ein Linux-Systemaufruf??

Was ist ein Linux-Systemaufruf??

Das wichtigste zuerst

Bevor wir uns mit der Definition eines Linux-Systemaufrufs befassen und die Details seiner Ausführung untersuchen, beginnen wir am besten mit der Definition der verschiedenen Softwareschichten eines typischen Linux-Systems.

Der Linux-Kernel ist ein spezialisiertes Programm, das auf der niedrigsten verfügbaren Ebene auf Ihrer Hardware bootet und ausgeführt wird. Es hat die Aufgabe, alles zu orchestrieren, was auf dem Computer läuft, einschließlich der Handhabung von Tastatur-, Festplatten- und Netzwerkereignissen, bis hin zur Bereitstellung von Zeitscheiben für die parallele Ausführung mehrerer Programme.

Wenn der Kernel ein Programm auf Benutzerebene ausführt, virtualisiert er den Speicherplatz, sodass Programme glauben, dass sie der einzige Prozess sind, der im Speicher läuft running. Diese Schutzblase aus Hardware- und Softwareisolierung erhöht die Sicherheit und Zuverlässigkeit. Eine nicht privilegierte Anwendung kann nicht auf den Speicher anderer Programme zugreifen, und wenn dieses Programm abstürzt, wird der Kernel beendet, damit er dem Rest des Systems keinen Schaden zufügen kann.

Durchbrechen der Barriere mit Linux-Systemaufrufen

Diese Isolationsschicht zwischen nicht privilegierten Anwendungen bietet eine hervorragende Grenze zum Schutz anderer Anwendungen und Benutzer auf dem System. Ohne eine Möglichkeit, sich mit den anderen Elementen im Computer und der Außenwelt zu verbinden, könnten Programme jedoch nicht viel erreichen.

Um die Interaktion zu erleichtern, bezeichnet der Kernel ein Software-Gate, das es dem laufenden Programm ermöglicht, den Kernel anzufordern, in seinem Namen zu handeln. Diese Schnittstelle wird als Systemaufruf bezeichnet.

Da Linux der UNIX-Philosophie „Alles ist eine Datei“ folgt, können viele Funktionen durch Öffnen und Lesen oder Schreiben in eine Datei ausgeführt werden, die ein Gerät sein könnte. Unter Windows können Sie beispielsweise eine Funktion namens CryptGenRandom verwenden, um auf zufällige Bytes zuzugreifen. Unter Linux kann dies jedoch durch einfaches Öffnen der „Datei“ /dev/urandom und Lesen von Bytes daraus mithilfe von Standard-Datei-Ein-/Ausgabe-Systemaufrufen erfolgen. Dieser entscheidende Unterschied ermöglicht eine einfachere Systemaufrufschnittstelle.

Hauchdünne Hülle

In den meisten Anwendungen werden Systemaufrufe nicht direkt an den Kernel gesendet. Praktisch alle Programme verlinken in der Standard-C-Bibliothek, die einen dünnen, aber wichtigen Wrapper um Linux-Systemaufrufe bietet. Die Bibliothek stellt sicher, dass die Funktionsargumente in die richtigen Prozessorregister kopiert werden und gibt dann den entsprechenden Linux-Systemaufruf aus. Wenn Daten vom Aufruf empfangen werden, interpretiert der Wrapper die Ergebnisse und gibt sie auf konsistente Weise an das Programm zurück.

Hinter den Kulissen

Jede Funktion in einem Programm, die mit dem System interagiert, wird schließlich in einen Systemaufruf übersetzt. Um dies in Aktion zu sehen, beginnen wir mit einem einfachen Beispiel.

void main()

Dies ist wahrscheinlich das trivialste C-Programm, das Sie jemals sehen werden. Es übernimmt einfach die Kontrolle über den Haupteinstiegspunkt und verlässt es dann. Es gibt nicht einmal einen Wert zurück, da main als void definiert ist. Speichern Sie die Datei als ctest.c und kompilieren wir es:

gcc ctest.c -o ctest

Sobald es kompiliert ist, können wir die Dateigröße als 8664 Bytes sehen. Es kann auf Ihrem System leicht variieren, sollte jedoch etwa 8 k . betragen. Das ist eine Menge Code nur zum Ein- und Aussteigen! Der Grund für 8k ist, dass die libc-Laufzeit enthalten ist. Selbst wenn wir die Symbole entfernen, sind es immer noch etwas über 6k.

In einem noch einfacheren Beispiel können wir den Linux-Systemaufruf beenden, anstatt uns von der C-Laufzeit abhängig zu machen.

void _start()
asm("movl $1,%eax;"
"xorl %ebx,%ebx;"
"int  0 x 80 $");

Hier verschieben wir 1 in das EAX-Register, löschen das EBX-Register (das sonst den Rückgabewert enthalten würde) und rufen dann den Linux-Systemaufruf-Interrupt 0x80 (oder 128 dezimal) auf. Dieser Interrupt veranlasst den Kernel, unseren Aufruf zu verarbeiten.

Wenn wir unser neues Beispiel mit dem Namen asmtest . kompilieren.c, und entfernen Sie die Symbole und schließen Sie die Standardbibliothek aus:

gcc -s -nostdlib asmtest.c -o asmtest

wir produzieren eine Binärdatei mit weniger als 1k (auf meinem System ergibt es 984 Bytes). Der größte Teil dieses Codes besteht aus ausführbaren Headern. Wir rufen jetzt den direkten Linux-Systemaufruf auf.

Für alle praktischen Zwecke

In fast allen Fällen müssen Sie in Ihren C-Programmen keine direkten Systemaufrufe durchführen. Wenn Sie jedoch Assembler verwenden, kann dies erforderlich sein. Bei der Optimierung wäre es jedoch am besten, die C-Bibliotheksfunktionen die Systemaufrufe durchführen zu lassen und nur Ihren leistungskritischen Code in die Assembly-Direktiven einzubetten.

So programmieren Sie Systemaufruf-Tutorials

Liste aller Systemaufrufe

Wenn Sie eine Liste aller verfügbaren Systemaufrufe für Linux sehen möchten, können Sie diese Referenzseiten überprüfen: Vollständige Liste der Systemaufrufe unter LinuxHinweis.com, filippo.io/linux-syscall-table/ und oder syscalls.Kernelgrok.com

Installieren Sie den neuesten Dolphin Emulator für Gamecube & Wii unter Linux
Mit dem Dolphin Emulator können Sie Ihre ausgewählten Gamecube- und Wii-Spiele auf Linux-Personalcomputern (PC) spielen. Als frei verfügbarer Open-So...
So verwenden Sie die GameConqueror-Cheat-Engine unter Linux
Der Artikel enthält eine Anleitung zur Verwendung der GameConqueror-Cheat-Engine unter Linux. Viele Benutzer, die Spiele unter Windows spielen, verwen...
Beste Spielkonsolen-Emulatoren für Linux
Dieser Artikel listet beliebte Spielekonsolen-Emulationssoftware auf, die für Linux verfügbar ist. Emulation ist eine Softwarekompatibilitätsschicht, ...