7 votes

Les appels système sous linux x86_64 génèrent-ils toujours des interruptions ?

Dans les anciennes versions de l'architecture linux, les appels système généraient toujours une interruption pendant leur exécution. Ils étaient exécutés en plaçant le numéro d'appel système dans %eax et les paramètres dans %ebx, %ecx et ainsi de suite, puis en émettant l'interruption spécifique int 0x80. On peut donc dire que les appels système sont une cause courante d'interruptions logicielles sur un système.

Cependant, sur les architectures modernes de x86_64, il existe une instruction d'appel système spécifique "syscall", qui contourne la nécessité d'utiliser l'interruption 0x80, et donc, la table des descripteurs d'interruption du tout. Bien que je pense que la méthode précédente de génération d'une interruption pour syscall soit toujours supportée, l'instruction syscall semble être la façon de procéder en pratique.

Ma question est donc la suivante : n'est-il plus correct de dire que les appels système génèrent des interruptions ? Un appel système incrémenterait-il toujours le nombre d'interruptions indiqué dans la colonne "interruptions" de vmstat, par exemple ?

6voto

John Mahowald Points 28597

Oui, le code C moderne pour Linux x86_64 utilise l'instruction syscall, voir par exemple glibc sysdeps/unix/sysv/linux/x86_64/syscall.S. Non, cela ne signifie pas que les interruptions d'appel système disparaissent, pour des raisons de compatibilité.

https://www.kernel.org/doc/Documentation/x86/entry_64.txt

L'architecture x86 offre de nombreux moyens de passer à l'action code du noyau. La plupart de ces points d'entrée sont enregistrés dans arch/x86/kernel/traps.c et implémentés dans arch/x86/entry/entry_64.S pour le 64 bits, arch/x86/entry/entry_32.S pour le 32 bits et enfin arch/x86/entry/entry_64_compat.S qui implémente l'entrée syscall de compatibilité 32 bits points d'entrée syscall de compatibilité 32 bits et fournit ainsi des processus la possibilité d'exécuter des syscalls lorsque le processus 64 bits.

Les affectations des vecteurs IDT sont répertoriées dans arch/x86/include/asm/irq_vectors.h.

Certaines de ces entrées sont :

  • system_call : instruction syscall du code 64 bits.

  • entry_INT80_compat : int 0x80 à partir de code 32-bit ou 64-bit ; compat syscall dans les deux cas.

  • entry_INT80_compat, ia32_sysenter : syscall et sysenter à partir de code 32 bits

Et pour les appels système en lecture seule (gettimeofday), il existe vDSO qui n'entre pas du tout en mode noyau.

Les appels système peuvent être profilés de plusieurs façons, comme ftrace ou eBPF. En plus d'être obsolètes en mode 64 bits, les interruptions se produisent pour des raisons autres que les appels système.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X