Réponses:
Le fichier /proc/kallsyms
répertorie tous les symboles du noyau en cours d'exécution. Par convention, les appels système ont un nom commençant par sys_
. Sur un système 64 bits, les appels système pour les programmes 32 bits ont un nom commençant par sys32_
. Strictement parlant, cela répertorie les fonctions internes du noyau, pas les appels système, mais je pense que la correspondance fonctionne (chaque appel système appelle une fonction interne du noyau pour faire le travail, et je pense que le nom est toujours le nom de l'appel système avec sys_
préfixé ).
</proc/kallsyms sed -n 's/.* sys_//p'
Il ne s'agit généralement pas d'informations utiles, car les appels système changent très lentement. Les composants facultatifs fournissent des fonctionnalités en termes d'appels système existants, en utilisant des fonctionnalités générales telles que les périphériques (avec ioctl quand read
et write
ne le coupent pas), les systèmes de fichiers, les sockets, etc. La détermination de la liste des appels système pris en charge ne vous dira rien sur les fonctionnalités que le système prend en charge. D'autres noms de fonctions internes ne seront pas utiles non plus car ils changent très rapidement: le nom de la fonction qui implémente certaines fonctionnalités sur une version du noyau peut changer sur la version suivante.
J'ai continué à trouver de nouvelles alternatives lors de l'écriture de cette réponse, alors j'ai juste écrit un peu de détails sur chacun d'eux et fait quelques statistiques. Fondamentalement, vous pouvez soit:
/proc
)./sys
répertoire.Après avoir fait le calcul, je recommanderais (parmi mes alternatives) d'utiliser le /sys
système de fichiers, car il semble donner le meilleur résultat en termes de nombre d'appels système. Vous pouvez passer directement à cette section si vous ne voulez pas en savoir plus sur les autres astuces.
Bien que vous puissiez en manquer certains, vous pouvez utiliser apropos
pour répertorier toutes les pages de manuel appartenant à la section 2 (appels système):
$ apropos -s2 . | awk '{print $1}' | column
Supprimez column
si vous ne voulez pas de sortie en colonnes fantaisie.
Je viens de le découvrir, mais il existe une page de manuel Linux sur les appels système, et vous pourrez en trouver la plupart.
$ man syscalls
Je suis également tombé sur ces deux sites web qui pourraient être intéressants:
Edit: Maintenant, quand il s'agit de déterminer par programmation (ou du moins, sans s'appuyer sur des fonctionnalités documentées) quels appels système sont disponibles, j'ai peur que le noyau ne garde pas une table de ses appels système, du moins pas sous la forme de une liste de chaînes (comme vous vous attendez probablement à les manipuler). À ce niveau, nous parlons plus d'adresses de fonctions et de pointeurs, plutôt que de noms de fonctions.
Je viens de parcourir mon /usr/include
répertoire et j'ai grep
noté quelques choses: vous pourriez trouver les répertoires suivants intéressants. Certains d'entre eux peuvent être différents sur votre machine, selon votre architecture et votre distribution, mais je suis sûr que vous pourrez les adapter.
En recherchant des définitions de fonctions dans ce fichier, vous rencontrerez de nombreux appels système, même s'ils n'y seront pas entièrement définis. J'ai exécuté quelques grep
s dans ces répertoires et j'ai pu trouver des mentions de certains appels système. Voici un exemple:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
Donc, je suppose qu'une autre façon d'en trouver certains serait:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
Une autre solution consiste à utiliser le code source du noyau lui-même (et pas seulement les en-têtes!), Et à trouver un moyen de le rechercher efficacement. Depuis que le noyau a validé 303395ac3bf3e2cb488435537d416bc840438fcb , vous pourriez trouver cela un peu plus facile qu'auparavant. Voici un exemple pour 3.13 (qui est mon noyau):
$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/arch/x86/syscalls/syscall_64.tbl?id=refs/tags/v3.13 -O syscall_64.tbl
Maintenant que vous avez la table syscalls, parcourez-la:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
Vous pouvez trouver un moyen, en utilisant uname
et arch
, pour télécharger le tbl
fichier directement depuis git.kernel.org , en fonction de la version et de l'architecture de votre noyau en cours d'exécution.
/sys
système de fichiersLa réponse de Gilles m'a donné un peu d'inspiration, et vous pouvez trouver ces appels système à l'intérieur /sys/kernel/debug/tracing/events/syscalls
. Ce répertoire est utilisé pour surveiller l'utilisation de chaque appel système sur le système. Chaque syscall contient deux répertoires:
Par conséquent, l' utilisation ls
, grep
et cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
Sur mon système:
grep
-la présence __SYSCALL
dans les fichiers d'en-tête a révélé 212 appels système./sys
290 appels système révélés.Maintenant, si je rassemble tout ...
$ apropos -s2 . | awk '{print $1}' > system_calls.txt
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')' >> system_calls.txt
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl >> system_calls.txt
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3 >> system_calls.txt
$ sort < system_calls.txt | uniq | wc -l
707
Voilà, 707 appels système! Bien sûr, ce nombre reflète une définition très flexible d'un "appel système", car 3.13 est censé fournir 274 appels système uniquement (la lecture /sys
semble être la solution la plus proche).
Toutes les réponses sont bonnes.
Si vous recherchez un nom d'appel système spécifique:
$ cat /proc/kallsyms | grep <sys_call_name>
Si vous recherchez la liste de tous les appels système:
$ cat /proc/kallsyms
/proc/kallsyms
peut être manipulé comme n'importe quel autre fichier, il devient assez facile de l'utiliser dans un programme.