web-dev-qa-db-fra.com

Pourquoi les numéros d'appel système Linux sont-ils différents dans X86 et X86_64?

Je sais que l'interface d'appel système est implémentée sur un niveau bas et donc une architecture/plate-forme dépendante, pas un code "générique".

Pourtant, je ne peux pas voir clairement la raison pour laquelle les appels de système dans les noyaux Linux 32 bits X86 ont des chiffres qui ne sont pas restés les mêmes dans l'architecture similaire Linux 64 bits X86_64? Quelle est la motivation/la raison derrière cette décision?

Ma première hypothèse a été qu'une raison d'établissement a été de conserver des applications 32 bits exécutées sur un système X86_64, de sorte que via un décalage raisonnable au numéro d'appel système, le système saurait que l'espace utilisateur est 32 bits ou 64 bits respectivement. Ceci est cependant pas le cas. Au moins, il me semble que lire () être un appel système 0 en x86_64 ne peut pas être aligné avec cette pensée.

Une autre hypothèse a été que la modification des numéros d'appel système pourrait avoir un fond de sécurité/durcissement, quelque chose que je n'ai pas pu me confirmer.

Être ignorant les défis de la mise en œuvre des pièces de code dépendant de l'architecture, je me demande toujours comment changer les numéros d'appel système, quand il semble qu'aucun registre 16 bits stockerait en grande partie que la Actuellement ~ 346 numéros pour représenter tous les appels), aiderait à réaliser quoi que ce soit, autrement que la compatibilité de pause (Bien que l'utilisation du système appelle à travers une bibliothèque, libc, l'atteste).

35
humanityANDpeace

En ce qui concerne le raisonnement derrière la numérotation spécifique, qui ne correspond à aucune autre architecture [sauf "x32" qui ne fait que partie de l'architecture x86_64]: les premiers jours du support x86_64 dans le noyau Linux, avant qu'il n'y ait eu aucun Sérieuses contraintes de compatibilité à l'envers, tous les appels système ont été renumérotés pour l'optimiser au niveau d'utilisation Cacheline .

Je n'en sais pas assez sur le développement du noyau pour connaître la base spécifique de ces choix, mais apparemment il y a Certains Logique derrière le choix pour renuméroter tout avec ces chiffres plutôt que de simplement copier la liste de une architecture existante et retirez les inutilisés. On dirait que l'ordre peut être basé sur la façon dont ils sont communément appelés - par exemple. lire/écrire/ouvrir/fermer sont à l'avance. La sortie et la fourche peuvent sembler "fondamentales", mais elles s'appellent chacune une fois par processus.

Il peut également y avoir quelque chose à propos de garder les appels de système couramment utilisés ensemble dans la même ligne de cache (ces valeurs ne sont que des entiers, mais il y a une table dans le noyau avec des pointeurs de fonction pour chacun, chaque groupe de 8 appels système occupe donc une ligne de cache de 64 octets pour cette table)

34
Random832

Voir cette réponse à la question "Pourquoi les numéros d'appel système sont-ils différents dans AMD64 Linux?" sur le débordement de la pile.

Pour résumer: Pour la compatibilité, la liste des appels système est stable et ne peut que grandir. Lorsque l'architecture X86 64 est apparue, l'ABI (argument qui passe, la valeur renvoyée) était différente, les développeurs de noyau ont permis d'apporter l'occasion d'apporter des changements qui attendaient depuis longtemps.

15
xhienne