J'ai étudié le noyau Linux et j'ai découvert que pour x86_64
architecture l'interruption int 0x80
ne fonctionne pas comme appel pour un appel système.
La question est: en cas de x86
architecture ce qui est préférable syscall
ou int 0x80
et pourquoi?
EDIT : J'utilise le noyau 3.4
syscall
est le moyen par défaut d'entrer en mode noyau sur x86-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 appeler des appels système dans des modes de fonctionnement 32 bits. Il est similaire à syscall
, un peu plus difficile à utiliser cependant, mais c'est la préoccupation du noyau.int 0x80
est un moyen hérité d'invoquer un appel système et doit être évité.Le moyen préférable d'appeler un appel système consiste à 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 dans le mode noyau dans certains cas). VDSO s'occupe également de plus difficile, par rapport à l'héritage int 0x80
way, gestion des instructions syscall
ou sysenter
.
Ma réponse ici couvre votre question.
Dans la pratique, les noyaux récents implémentent un VDSO , notamment pour optimiser dynamiquement les appels système (le noyau définit le VDSO sur le code le mieux adapté au processeur actuel). Vous devriez 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 peut même éviter cela (et techniquement, é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 apporter des améliorations de la transition de l'espace utilisateur vers l'espace noyau (par exemple en utilisant SYSENTER
ou SYSCALL
instructions machine au lieu de INT
) insignifiantes.
Méfiez-vous de ceci avant de changer: les numéros d'appel système diffèrent lors de l'exécution de 0x80 ou syscall, par exemple sys_write est 4 avec 0x80 et 1 avec syscall.
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html pour 32 bits ou 0x80 http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64 pour syscall