GNU/Linux >> Tutoriels Linux >  >> Linux

Quel est le meilleur int 0x80 ou syscall en code 32 bits sous Linux ?

  • 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 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


Linux
  1. Linux - Parties propriétaires ou fermées du noyau ?

  2. Que sont les codes de sortie Bash sous Linux

  3. Comment charger les modules du noyau Linux à partir du code C ?

  4. Espace d'adressage du processus 32 bits sur Linux 64 bits

  5. Que signifie __init dans le code du noyau Linux ?

Que faire en cas de panique du noyau Linux

Qu'est-ce qui rend un serveur Linux noyau fondamental ?

Limiter l'accès aux appels système pour une application Linux

Qu'est-ce que cela signifie de dire que le noyau Linux est préemptif ?

Quelle est la source actuelle du noyau Linux ?

Que sont exactement les en-têtes du noyau Linux ?