Je sais que l'interface d'appel système est implémentée à un niveau bas et dépend donc de l'architecture / de la plateforme, pas du code "générique".
Cependant, je ne vois pas clairement pourquoi les appels système dans les noyaux Linux 32 bits x86 ont des numéros qui ne sont pas conservés de la même façon dans l'architecture similaire Linux 64 bits x86_64? Quelle est la motivation / raison derrière cette décision?
Ma première hypothèse était qu'une raison en arrière-plan consistait à laisser les applications 32 bits exécutables sur un système x86_64, de sorte que, via un décalage raisonnable vers le numéro d'appel du système, le système sache que l'espace utilisateur est de 32 ou 64 bits. respectivement. Ceci est cependant pas le cas. Au moins, il me semble que read () étant le numéro d'appel système 0 dans x86_64 ne peut pas être aligné sur cette idée.
Une autre hypothèse est que la modification des numéros d'appel système pourrait avoir un arrière-plan de sécurité / renforcement, ce que je n'ai pas pu confirmer moi-même.
Ignorant les défis de la mise en œuvre des parties de code dépendantes de l'architecture, je me demande encore comment changer les numéros d'appel système , quand il ne semble pas nécessaire (car même un registre 16 bits stockerait beaucoup plus que les ~ 346 numéros actuels pour représenter tous appels), aiderait à réaliser quoi que ce soit, mis à part rompre la compatibilité (bien que l’utilisation des appels système via une bibliothèque, libc, l’atténue).
la source
Réponses:
En ce qui concerne le raisonnement derrière la numérotation spécifique, qui ne correspond à aucune autre architecture [à l'exception de "x32" qui ne fait en réalité que partie de l'architecture x86_64]: Au tout début du support x86_64 dans le noyau Linux, il n'y en avait pas contraintes de compatibilité ascendante graves, tous les appels système ont été renumérotés pour l’optimiser au niveau d’utilisation de la cacheline .
Je ne sais pas assez sur le développement du noyau de connaître la base spécifique pour ces choix, mais apparemment , il y a un certain logique derrière le choix de tout renumérotation avec ces chiffres particuliers plutôt que de simplement copier la liste à partir d' une architecture existante et supprimer ceux non utilisés. Il semble que l'ordre puisse être basé sur la fréquence à laquelle ils sont appelés (par exemple, lecture / écriture / ouverture / fermeture sont au premier plan). Exit et fork peuvent sembler "fondamentaux", mais ils ne sont appelés qu'une seule fois par processus.
Il se peut également que quelque chose soit en cours pour conserver les appels système couramment utilisés ensemble dans la même ligne de cache (ces valeurs ne sont que des entiers, mais il existe dans le noyau une table avec des pointeurs de fonction pour chacun, de sorte que chaque groupe de 8 appels système occupe une ligne de cache de 64 octets pour cette table)
la source
fork may seem "fundamental", but [...] called only once per process.
Quoi? Si j'ai bien compris, vous pouvez vous attendre à appeler la sortie une fois, mais vous pouvez vous rapprocher du parent et de l'enfant d'unfork()
appelfork
que le processus enfant est comptabilisé (c.-à-d. visualisez-le comme l'appel de création du processus), plutôt que le processus parent, l'instruction de Random832 est correcte.Voir la réponse à la question "Pourquoi les numéros d’appel système sont-ils différents dans amd64 linux?" débordement de pile.
En résumé: pour des raisons de compatibilité, la liste des appels système est stable et ne peut que s'allonger. Lorsque l’architecture x86 64 est apparue, l’ABI (argument passant, valeur renvoyée) était différente, les développeurs du noyau ont donc profité de l’occasion pour apporter des modifications tant attendues.
la source
En bref, parce que quelqu'un pensait que "des
N+1
manières de le faire gratuitement incompatibles sont meilleures que desN
manières". Pour les arcs historiques, les numéros d'appels système étaient généralement choisis pour correspondre à un unix propriétaire hérité. Mais pour x86_64, les développeurs du noyau étaient libres de choisir la numérotation de leur choix. Plutôt que de faire le simple choix et de réutiliser une numérotation existante, ils ont choisi d’inventer une nouvelle norme. Ensuite, ils l'ont fait à nouveau pour aarch64 et pour un groupe d'autres. C'est un motif souvent répété dans le développement du noyau Linux.la source