syscall
est le moyen par défaut d'entrer en mode noyau surx86-64
. Cette instruction n'est pas disponible dans les modes de fonctionnement 32 bits sur les processeurs Intel .sysenter
est une instruction la plus fréquemment utilisée pour invoquer des appels système dans les modes de fonctionnement 32 bits. Il est similaire àsyscall
, un peu plus difficile à utiliser cependant, mais c'est le problème du noyau.int 0x80
est une façon héritée d'invoquer un appel système et doit être évitée.
La manière préférée d'invoquer un appel système est d'utiliser vDSO, une partie de la mémoire mappée dans chaque espace d'adressage de processus qui permet d'utiliser les appels système plus efficacement (par exemple, en n'entrant pas du tout en mode noyau dans certains cas). vDSO prend également en charge plus difficile, par rapport à l'ancien int 0x80
façon, la gestion de syscall
ou sysenter
consignes.
Voir aussi ceci et cela.
Ma réponse couvre votre question.
En pratique, les noyaux récents implémentent un VDSO, notamment pour optimiser dynamiquement les appels système (le noyau définit le VDSO sur un code meilleur pour le processeur actuel). Vous devez donc utiliser le VDSO, et vous ferez mieux d'utiliser, pour les appels système existants, l'interface fournie par la libc.
Notez que, AFAIK, une partie importante du coût des appels système simples va de l'espace utilisateur au noyau et vice-versa. Par conséquent, pour certains appels système (probablement gettimeofday
, getpid
...) le VDSO pourrait même éviter cela (et techniquement pourrait éviter de faire un véritable appel système). Pour la plupart des appels système (comme open
, read
, send
, mmap
....) le coût du noyau de l'appel système est suffisamment important pour améliorer la transition de l'espace utilisateur à l'espace noyau (par exemple, en utilisant SYSENTER
ou SYSCALL
instructions machine au lieu de INT
) insignifiant.
Attention à cela avant de changer :les numéros d'appel système diffèrent lorsque vous faites 0x80 ou syscall, par exemple sys_write vaut 4 avec 0x80 et 1 avec syscall.
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html pour 32 bits ou 0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 pour l'appel système