Partager via


Espace utilisateur et espace système

Windows donne à chaque application en mode utilisateur un bloc d’adresses virtuelles. Il s’agit de l’espace utilisateur de cette application. L’autre grand bloc d’adresses, appelé espace système ou espace noyau, ne peut pas être directement accessible par l’application.

Lorsque WinDbg ou CDB définit un point d’arrêt dans l’espace utilisateur, ce point d’arrêt est défini à l’adresse spécifiée dans l’espace utilisateur d’un seul processus. Pendant le débogage en mode utilisateur, le processus actuel détermine la signification des adresses virtuelles. Pour plus d’informations, consultez Contrôle des processus et des threads.

En mode noyau, vous pouvez définir des points d’arrêt dans l’espace utilisateur avec les commandes bp, bu et ba ou avec la boîte de dialogue Points d’arrêt. Vous devez d’abord utiliser le contexte de processus pour spécifier le processus en mode utilisateur qui possède cet espace d’adressage à l’aide de .process /i (ou d’un point d’arrêt spécifique au processus sur une fonction d’espace noyau) pour basculer la cible vers le contexte de processus approprié.

Les points d’arrêt dans l’espace utilisateur sont toujours associés au processus dont le contexte de processus était actif lorsque les points d’arrêt ont été définis. Si un débogueur en mode utilisateur débogue ce processus et si un débogueur de noyau débogue l’ordinateur sur lequel le processus s’exécute, ce point d’arrêt s’interrompt dans le débogueur en mode utilisateur, même si le point d’arrêt a été défini à partir du débogueur du noyau. À ce stade, vous pouvez vous introduire dans le système à partir du débogueur du noyau ou utiliser la commande .breakin (Break to the Kernel Debugger) du débogueur en mode utilisateur pour transférer le contrôle vers le débogueur du noyau.

Détermination de la plage d’espace utilisateur et d’espace système

Si vous devez déterminer l’étendue de l’espace utilisateur et de l’espace système sur l’ordinateur cible, vous pouvez utiliser la commande dp (Display Memory) d’un débogueur de noyau pour afficher la variable globale Windows MmHighestUserAddress. Cette variable contient l’adresse du haut de l’espace utilisateur. Étant donné que les adresses d’espace système sont toujours supérieures aux adresses d’espace utilisateur, cette valeur vous permet de déterminer si une adresse donnée se trouve dans l’espace utilisateur ou dans l’espace noyau.

Par exemple, sur un ordinateur cible 32 bits avec un processeur x86 et des paramètres de démarrage standard, cette commande affiche le résultat suivant :

kd> dp nt!mmhighestuseraddress L1 
81f71864  7ffeffff 

Cela indique que l’espace utilisateur s’étend de l’adresse 0x00000000 à 0x7FFEFFFF, et que l’espace système va donc de 0x80000000 jusqu’à l’adresse la plus élevée possible (qui est 0xFFFFFFFF sur une installation Windows 32 bits standard).

Avec un ordinateur cible 64 bits, différentes valeurs se produisent. Par exemple, cette commande peut afficher les éléments suivants :

0: kd> dp nt!mmhighestuseraddress L1 
fffff800`038b4010  000007ff`fffeffff 

Cela indique que l’espace utilisateur va de 0x00000000'000000000 à 0x000007FF’FFFEFFFF. Par conséquent, l’espace système inclut toutes les adresses à partir de 0x00000800'0000000000.

Pour plus d’informations sur la gestion de la mémoire Windows, consultez Microsoft Windows Internals by David Solomon et Mark Russinovich (4e édition, Microsoft Press, 2005).