Ich sehe viele Leute, die online referenzieren
arch/x86/entry/syscalls/syscall_64.tbl
Für die Syscall-Tabelle funktioniert das einwandfrei. Aber viele andere beziehen sich
/include/uapi/asm-generic/unistd.h
Dies ist häufig im Header-Paket enthalten. Wie kommt es, syscall_64.tbl
Shows,
0 common read sys_read
Die richtige Antwort und unistd.h
zeigt,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
Und dann zeigt es sich __NR_read
als
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
Warum ist das 63 und nicht 1? Wie verstehe ich das /include/uapi/asm-generic/unistd.h
? Immer noch /usr/include/asm/
drin ist
/usr/include/asm/unistd_x32.h
#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)
/usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
/usr/include/asm/unistd_32.h
#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
Könnte mir jemand den Unterschied zwischen diesen unistd
Dateien sagen . Erklären Sie, wie es unistd.h
funktioniert? Und was ist die beste Methode, um die Syscall-Tabelle zu finden?
tux
Syscall ).63 ist
read
inarm64
, 0 istread
inx86_64
Die Syscall-Nummern sind für jede Architektur unterschiedlich.
Die arm64-Nummern sind beispielsweise definiert unter: Dies
include/uapi/asm-generic/unistd.h
zeigt, dass 63, siehe auch: /reverseengineering/16917/arm64-syscalls-table/18834#18834Wie in dieser Antwort erläutert, ist include / uapi / asm-generic / unistd.h meiner Meinung nach ein neuerer Versuch, Syscall-Nummern über alle Bögen hinweg zu vereinheitlichen.
Da sich die Syscall-Nummern jedoch nicht ändern können, um die Syscall-API nicht zu beschädigen, haben ältere Bögen vor diesem Vereinigungsaufwand die alten Nummern beibehalten.
In dieser Frage wird nach einer automatisierten Methode zum Abrufen der vollständigen Systemaufrufliste einschließlich der Parameter gefragt: /programming/6604007/how-can-i-get-a-list-of-linux-system-calls-and- Anzahl der Argumente, die sie automatisch nehmen
strace
QuellcodeIch vertraue diesem Tool und sie halten ihre Daten sauber
linux/
, zB:Beachten Sie, dass der aarch64
#include
der Arch-Agnostiker ist, auf64/syscallent.h
den ich zuvor Bezug genommen habe.Diese Tabellen enthalten die Anzahl der Argumente, aber keine tatsächlichen Argumenttypen. Ich frage mich, wo sie
strace
codiert sind.quelle
Ich habe eine Seite, auf der alle Systemaufrufe für jede von Linux unterstützte Architektur aufgelistet sind:
https://fedora.juszkiewicz.com.pl/syscalls.html
quelle
Diese Antwort wird die
asm-generic
Version von nicht berührenunistd.h
, da nichts sie enthält. 1Wie in
syscalls(2)
:Das heißt, die richtigen Syscall-Nummern finden Sie in
/usr/include/asm/unistd.h
. Auf einem typischen x86-System enthält diesasm/unistd_*.h
je nach Ziel einfach eine der Dateien.Die für ein 64-Bit-Programm geeigneten Syscall-Nummern sind in
asm/unistd_64.h
und die für ein 32-Bit-Programm inasm/unistd_32.h
(oder die nahezu äquivalente_x32.h
Variante). Die beiden unterscheiden sich, da die 32- und 64-Bit-Architekturen praktisch völlig unterschiedliche Betriebssysteme sind. Sie verwenden aus verschiedenen Gründen denselben Satz von Systemaufrufen, jedoch nicht in derselben Reihenfolge.Die meisten davon haben auch Wrapper in C-Sprache, so dass Sie sie selten
syscall(2)
direkt verwenden müssen.1 Und weil ich nicht weiß, wofür es ist.
quelle
Um all die guten Antworten hinzuzufügen, gibt es ein Dienstprogramm, mit
ausyscall
dem alle Systemaufrufe und ihre Ganzzahlzuordnungen für die jeweilige Architektur aufgelistet werden können.z.B:
quelle