Systemaufrufe: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
KKeine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
In diesem Kapitel werden wir uns mit Systemaufrufen unter Linux beschäftigen. Insbesondere werden wir: | In diesem Kapitel werden wir uns mit Systemaufrufen unter Linux beschäftigen. Insbesondere werden wir: | ||
| Zeile 6: | Zeile 4: | ||
Grundlegende Systemaufrufe wie exit, read, write, open und close kennenlernen und | Grundlegende Systemaufrufe wie exit, read, write, open und close kennenlernen und | ||
Erklären, wie Parameter übergeben und Rückgabewerte entgegengenommen werden. | Erklären, wie Parameter übergeben und Rückgabewerte entgegengenommen werden. | ||
Einführung in Linux-Systemaufrufe | == 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. | 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 | == Grundlegende Systemaufrufe == | ||
exit | === exit === | ||
Dieser Systemaufruf beendet das Programm. | Dieser Systemaufruf beendet das Programm. | ||
Syntax: | Syntax: | ||
<syntaxhighlight lang="asm"> | |||
mov x8, #93 // syscall number for exit | mov x8, #93 // syscall number for exit | ||
mov x0, #0 // exit code (0 for success) | mov x0, #0 // exit code (0 for success) | ||
svc 0 | svc 0 | ||
</syntaxhighlight> | |||
=== read === | |||
read | |||
Dieser Systemaufruf liest Daten von einer Datei. | Dieser Systemaufruf liest Daten von einer Datei. | ||
Syntax: | Syntax: | ||
<syntaxhighlight lang="asm"> | |||
mov x8, #63 // syscall number for read | mov x8, #63 // syscall number for read | ||
mov x0, #file_desc // file descriptor (0 for stdin) | mov x0, #file_desc // file descriptor (0 for stdin) | ||
| Zeile 34: | Zeile 32: | ||
mov x2, #size // number of bytes to read | mov x2, #size // number of bytes to read | ||
svc 0 | svc 0 | ||
</syntaxhighlight> | |||
=== write === | |||
write | |||
Dieser Systemaufruf schreibt Daten in eine Datei. | Dieser Systemaufruf schreibt Daten in eine Datei. | ||
Syntax: | Syntax: | ||
<syntaxhighlight lang="asm"> | |||
mov x8, #64 // syscall number for write | mov x8, #64 // syscall number for write | ||
mov x0, #file_desc // file descriptor (1 for stdout) | mov x0, #file_desc // file descriptor (1 for stdout) | ||
| Zeile 47: | Zeile 45: | ||
mov x2, #size // number of bytes to write | mov x2, #size // number of bytes to write | ||
svc 0 | svc 0 | ||
</syntaxhighlight> | |||
=== open === | |||
open | |||
Dieser Systemaufruf öffnet eine Datei und gibt einen Datei-Deskriptor zurück. | Dieser Systemaufruf öffnet eine Datei und gibt einen Datei-Deskriptor zurück. | ||
Syntax: | Syntax: | ||
<syntaxhighlight lang="asm"> | |||
mov x8, #56 // syscall number for openat | mov x8, #56 // syscall number for openat | ||
mov x0, #-100 // AT_FDCWD (current working directory) | mov x0, #-100 // AT_FDCWD (current working directory) | ||
| Zeile 60: | Zeile 58: | ||
mov x2, #flags // flags (e.g., O_RDONLY for read only) | mov x2, #flags // flags (e.g., O_RDONLY for read only) | ||
svc 0 | svc 0 | ||
</syntaxhighlight> | |||
=== close === | |||
close | |||
Dieser Systemaufruf schließt eine Datei. | Dieser Systemaufruf schließt eine Datei. | ||
Syntax: | Syntax: | ||
<syntaxhighlight lang="asm"> | |||
mov x8, #57 // syscall number for close | mov x8, #57 // syscall number for close | ||
mov x0, #file_desc // file descriptor | mov x0, #file_desc // file descriptor | ||
svc 0 | svc 0 | ||
</syntaxhighlight> | |||
Übergabe von Parametern und Entgegennahme von Rückgabewerten | == Übergabe von Parametern und Entgegennahme von Rückgabewerten == | ||
Die Übergabe von Parametern erfolgt über bestimmte Register: | Die Übergabe von Parametern erfolgt über bestimmte Register: | ||
x0 bis x5 für die ersten sechs Argumente | * x0 bis x5 für die ersten sechs Argumente | ||
x8 für die Systemaufrufnummer | * x8 für die Systemaufrufnummer | ||
Rückgabewerte werden in x0 zurückgegeben. | Rückgabewerte werden in x0 zurückgegeben. | ||
Beispiel: | Beispiel: | ||
<syntaxhighlight lang="asm"> | |||
.global _start | .global _start | ||
| Zeile 100: | Zeile 99: | ||
mov x8, #93 // syscall number for exit | mov x8, #93 // syscall number for exit | ||
svc 0 | svc 0 | ||
</syntaxhighlight> | |||
In diesem Beispiel wird die Zeichenkette "Hello, World!\n" auf die Standardausgabe geschrieben und danach das Programm mit dem Rückgabewert 0 beendet. | 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 | == 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 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 ([https://man7.org/linux/man-pages/man2/syscalls.2.html man 2 syscall]). Eine umfassendere Liste spezifisch für den ARM64-Architektur habe ich hier erstellt: [[Übersicht der Linux ARM64 Systemaufrufen]] | Eine häufig verwendete Referenz für Systemaufrufe ist die Man-Seite ([https://man7.org/linux/man-pages/man2/syscalls.2.html man 2 syscall]). Eine umfassendere Liste spezifisch für den ARM64-Architektur habe ich hier erstellt: [[Übersicht der Linux ARM64 Systemaufrufen]] | ||
Version vom 7. April 2025, 06:52 Uhr
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