Systemaufrufe: Unterschied zwischen den Versionen
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 | 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.