Systemaufrufe: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
Zeile 108: Zeile 108:
Eine vollständige Liste der verfügbaren Linux-Systemaufrufe und deren Nummern finden Sie in den entsprechenden Header-Dateien des Systems, wie z.B. in /usr/include/asm/unistd.h oder online in den offiziellen Linux-Kernel-Dokumentationen.
Eine vollständige Liste der verfügbaren Linux-Systemaufrufe und deren Nummern finden Sie in den entsprechenden Header-Dateien des Systems, wie z.B. in /usr/include/asm/unistd.h oder online in den offiziellen Linux-Kernel-Dokumentationen.


Eine häufig verwendete Referenz für Systemaufrufe ist die Man-Seite (man 2 syscall). Eine umfassendere Liste spezifisch für den ARM64-Architektur finden Sie hier. https://chrome.google.com/webhp?ie=UTF-8&rct=j&sclient=psy-ab&q=linux+arm64+syscall+number+list&oq=linux+arm64+syscall+number+list&gs_l=serp
Eine häufig verwendete Referenz für Systemaufrufe ist die Man-Seite (man 2 syscall). Eine umfassendere Liste spezifisch für den ARM64-Architektur habe ich hier erstellt: [[Übersicht der Linux ARM64 Systemaufrufen]]


Mit diesen Grundlagen und Beispielen sollten Anfänger in der Lage sein, grundlegende Systemaufrufe im ARM64-Assembler zu verstehen und in ihren Programmen zu verwenden.
Mit diesen Grundlagen und Beispielen sollten Anfänger in der Lage sein, grundlegende Systemaufrufe im ARM64-Assembler zu verstehen und in ihren Programmen zu verwenden.

Version vom 4. April 2025, 13:04 Uhr

Systemaufrufe

In diesem Kapitel werden wir uns mit Systemaufrufen unter Linux beschäftigen. Insbesondere werden wir:

Eine Einführung in Linux-Systemaufrufe geben, Grundlegende Systemaufrufe wie exit, read, write, open und close kennenlernen und Erklären, wie Parameter übergeben und Rückgabewerte entgegengenommen werden. Einführung in Linux-Systemaufrufe

Systemaufrufe sind Schnittstellen, die es Programmen ermöglichen, Dienste und Funktionen des Betriebssystems in Anspruch zu nehmen. Diese können niedrigere Eingabe-/Ausgabe-Funktionen, Prozesssteuerung, Speicherverwaltung und mehr umfassen. In ARM64-Assembler verwenden wir den svc-Befehl, um Systemaufrufe auszuführen. Dabei tragen wir die Nummer des spezifischen Systemaufrufs in Register x8 ein und die Parameter in Registers x0 bis x5.

Grundlegende Systemaufrufe

exit

Dieser Systemaufruf beendet das Programm.

Syntax:

mov x8, #93 // syscall number for exit mov x0, #0 // exit code (0 for success) svc 0


read

Dieser Systemaufruf liest Daten von einer Datei.

Syntax:

mov x8, #63 // syscall number for read mov x0, #file_desc // file descriptor (0 for stdin) mov x1, #buffer // buffer to store the read data mov x2, #size // number of bytes to read svc 0


write

Dieser Systemaufruf schreibt Daten in eine Datei.

Syntax:

mov x8, #64 // syscall number for write mov x0, #file_desc // file descriptor (1 for stdout) mov x1, #buffer // buffer with data to write mov x2, #size // number of bytes to write svc 0


open

Dieser Systemaufruf öffnet eine Datei und gibt einen Datei-Deskriptor zurück.

Syntax:

mov x8, #56 // syscall number for openat mov x0, #-100 // AT_FDCWD (current working directory) mov x1, #filename // pointer to the filename string mov x2, #flags // flags (e.g., O_RDONLY for read only) svc 0


close

Dieser Systemaufruf schließt eine Datei.

Syntax:

mov x8, #57 // syscall number for close mov x0, #file_desc // file descriptor svc 0

Übergabe von Parametern und Entgegennahme von Rückgabewerten

Die Übergabe von Parametern erfolgt über bestimmte Register:

x0 bis x5 für die ersten sechs Argumente x8 für die Systemaufrufnummer

Rückgabewerte werden in x0 zurückgegeben.

Beispiel:

.global _start

.section .data hello_msg: .asciz "Hello, World!\n"

_start:

   // write system call
   mov x0, #1         // file descriptor (1 for stdout)
   ldr x1, =hello_msg // buffer
   mov x2, #13        // size
   mov x8, #64        // syscall number for write
   svc 0
   // exit system call
   mov x0, #0         // exit code
   mov x8, #93        // syscall number for exit
   svc 0


In diesem Beispiel wird die Zeichenkette "Hello, World!\n" auf die Standardausgabe geschrieben und danach das Programm mit dem Rückgabewert 0 beendet.

Verweis auf alle verfügbaren Linux-Systemaufrufe

Eine vollständige Liste der verfügbaren Linux-Systemaufrufe und deren Nummern finden Sie in den entsprechenden Header-Dateien des Systems, wie z.B. in /usr/include/asm/unistd.h oder online in den offiziellen Linux-Kernel-Dokumentationen.

Eine häufig verwendete Referenz für Systemaufrufe ist die Man-Seite (man 2 syscall). Eine umfassendere Liste spezifisch für den ARM64-Architektur habe ich hier erstellt: Übersicht der Linux ARM64 Systemaufrufen

Mit diesen Grundlagen und Beispielen sollten Anfänger in der Lage sein, grundlegende Systemaufrufe im ARM64-Assembler zu verstehen und in ihren Programmen zu verwenden.