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
4 réponses
-
syscall
est la manière par défaut d'entrer en mode noyau surx86-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.
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.
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
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.