Ce document présente l'architecture générale de Windows NT4. Nous verrons dans un premier temps rapidement le cahier des charges auquel il devait répondre, puis nous étudierons un peu plus en
détail les modules qui constituent ce système d'exploitation.
Je me suis efforcé de traduire tous les termes anglais en français, je spécifierai
toutefois leur véritables noms, c'est plus pratique pour faire des recherches si
on veut approfondir le sujet.
Sur le menu de droite, vous pouvez télécharger une présentation sur le sujet au format PPT, au cas où vous auriez à faire une présentation vous aussi... La présentation à le même plan que ce document, c'est quand même bien fait !
1. Le cahier des charges
Le cahier des charges se résume en six critères principaux et évidents,
auxquels tout tout système d'exploitation moderne devrait répondre :
- Evolutif
Il vaut mieux qu'un système d'exploitation soit évolutif, ne serait-ce que pour corriger les bogues...
- Portable
Pour pouvoir vendre un système d'exploitation à un public le plus large
possible, il est préférable qu'il puisse être installé sur différents
types de machines. Une entreprise ne voudrait pas avoir à changer son parc
informatique pour passer à Windows NT !
- Fiable
Bien sûr, on n'installe généralement pas Windows NT pour jouer au démineur
(ce n'est même pas installé par défaut).
- Compatible
Il serait dommage que les entreprises soient obligées de redévelopper leurs
applications à cause d'une incompatibilité du système d'exploitation.
Si Microsoft ne l'avait pas rendu compatible, il ne s'en serait sûrement pas
vendu autant ! (les entreprises ne sont pas folles)
- Sécurisé
Windows NT n'est pas un système d'exploitation que l'on installe chez soi pour jouer.
Il permet de partager des ressources, qui dit partage dit sécurité. Non seulement sur la machine
localement, mais aussi en réseau. Windows NT est un système d'exploitation Réseau.
- Performant
Bien entendu...
2. L'architecture générale en quelques mots
Le système d'exploitation Windows NT est très objet. Chaque entité, physique ou virtuelle, est représentée; comme un objet dans le système. Le coeur du système d'exploitation lui-même est divisé en objets, ce qui en fait un système d'exploitation modulaire.
L'avantage de la méthode objet, quand certaines règles sont bien appliquées, est que chaque objet est indépendant. Un objet n'a aucune connaissance de comment sont constitués les autres. La seule chose qu'il connaisse des autres objets est leur interface. C'est uniquement à travers des interfaces que les objets vont dialoguer entre eux, ce qui assure, avec des interfaces bien définies, un bon fonctionnement d'ensemble.
Si par hasard un problème survenait, ce serait une bogue dans le code de l'un des objets ou une mauvaise définition des interfaces. Une autre règle en programmation objet est d'avoir un couplage faible, c'est à dire que les interfaces ne doivent pas être trop grosses et qu'un objet ne devrait pas avoir à connaître trop d'objets. Ce dernier critère devient difficile à respecter dans le développement d'un système d'exploitation.
En effet, tous les objets du système ont besoin des services des autres, un couplage fort est donc inévitable. Windows NT n'y a pas échappé.
En résumé, Windows NT n'est pas un système d'exploitation monolithique, mais c'est tout comme (d'accord, j'exagère).
Windows NT, comme tout système d'exploitation moderne, est préemptif et multitâches. Préemptif signifie qu'il est capable de faire tourner sur le microprocesseur plusieurs processus (programmes) en concurrence. C'est le système d'exploitation qui va se charger de remplacer un processus en cours d'exécution par un autre (changement de contexte...).
Windows NT est multi-processeurs, il peut gérer 4 processeurs, et même jusqu'à 32 avec un développement spécifique des constructeurs.
Windows NT est basé sur une architecture client-serveur. Le système est un ensemble d'objets. Certains sont propres au système, d'autres sont des objets "utilisateur". Quand un objet demande un service à un autre, il joue le rôle de client. Le fournisseur de service joue le rôle du serveur.
Un adressage 32 bits permet à Windows NT d'allouer 4 Go d'espace mémoire (virtuel) pour chaque processus.
Windows NT supporte plusieurs systèmes de fichier, la MS-DOS FAT (File Allocation Table), HPFS (High Performance File System), le système de fichier pour le CD-Rom, NTFS (NT File System). Pour le système Win32, je crois qu'il faut ajouter un petit programme. Pourtant c'est aussi du Microsoft, eh oui. A croire que ce système de fichier soit mauvais, et qu'il risquerait de rendre Windows NT instable.
Les langages de programmation C et C++ ont été principalement utilisés pour le développement de Windows NT.
Les services réseau sont intégrés au système d'exploitation (normal, c'est un NOS : Network Operating System, Système d'exploitation réseau).
3. Structure détaillée de l'architecture Windows NT
Windows NT fonctionne dans deux mode différents, le mode noyau et le mode utilisateur.
- Le mode noyau
est le mode dans lequel tournent les fonctions vitales du système d'exploitation. C'est un mode protégé ou le code est très optimisé. Un programme tournant dans ce mode n'est pas soumis aux divers contrôles de sécurité, comme par exemple vérifier si la mémoire à laquelle il accède lui est bien attribuée. Les programmes ne doivent contenir aucune bogue car la sécurité est réduite au minimum. Les programmes doivent à tout prix respecter leur espace d'adressage. On retrouve dans ce mode tous les programmes utilisés en permanence par le système d'exploitation. Il est impossible de faire tourner ces propres programmes dans ce mode.
- Le mode utilisateur
est le mode dans lequel tournent les programmes qui sont soumis à la sécurité du système d'exploitation, fournie justement par les programmes qui tournent en mode noyau. On y trouvera tous les programmes des utilisateurs, mais aussi certains programmes du système d'exploitation qui ont été placés ici pour ne pas trop charger de programmes en mode noyau (peut-être aussi parce-que leurs programmes ne sont pas stables et qu'il ne vaut mieux pas qu'ils puissent accéder à toute la mémoire...).
La stabilité de Windows NT est assurée grâce à ces deux modes. Le mode noyau est le coeur du système d'exploitation, la partie la plus petite possible, la plus optimisée et sans aucune bogue. Tout ce qui tourne en mode utilisateur est controlé par les programmes du mode noyau et ne peut donc pas faire planter le système, en théorie.
Sur l'image qui suit, la séparation entre les deux modes est matérialisée par une ligne horizontale en pointillés :
La suite de ce document va se baser sur cette représentation de l'architecture NT. Si vous voulez avoir cette image à porté de souris, cliquez dessus, elle vous en fera une copie dans un coin.
Tout ce qui apparaît en vert, c'est à dire, tout ce qui est en mode noyau, sauf le matériel, s'appelle le NT Executive. Il regroupe le noyau, la HAL et les services systèmes.
Les services systèmes sont tous les modules tournant en mode noyau, autour du noyau (ne pas confondre noyau et mode noyau) : le I/O Manager, l'Object Manager, le Security Ressource Manager, le Process Manager, le LPC, le Virtual Memory Manager et le Graphic Manager.
Sur l'image, les services systèmes sont représentés comme une surcouche, c'est en fait la vision que tout programme tournant en mode utilisateur a du système d'exploitation. Les programmes vont faire appel aux services système via des API appelées "Native API". Il ne vont pas s'adresser directement à tel ou tel service.
Détaillons un peu le rôle de chacune de ces boites noires...
3.1. HAL
HAL pour Hadware Abstraction Layer, ou en français, Couche d'Abstraction Matérielle. C'est grâce à cette couche que Windows NT est portable sur plusieurs types de machines. Son rôle est de masquer complètement la partie matérielle au système d'exploitation lui-même. Tout matériel va être représenté virtuellement au système d'exploitation. Le système d'exploitation va utiliser le matériel via une interface unique, sans se soucier du matériel. C'est à la couche d'abstraction matérielle de traduire les demandes au système physique. A un type de machine correspond une couche HAL spécifique. Grâce à cette couche, Windows NT peut tourner sur plusieurs types de microprocesseurs : Intel, MIPS, PowerPC, Alpha.
C'est encore la couche HAL qui gère les systèmes multi-processeurs, en intégrant l'interface SMP (Symmetric Multi Processing). La couche HAL est différente suivant le nombre de processeurs dans le système.
La couche HAL représente chaque processeur comme un processeur virtuel au noyau. Le noyau, on le verra plus tard, dispatchera ses tâches sur ces différents processeurs. Que ce soient des processeurs Alpha, Intel ou autre, le noyau voit toujours des processeurs virtuels.
La couche HAL n'est accessible que par le NT Executive. Pour accéder au matériel, les programmes utilisateurs sont donc obligés de passer par les Native APIs (enfin presque).
3.2. Le noyau
Le noyau est aussi appelé micro-noyau ou Kernel pour les anglicistes. Son principal rôle est de planifier les thread sur les différents processeurs virtuels, en fonction de leur priorité. Il va préempter les processus qui n'auront pas rendu d'eux-mêmes la main après le quantum de temps (slice) attribué. Il traite toutes les interruptions système. Il traite les exceptions processeurs (divisions par zéro, ou des choses que le processeur s'interdit lui-même de faire).
Le noyau est aussi un programme. Un noyau tourne sur chaque processeur. Le noyau ne peut être préempté et ne peut donc pas non plus être swappé (swappé signifie que le code d'exécution est transféré de la mémoire vive vers le disque pour récupérer un peu de mémoire ; il sera replacé en mémoire quand on en aura besoin).
Les parties critiques du noyau sont écrites en assembleur.
Tout ce que le noyau ne fait pas est fait par les services du NT Executive.
3.3. Les services du NT Executive
Les services du NT Executive tournent aussi en mode noyau. Ce sont donc des parties importantes, indispensables au système d'exploitation. Leur rôle est de fournir les services de base aux sous-systèmes d'environnement.
Détaillons le rôle de chacun :
- l'Object Manager, ou Gestionnaire d'Objets
Sous Windows NT, tout est représenté sous forme d'objet : un processus, une thread, un périphérique quelconque sont des objets. Chaque objet contient une ACL : Access Control List, Liste de Contrôle d'Accès, une liste définissant les droits que les autres objets ont sur lui. Pour travailler avec un objet, on utilise un handle. Ce handle est une référence représentant l'objet. Il contient notamment un pointeur sur l'objet ainsi que les droits que l'on possède sur cet objet. C'est le gestionnaire d'objets qui fournit tous les handles que les autres objets lui demandent.
Les objets sont créés, modifiés et supprimés par le gestionnaire d'objets.
Le gestionnaire d'objets supprime les objets orphelins. Un objet ne doit exister que s'il est utilisé. Le gestionnaire d'objet compte le nombre d'objets utilisant chaque objet. Quand ce nombre arrive à zéro, l'objet n'est plus utilisé, donc supprimé.
Le gestionnaire d'objet veille à ce que chaque objet ne consomme pas trop de ressources.
- le Process Manager, ou Gestionnaire de processus
Son rôle est de créer, modifier l'état et supprimer les threads. Il renseigne sur l'état de chaque thread. Son rôle n'est pas de cadencer les threads. Tout processus contient au moins une thread initiale, dans laquelle tourne effectivement le programme.
- le Virtual Memory Manager, ou gestionnaire de mémoire virtuelle
Son rôle est d'allouer 4 Go d'espace mémoire à chaque processus, indépendamment de l'espace mémoire effectivement disponible sur le système. Sur ces 4 Go, 2Go seront réservés au système, les deux restants seront à la disposition du programmeur. Sur les systèmes contenant suffisamment de mémoire, il sera possible d'allouer plus d'espace pour la partie applicative (donc moins pour le système).
Il s'assure que chaque application reste dans son espace d'adressage attribué.
C'est le gestionnaire de mémoire virtuelle qui gère le swap. Les programmes demandent des pages mémoire au gestionnaire. Le gestionnaire leurs fournit, qu'elles soient en mémoire vive ou swappées. Le programmeur n'a pas à s'en soucier (manquerait plus que ca ! )
- le LPC
LPC : Local Procedure Call, ou Appel de Procédure Locale. Dans un système d'exploitation tournent en permanence un certain nombre de threads. Tous les services systèmes par exemple sont des threads ; les sous-environnements aussi. Viennent ensuite les applications utilisateur. Toutes ces threads dialoguent en permanence entre elles, les applications vers le sous-système d'environnement, le sous-système d'environnement vers les services système, les services système entre eux. Tout ces dialogues passent par le LPC qui gère la communication entre threads. C'est un programme spécifiquement développé pour optimiser les communications locales entre processus.
- le SRM : Security Ressource Manager, ou gestionnaire de sécurité des ressources
Son rôle est de gérer la sécurité en local sur la machine. Il sécurise l'accès à tout objet du système. Quand un utilisateur veut utiliser un objet, il fait une demande de handle auprès du gestionnaire d'objet. Le gestionnaire d'objet demande au SRM quels droits l'utilisateur a effectivement sur l'objet demandé. Le SRM compare le SAT (Secure Access Tocken, Jeton d'accès sécurité) de l'utilisateur, contenant les droits de l'utilisateur (appartenance aux groupes donc héritage), à l'ACL de l'objet demandé et en déduit le niveau d'accès de l'utilisateur sur l'objet. Ce niveau d'accès sera stocké dans le handle.
- le I/O Manager, ou Gestionnaire d'Entrées-Sorties
C'est une grosse partie du système d'exploitation. Il est divisé lui-même en plusieurs couches de manière à être le plus modulaire possible. Il est constitué de telle manière que lorsque l'on veut ajouter ou changer un driver quelconque (disque dur, carte réseau) on ait le moins de code possible à développer. Il faudra simplement ajouter la couche qui va bien au bon endroit. Celle-ci s'appuiera sur ses couches supérieures et inférieures, qui n'auront pas à être modifiées. Plus les couches sont hautes, moins elles connaissent le système physique.
Le gestionnaire d'entrées-sorties, coordonne, gère les communications entre drivers. Ces communications se font avec des messages spéciaux appelés I/O Request Packets.
Le gestionnaire d'entrées-sorties gère notamment les systèmes de fichiers et les redirecteurs réseau (c'est grâce à lui que peuvent cohabiter plusieurs systèmes de fichier, par redirection des packets vers la bonne couche suivant leur type). Un redirecteur réseau n'est en fait rien d'autre qu'un système de fichier spécial. Pour une application, la méthode pour aller chercher une information sur le serveur ou sur un map réseau est strictement identique.
Le gestionnaire d'entrées-sorties gèrant les systèmes de fichier, il est normal qu'il gère aussi le cache disque. Au lieu de diriger les requêtes disques directement vers le disque, il regarde d'abord dans le cache. S'il ne trouve pas le bloc demandé, il va alors transmettre la requête au disque. La réponse repassera forcément par le cache, qui cette fois ci stockera l'information. Le cache quoi !
- le Graphic Manager, ou gestionnaire graphique
Il regroupe les deux sous-modules GDI et USER, correspondant respectivement à l'interface graphique et au gestionnaire de fenêtres. Ce module n'était pas présent dans le NT Executive sur Windows NT3, c'est une nouveauté NT4. Sous Windows NT3, GDI et USER se trouvaient dans le sous-environnement Win32. Leur choix, contesté par certains, a été justifié pour la raison suivante : Sous Windows NT3, quand le sous-environnement Win32 plantait, on ne pouvait absolument plus rien faire, le système était bloqué. En le mettant dans le NT Executive, lorsque le sous-environnement Win32 plante, Le noyau est capable de repeindre votre écran en bleu et vous afficher des informations succeptibles de vous aider à résoudre, du moins comprendre, le problème. De plus, par la fameuse commande CTRL-ALT-SUPPR, il décharge le système d'exploitation "proprement" (disent-ils...).
Les non-partisans de cette solution argumentent que mettre ce module dans le NT Executive fragilise le système (et si c'étaient USER et GDI qui étaient boguées ?...Grave ! ) en l'alourdissant. Plus de code il y a, plus de bogues il y aura...
Enfin, je suppose qu'ils ont bien révisé leur code.
4. Les Sous-systèmes d'environnement
Tous les sous-systèmes d'environnement tournent en mode utilisateur. Ils sont au nombre de trois : Win32, POSIX et OS/2. Leur rôle est d'offrir aux applications un environnement d'exécution. Le sous-environnement natif de Windows NT est Win32. Les deux autres ont étés rajoutés pour que Windows NT se dise compatible. Windows NT sait dans quel sous-environnement faire tourner une application grâce à l'entête du fichier.
- Le sous-système d'environnement POSIX
POSIX signifie "Portable Operating System Interface" et comme son nom l'indique, définit une interface commune à tout système d'exploitation qui veut être à la norme POSIX.
La norme POSIX est définie sur 13 niveaux, de 0 à 12, 12 étant la norme la plus complète. Windows NT est conforme à la norme POSIX.1, autant dire qu'il ne l'est pas. Enfin, cette norme définit quelques critères sur le format des noms du système de fichiers que NTFS respecte.
Les fonctions réseau et système ne sont donc pas POSIX.
Pour ceux qui tiennent à faire tourner une application POSIX dans ce sous-système, les applications ont leur propre espace d'adressage et tournent en mode multitâches préemptif.
- Le sous-système d'environnement OS/2
OS/2 est l'interface de présentation qu'avait choisi Microsoft au départ pour Windows NT, mais face au succès de Windows 3.X (Win16), c'est Win32, une évolution de Win16, qui a été finalement adopté.
Windows NT respecte la norme OS/2 1.X, c'est à dire OS/2 mode caractère (OS/2 2.X étant le mode graphique). On dispose cette foisci de quelques supports réseaux. Comme pour le sous-environnement POSIX, les applications disposent de leur propre espace d'adressage et tournent en mode multitâches préemptif.
- Le sous-système d'environnement Win32
Comme je le disais précédemment, il s'agit du sous-système d'environnement natif à Windows NT. C'est lui qui gère le clavier et la souris, les autres sous-systèmes d'environnement passent donc obligatoirement par Win32 en traduisant leurs API en API Win32. Win32 a donc une grande importance, s'il plante, on n'a plus d'accès aux applications tournant sur les autres sous-systèmes. Toute application utilise les API Win32 pour dialoguer avec le système.
Les applications Win32 disposent de leur propre espace d'adressage, bien évidemment.
5. Les VDM, Virtual DOS Machines
Windows NT propose deux types de Machine Virtuelle DOS (VDM) : une VDM MS-DOS et une VDM Win16. Elles sont là pour que Windows NT supporte les anciennes applications DOS et Windows 16 bits. Elles reconstituent donc l'environnement adéquate pour ces applications. Toutefois, elles ne sont pas considérées comme des sous-systèmes d'environnement parce-qu'elles tournent (ce sont des programmes) dans le sous-environnement Win32.
Ces deux VDM ont certaines différences :
- La VDM MS-DOS
Il s'agit d'une application Win32 qui émule un ordinateur X86. Les applications DOS pouvaient directement accéder physiquement au matériel. Cet accès direct est simulé sous NT avec cette VDM.
Pour les processeurs à base Intel, Windows NT peut tourner dans un mode spécifique appelé le mode "Virtual-86". L'accès direct au matériel est simulé par ce mode. Pour les autres types de processeurs, les instructions X86 sont émulées par un module appelé "Instruction Execution Unit".
Les services d'interruptions ROMBIOS et 21 d'MS-DOS sont fournis par le module d'émulation MS-DOS. La partie physique est représentée virtuellement avec les VDDs : Virtual Device Drivers.
Une application DOS dispose de sa propre VDM, avec son propre espace d'adressage. La VDM supprime la limitation de mémoire que l'on a en DOS classique.. Windows NT peut faire tourner un nombre illimité de VDM MS-DOS.
- La VDM Win16
Il s'agit d'une application émulant un environnement 16 bits, pour les applications fonctionnant sous Windows 3.X. Windows 3.X n'est en fait que l'interface graphique du DOS.
La VDM Win16 tourne donc sur une VDM MS-DOS.
La VDM Win16 dispose d'une couche WOW : Win16 On Win32, qui est chargée de traduire les API 16 bits en API 32 bits et vice versa. Ce procédé s'appelle le thunking. WOW fait la liaison avec le sous-système Win32.
Le système Win16 est multi-threadé coopératif. C'est-à-dire que ce sont les applications qui doivent d'elles-mêmes rendre la main au processeur. Windows NT a dû garder ce principe. Pour ce faire, toutes les applications 16 bits tournent dans la même VDM Win16. Entre elles, les applications Win16 sont multi-threadées coopératives. Le système Windows NT reste multi-thredé préemptif. Quand le système d'exploitation laisse la main à la VDM Win16, il va reprendre l'application Win16 qu'il avait préempté pour une autre application (Win32, DOS, POSIX ou OS/2). C'est l'application Win16 qui devra rendre la main pour que les autres applications Win16 puissent continuer. Les processus Win16 ont donc un statut spécial.
Pour résumer, les applications Win16 tournent en mode multi-threadé coopératif, mais restent en mode multi-threadé préemptif vis-à-vis des autres applications du système d'exploitation. Une application Win16 pourra donc bloquer les autres applications Win16, mais pas les autres.
6. Bibliographie
Voici les principales références sur lesquelles je me suis appuyé pour rédiger cette présentation. Vous pourrez y trouver un complément d'information.
- Des liens :
- Des livres :
- Ressources d'experts, Jason Garms et Al - S&SM : l'architecture y est bien détaillée.
- Les bases de l'administration Windows NT, Aeleen Frish traduit par Lauren Adam - O'Reilly, 1998 : très léger sur le sujet, pour une première approche.
Je remercie leurs auteurs et ceux qui m'ont aidé à écrire ce document
N'hésitez pas à m'envoyer vos remarques : jducharl@m6net.fr