web-dev-qa-db-fra.com

Quoi de mieux "int 0x80" ou "syscall"?

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

56
Alex
  • 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.

Voir aussi this et this .

73
Paweł Dziepak

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.

19

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

7
Thomas