
Présentation du noyau de Windows NT
2.2.1 La segmentation, les niveaux de privilèges et les appels systèmes
À l’origine la segmentation était un mécanisme qui permettait de découper la mémoire vive en “seg-
ments” de taille variable et d’affecter ces segments aux différentes tâches (programmes) pour empêcher
une tâche d’accéder à la mémoire affectée à une autre tâche. Les systèmes modernes dont NT utilisent
plutôt la pagination pour cela. Par contre la segmentation reste utilisée pour ses niveaux de privilèges.
Un niveau de privilège, dans les processeurs x86, est une valeur nommée Ring comprise entre 0 et 3
affectée à chaque segment et indiquant quelles instructions le code s’exécutant dans ce segment aura le
droit d’effectuer. La plupart des systèmes comme NT ou Linux utilisent seulement deux niveaux (IBM
OS/2 en utilise 3). On a alors :
— Le Ring 0, aussi appelé mode noyau (kernel) ou superviseur (supervisor) est utilisé par le noyau
du système d’exploitation et les pilotes de périphériques. Un programme s’exécutant en ring 0
peut utiliser toutes les instructions fournies par le processeur.
— Le Ring 3, aussi appelé mode utilisateur (user) est utilisé pour exécuter les applications. Un
programme s’exécutant en ring 3 ne peut accéder à certains registres du processeur, ne peut
exécuter certaines instructions et ne peut accéder aux ports d’entrée/sortie.
Comme on peut le voir sur la figure 2, les applications fonctionnant en Ring 3 ne peuvent accéder au
matériel. Elles doivent donc faire appel au noyau du système pour toute opération impliquant le matériel
(lire un fichier, accéder au réseau, afficher quelque chose à l’écran. . .). Pour cela elles effectuent des appels
systèmes au moyen de l’interruption 0x2E, ou dans les systèmes plus modernes le couple d’instructions
sysenter/sysexit ou syscall/sysret. L’utilisation de ces instructions provoque l’exécution d’une fonction
du noyau appelée KiSystemService qui se chargera d’appeler la fonction demandée dans le noyau.
Il existe une liste faisant correspondre chaque appel système à un numéro, numéro qui est chargé dans
un registre avant l’appel. Sous Windows NT, les noms des appels systèmes commencent tous par le préfixe
Nt. Il existe dans Windows 7 environ 400 appels systèmes généralistes (par exemple NtReadFile pour
lire dans un fichier ou encore NtQuerySystemInformation pour demander des informations sur l’état du
système) et environ 800 appels systèmes relatifs à l’interface graphique (comme NtUserCreateWindowEx
pour créer une fenêtre ou NtGdiLineTo pour tracer une ligne droite à l’écran ou sur une imprimante).
En effet sous Windows toute la gestion de l’interface graphique (système de fenêtrage) a lieu en mode
noyau.
Si on observe la liste des fonctions appelées lors de la lecture d’un fichier par le programme cmd
(figure 3), on observe que la fonction ReadFile de KernelBase.dll utilise l’appel système NtReadFile
et que l’on passe du mode utilisateur (icône Ubleue) au mode noyau (icône Krose).
2.2.2 La pagination
Dans cette section, on se concentrera sur les processeurs x86 ; les principes présentés restent valables
pour les processeurs AMD64, seules les valeurs diffèrent.
La pagination, ou mémoire virtuelle, permet de faire abstraction de la mémoire vive réelle et de
présenter à chaque processus un espace d’adressage de 4 Go. Chaque processus “croit” être le seul à
s’exécuter ; dans ses 4 Go de mémoire virtuelle, il ne voit que ses données et son code. Le processeur se
charge automatiquement de traduire les adresses mémoire virtuelles en adresses physiques.
Sous Windows, les 4 Go sont coupés en deux. Les deux giga-octets inférieurs (adresses de 0x0 à
0x7FFFFFFF) sont spécifiques au processus et librement accessibles par lui et le noyau. Les deux giga-
octets supérieurs (adresses de 0x80000000 à0xFFFFFFFF) pointent vers les mêmes données quelque-soit
le processus ; ils s’agit de données uniquement accessibles depuis le mode noyau et contenant tout le code
et les données du noyau et des drivers.
Les deux giga-octets réservés au noyau et aux drivers sont composés entre autres de deux zones dans
lesquelles il est possible d’allouer de la mémoire :
— le paged pool est une zone dont certaines pages peuvent être déchargées de la mémoire (stockées
dans le fichier swap) ; cette zone est donc à privilégier si possible ;
— le nonpaged pool dont les pages restent toujours résidentes en mémoire; à utiliser si on doit accéder
aux données à un IRQL élevé (voir plus bas).
5 / 17