Qu'a fait le bit collant à l'origine lorsqu'il est appliqué aux files?

En divers endroits, on peut voir le "sticky bit" accusé de nos jours d'être un abus de langage complet, car sa fonctionnalité est aujourd'hui d'affecter les permissions d'écriture sur les directorys et agir comme un drapeau de suppression restreinte .

Dans une réponse AskUbuntu, le répondeur a écrit que «un bit collant s'applique généralement aux directorys» . J'ai observé que les systèmes modernes semblent en pratique ne jamais l'appliquer aux files, mais il y a longtime, le cas habituel concernait les files (exécutables) plutôt que les directorys. (En ce qui concerne la rareté de l'utilisation moderne des files, il y a une question connexe à la question Est-ce que le bit collant n'est pas utilisé dans les filesystems actuels ?)

Cela a incité la question:

Qu'est ce qu'un bit collant appliqué à un exécutable faire? Était-ce comme setuid alors?

Notez le passé. Ce n'est pas Comment fonctionne le sticky bit? à présent. C'est comme ça que ça fonctionnait alors.

    Non, le bit collant n'était pas comme les drapeaux set-UID ou set-GID. Il n'a pas modifié les informations de connection.

    Ce que le morceau collant a fait est de rendre le text du programme "collant". Ce n'était pas un terme mal approprié, à l'origine.

    arrière-plan: sections d'images de programme et text partagé

    Les parties des files d'image de programme directement chargés en memory pour exécuter des programmes include le code machine, les constantes, le démarrage des valeurs de variables (non initialisées) et (sous une forme ou une autre) des espaces vides pour les variables initialisées et non initialisées.

    Ceux-ci sont regroupés dans des collections appelées «sections» et ils ont des noms conventionnels. Le code machine et (parfois) les constantes forment ce que l'on appelle souvent la section "text" d'une image de programme. Les variables initialisées non nulles sont, de même, la section "données"; et les variables zéro-initialisées et non initialisées sont "bss" (un nom qui a lui-même toute une histoire folklorique derrière).

    Lorsqu'un process comporte un file image exécutable du programme, les différentes parties – text, données et bss – sont initialisées à partir du contenu du file image.

    Ce qui est spécial dans la section «text» est que le code machine (et les constantes) est presque toujours pas écrit. Il a le potentiel d'être partagé à travers les images de memory virtuelle de tous les process d'exécution qui avaient ce file d'image exécutable chargé dans eux. Le scénario exact dans lequel le text du programme peut être partagé est hors de scope pour cette réponse et implique des choses telles que l'idempotence fixup du chargeur et l'identité de la layout de l'espace d'adressage. Les gens peuvent et ont écrit des livres sur ce sujet aussi. ☺

    Le text partagé est une optimization employée par le kernel. Il élimine la nécessité pour chaque instance d'une seule image de programme en cours d'exécution d'avoir sa propre image memory individuelle, consommant une memory physique précieuse avec plusieurs copys du même code machine (et des mêmes constantes).

    text collant

    Mais on peut faire mieux encore que le text partagé. Évidemment, s'il y a toujours au less un process en cours d'exécution qui utilise une image de programme de text partagé particulière, le kernel attache simplement l'espace memory virtuel des nouveaux process au segment de text partagé existant lorsqu'une nouvelle instance du programme est exécutée. Il y a presque toujours une instance de (par exemple) /bin/login ou /bin/sh exécutée quelque part sur un système de taille moyenne, donc de nouvelles instances du programme de connection ou le shell par défaut peuvent simplement attacher aux copys chargées de leurs segments de text le kernel a déjà été chargé dans la memory.

    Le text collant prolonge cette idée pour programmer les images qu'aucun process n'est en cours d'exécution . Si un file image exécutable est marqué comme un text collant, le kernel garde son segment de text après le dernier process pour l'utiliser; dans l'espoir qu'une autre instance du programme s'exécutera bientôt, et peut simplement rattacher au segment.

    Dans les premiers Unices, les segments de text collant chargés seraient échangés pour échanger le stockage lorsqu'aucun process n'était attaché à eux. (Unix plus tard a cessé d'utiliser swap pour cela.) Vous pourriez aussi avoir entendu parler de cela par le nom du text enregistré .

    Bien sûr, le réglage du bit de text collant sur une image de programme est quelque chose qui doit être fait avec soin. Les programmes qui en bénéficient dépendent de ce que la machine est généralement utilisée. Et les segments de text actuellement non attachés prennent en charge les ressources du kernel, ce qui signifie qu'il y a une limite pratique à tout ce que l'on peut avoir dans n'importe quel système. Il s'agit donc généralement d'une opération nécessitant des privilèges de superuser.

    désuétude

    Il y a tout un tas d'hypothèses qui sous-tendent l'opération du text collant, qui ne sont plus vraies. La lecture d'un segment pré-fabriqué à partir du stockage swap n'est pas nécessairement plus rapide que la simple request de search à partir du file image exécutable réel. Les formats de filesystems sont devenus meilleurs pour les templates de lecture randoms (par opposition à séquentiels). L'avènement du paging de la request lui-même change les choses, tout comme les caches unifiés, les correctifs externes non idempotents résultant de différences dans la search de bibliothèque partagée et la randomisation de l'espace d'adressage.

    Les jours de bits de text collant pour les images de programmes exécutables ont disparu depuis longtime. Un marqueur explicite de marqueur de text collant pour les images de programmes exécutables a été considéré comme obsolète par les auteurs de 4.3BSD au milieu des années 1980, par exemple.

    Plus de lecture

    • Maurice J. Bach (1986). La design du operating system UNIX . Prentice Hall. ISBN 9780132017992.