Qu'est-ce qui est 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 un appel système.

la question est: dans le cas de x86 architecture ce qui est plus préférable syscall ou int 0x80 et pourquoi?

EDIT : j'utilise le noyau 3.4

46
demandé sur Alex 2012-10-09 22:56:52

4 réponses

  • syscall est la manière par défaut d'entrer en mode noyau sur x86-64 . Cette instruction n'est pas disponible en mode 32 bits d'opération sur les processeurs Intel .
  • sysenter est une instruction la plus fréquemment utilisée pour invoquer les appels système dans les modes de fonctionnement à 32 bits. Il est similaire à syscall , un peu plus difficile à utiliser, mais c'est la préoccupation du noyau.
  • int 0x80 est un héritage façon pour invoquer un appel système et devrait être évitée.

la meilleure façon d'invoquer un appel système est d'utiliser VDSO, une partie de la mémoire cartographiée dans chaque espace d'adresse de processus qui permet d'utiliser les appels système plus efficacement (par exemple, en n'entrant pas le mode noyau dans certains cas). VDSO s'occupe également de plus difficile, par rapport à l'héritage int 0x80 voie, la manipulation de syscall ou sysenter instructions.

Voir aussi ce et ce .

63
répondu Paweł Dziepak 2012-10-09 19:48:25

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 place le VDSO dans le meilleur des codes pour le processeur actuel). Vous devriez donc utiliser le VDSO, et vous utiliserez mieux, pour les appels syscal existants, l'interface fournie par la libc.

avis que, AFAIK, une partie importante du coût de simple syscalls passe de l'espace utilisateur au noyau et vice-versa. Par conséquent, pour certains appels syscall (probablement gettimeofday , getpid ...) le VDSO pourrait même éviter cela (et techniquement éviter de faire un véritable appel syscall). Pour la plupart des appels open , read , send , mmap ....) le coût du noyau du syscall est suffisamment élevé pour améliorer la transition de l'espace utilisateur au noyau (par exemple en utilisant les instructions de la machine SYSENTER ou SYSCALL au lieu de INT ) insignifiant.

18
répondu Basile Starynkevitch 2017-05-23 11:46:40

méfiez-vous de cela avant de changer: les numéros d'appel système diffèrent en faisant 0x80 ou syscall, E. g sys_write est de 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

5
répondu Thomas 2013-10-08 20:06:32

int 0x80 est une meilleure terminologie pour indiquer son appel système au noyau pour lui dire de faire quelque chose.

le sens et l'interprétation sont interchangeables, "make a syscall" ou "issue in 80h".

ce n'est pas différent des jours de DOS:

  • invoquer int 21h pour obtenir DOS pour faire quelque chose de depedning sur le registre AX et éventuellement ES:le registre DX paire,
  • int 13h est le gestionnaire de disque dur BIOS.
  • int 10h est L'écran EGA/VGA.
  • int 09h est le gestionnaire de clavier.

Quel est le thème commun ici est que, lorsqu'une interruption/syscall est invoquée, le noyau vérifie l'état des registres pour voir quel type de système d'appel est nécessaire. En regardant par exemple, eax enregistrer, par exemple, et de déterminer ce qu'il faut effectuer, contexte interne commute dans l'espace du noyau, exécute la procédure et le commutateur de contexte de nouveau à l'espace de l'utilisateur, avec une option pour retourner les résultats de l'appel, i.e. était-il réussi ou était-il en panne.

-3
répondu t0mm13b 2012-10-09 19:11:03