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

Mit WinMouse können Sie die Mauszeigerbewegung auf einem Windows-PC anpassen und verbessern improve
Wenn Sie die Standardfunktionen Ihres Mauszeigers verbessern möchten, verwenden Sie Freeware WinMouse. Es fügt weitere Funktionen hinzu, damit Sie das...
Linker Mausklick funktioniert nicht unter Windows 10
Wenn Sie eine dedizierte Maus mit Ihrem Laptop oder Desktop-Computer verwenden, aber die linker Mausklick funktioniert nicht unter Windows 10/8/7 aus ...
Cursor springt oder bewegt sich zufällig während der Eingabe in Windows 10
Wenn Sie feststellen, dass Ihr Mauszeiger während der Eingabe auf einem Windows-Laptop oder -Computer automatisch und zufällig springt oder sich von s...