Je vois beaucoup de gens référencer en ligne
arch/x86/entry/syscalls/syscall_64.tbl
pour la table syscall, cela fonctionne bien. Mais beaucoup d'autres font référence
/include/uapi/asm-generic/unistd.h
qui se trouve généralement dans le paquet d'en-têtes. Comment se fait-il que les syscall_64.tbl
spectacles,
0 common read sys_read
La bonne réponse, et unistd.h
montre,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
Et puis ça se voit __NR_read
comme
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
Pourquoi est-ce 63, et non 1? Comment puis-je comprendre le sens de /include/uapi/asm-generic/unistd.h
? Il /usr/include/asm/
y a toujours
/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
Quelqu'un pourrait-il me dire la différence entre ces unistd
fichiers. Expliquez comment ça unistd.h
marche? Et quelle est la meilleure méthode pour trouver la table syscall?
tux
appel système ).J'ai une page qui répertorie tous les appels système pour chaque architecture prise en charge par Linux:
https://fedora.juszkiewicz.com.pl/syscalls.html
la source
63 est
read
enarm64
, 0 estread
enx86_64
Les numéros d'appel système sont différents pour chaque architecture.
Les numéros arm64 par exemple sont définis à:
include/uapi/asm-generic/unistd.h
ce qui montre que 63, voir aussi: /reverseengineering/16917/arm64-syscalls-table/18834#18834Comme expliqué dans cette réponse, je pense que include / uapi / asm-generic / unistd.h est une nouvelle tentative d'unifier les numéros d'appel système sur toutes les arches.
Mais comme les numéros syscall ne peuvent pas changer pour ne pas casser l'API syscall, les anciennes arches avant cet effort d'unification ont conservé les anciens numéros.
Cette question demande un moyen automatisé d'obtenir la liste complète des appels système, y compris les paramètres: /programming/6604007/how-can-i-get-a-list-of-linux-system-calls-and- nombre d'arguments qu'ils prennent automatiquement
strace
code sourceJe fais confiance à cet outil, et ils gardent leurs données en ordre
linux/
, par exemple:Notez que l'aarch64 est l'arn
#include
agnostique64/syscallent.h
dont j'ai parlé plus tôt.Ces tables contiennent le nombre d'arguments, mais pas les types d'arguments réels, je me demande où les
strace
code.la source
Cette réponse ne touchera pas à la
asm-generic
version deunistd.h
, car rien ne l'inclut. 1Comme indiqué dans
syscalls(2)
:Autrement dit, les numéros d'appel système corrects se trouvent dans
/usr/include/asm/unistd.h
. Maintenant, sur un système x86 typique, cela inclura simplement l'un desasm/unistd_*.h
fichiers en fonction de la cible.Les numéros d'appel système appropriés pour un programme 64 bits sont inclus
asm/unistd_64.h
, et ceux pour un programme 32 bitsasm/unistd_32.h
(ou la_x32.h
variante presque équivalente ). Les deux sont différents car les architectures 32 et 64 bits sont, en fait, des systèmes d'exploitation complètement différents. Ils partagent le même ensemble d'appels système, mais pas dans le même ordre, pour diverses raisons.La plupart d'entre eux ont également des wrappers en langage C, donc vous aurez rarement besoin d'utiliser
syscall(2)
directement.1 Et parce que je ne sais pas à quoi ça sert.
la source
Pour ajouter toutes les bonnes réponses, il existe un utilitaire
ausyscall
qui peut être utilisé pour répertorier tous les appels système et leurs mappages entiers pour l'architecture particulière.par exemple:
la source