Lorsque vous en apprendrez davantage sur la manière dont les systèmes d'exploitation et le matériel sur lesquels ils fonctionnent fonctionnent et interagissent les uns avec les autres, vous serez peut-être surpris de voir ce qui semble être des bizarreries ou une sous-utilisation des «ressources». Pourquoi donc? Le post de questions-réponses sur les superutilisateurs d'aujourd'hui a la réponse à la question d'un lecteur curieux.
La session de questions et réponses d’aujourd’hui nous est offerte par SuperUser, une subdivision de Stack Exchange, un regroupement de sites Web de questions-réponses géré par la communauté.
Photo gracieuseté de Lemsipmatt (Flickr) .
The Question
Le lecteur SuperUser AdHominem veut savoir pourquoi les processeurs x86 n'utilisent que deux anneaux sur quatre:
Les systèmes x86 basés sur Linux et Windows utilisent uniquement Anneau 0 pour le mode noyau et Anneau 3 pour le mode utilisateur. Pourquoi les processeurs distinguent-ils même quatre anneaux différents s'ils finissent tous par n'en utiliser que deux de toute façon? Cela a-t-il changé avec l'architecture AMD64?
Pourquoi les processeurs x86 n'utilisent-ils que deux anneaux sur quatre?
La réponse
Jamie Hanrahan, contributeur SuperUser, a la réponse pour nous:
Il y a deux raisons principales.
Le premier est que, bien que les processeurs x86 offrent quatre anneaux de protection de la mémoire, la granularité de la protection ainsi offerte n'est qu'au niveau par segment. Autrement dit, chaque segment peut être défini sur un anneau spécifique (niveau de privilège) avec d'autres protections telles que l'écriture désactivée. Mais il n'y a pas beaucoup de descripteurs de segment disponibles. La plupart des systèmes d'exploitation aimeraient avoir une granularité beaucoup plus fine de la protection de la mémoire, comme… pour les pages individuelles.
Alors, entrez la protection basée sur la table de pages. La plupart, sinon tous, les systèmes d'exploitation x86 modernes ignorent plus ou moins le mécanisme de segmentation (autant qu'ils le peuvent de toute façon) et s'appuient sur la protection disponible à partir des bits de poids faible dans les entrées de table de pages. L'un d'eux est appelé le bit «privilégié». Ce bit contrôle si le processeur doit ou non être dans l'un des niveaux «privilégiés» pour accéder à la page. Les niveaux «privilégiés» sont PL 0, 1 et 2 . Mais ce n'est qu'un bit, donc au niveau de la protection page par page, le nombre de «modes» disponibles en ce qui concerne la protection mémoire n'est que de deux: Une page peut être accessible depuis un mode non privilégié, ou non. Par conséquent, juste deux anneaux. Pour avoir quatre sonneries possibles pour chaque page, ils devraient avoir deux bits de protection dans chaque entrée de table de pages pour coder l'un des quatre numéros de sonnerie possibles (tout comme les descripteurs de segment). Cependant, ils ne le font pas.
L'autre raison est un désir de portabilité du système d'exploitation. Il ne s'agit pas seulement de x86; Unix nous a appris qu'un système d'exploitation pouvait être relativement portable pour plusieurs architectures de processeurs, et que c'était une bonne chose. Et certains processeurs ne prennent en charge que deux anneaux. En ne dépendant pas de plusieurs anneaux dans l'architecture, les implémenteurs du système d'exploitation ont rendu les systèmes d'exploitation plus portables.
Il existe une troisième raison spécifique au développement de Windows NT. Les concepteurs de NT (David Cutler et son équipe, que Microsoft a embauchés de DEC Western Region Labs) avaient une vaste expérience antérieure sur VMS; en fait, Cutler et quelques autres figuraient parmi les concepteurs originaux de VMS. Et le processeur VAX pour lequel VMS a été conçu a quatre anneaux (VMS utilise quatre anneaux).
Mais les composants qui fonctionnaient dans les VMS Anneaux 1 et 2 (Les services de gestion des enregistrements et la CLI, respectivement) ont été exclus de la conception de NT. Anneau 2 dans VMS ne concernait pas vraiment la sécurité du système d’exploitation, mais plutôt la préservation de l’environnement CLI de l’utilisateur d’un programme à l’autre, et Windows n’avait pas ce concept; la CLI fonctionne comme un processus ordinaire. Quant aux VMS Anneau 1 , le code RMS dans Anneau 1 dû appeler Anneau 0 assez souvent, et les transitions en anneau coûtent cher. Il s'est avéré beaucoup plus efficace de se rendre à Anneau 0 et en finir avec ça plutôt que d'avoir beaucoup de Anneau 0 transitions dans le Anneau 1 code (encore une fois, pas que NT a quelque chose comme RMS de toute façon).
Quant à savoir pourquoi x86 a implémenté quatre anneaux alors que les systèmes d'exploitation ne les utilisaient pas, vous parlez de systèmes d'exploitation de conception beaucoup plus récente que x86. Un grand nombre des fonctionnalités de programmation système de x86 ont été conçues bien avant que NT ou les vrais noyaux Unix ne soient implémentés dessus, et ils ne savaient pas vraiment ce que le système d'exploitation utiliserait. Ce n'est que lorsque nous avons obtenu la pagination sur x86 que nous avons pu implémenter de vrais noyaux Unix-ish ou VMS.
Non seulement les systèmes d'exploitation x86 modernes ignorent largement la segmentation (ils configurent simplement les segments C, D et S avec une adresse de base de 0 et une taille de 4 Go; les segments F et G sont parfois utilisés pour pointer vers les structures de données clés du système d'exploitation. ), ils ignorent aussi largement des choses comme les «segments d'état de tâche». Le mécanisme TSS a été clairement conçu pour le changement de contexte de thread, mais il s'avère avoir trop d'effets secondaires, donc les systèmes d'exploitation x86 modernes le font «à la main». Le seul moment où x86 NT change les tâches matérielles est pour certaines conditions vraiment exceptionnelles, comme une exception de double faute.
En ce qui concerne l'architecture x64, beaucoup de ces fonctionnalités désaffectées ont été laissées de côté. À leur honneur, AMD a en fait parlé aux équipes du noyau du système d'exploitation et leur a demandé ce dont ils avaient besoin de x86, ce dont ils n'avaient pas besoin ou ne voulaient pas, et ce qu'ils aimeraient ajouter. Les segments sur x64 n'existent que sous ce que l'on pourrait appeler une forme résiduelle, le changement d'état des tâches n'existe pas, etc., et les systèmes d'exploitation continuent à n'utiliser que deux anneaux.
Avez-vous quelque chose à ajouter à l'explication? Sonnez dans les commentaires. Vous voulez lire plus de réponses d'autres utilisateurs de Stack Exchange férus de technologie? Consultez le fil de discussion complet ici .