Question

Comme on le sait, un programme fonctionnant sous Windows 32 bits OS ne dispose que de 2 Go de mémoire virtuelle disponible. il est également connu que l'autre de 2 Go sont réservés comme espace noyau. Mais ce qui est en fait dans cet espace du noyau?

Je comprendrais de réserve nécessaire pour lui-même noyau, mais pourquoi l'espace du noyau en EVA de processus? Merci.

Était-ce utile?

La solution

Obtenir le livre interne de Windows, il décrit en détail gore. Pour le bref résumé cependant, certaines choses qui sont dans l'adresse virtuelle du noyau (KVA):

1) Le noyau et HAL

2) Les pilotes de périphériques

3) Les tas de mode noyau (appelés les piscines exécutives, que je trouve toujours amusant)

4) Les objets exportés vers le mode d'utilisateur par l'intermédiaire des poignées (processus, fil, événement, etc., mutex objets)

5) PTE système, qui carte toutes sortes de choses intéressantes loin des applications en mode utilisateur sale (par exemple l'exécution des piles qui utilisent des fils lors de l'exécution en mode noyau)

6) Le cache du système de fichiers

Et la liste est longue et ... Comme je l'ai dit, lire Windows Internals.

-Scott

Autres conseils

La raison pour laquelle la mémoire du noyau est mis en correspondance dans l'espace d'adressage virtuel de chaque processus est de sorte qu'un changement de contexte en mode noyau ne doit pas modifier les tables de pages de processus. Le niveau de privilège actuel est simplement levé à 0, ce qui rend immédiatement ces pages accessibles.

Les tables de pages ne doivent être commuté quand un processus différent est commuté. Étant donné que c'est une opération coûteuse (par exemple. Il faut une chasse d'eau TLB), ce qui réduit la fréquence de celui-ci est une victoire.

En outre, si vous a fait commutateur tables page du noyau spécial vous est allé à l'espace du noyau basculé, vous auriez à choisir une partie de l'espace d'adressage de l'espace utilisateur à remplacer. Cela rendrait les addressess inaccessibles à l'espace utilisateur du noyau, ce qui nécessiterait des tampons de rebond ou plus d'espace d'adresse déblayage quand les données dans ces domaines devaient être transférés vers ou à partir du noyau.

À mon avis, il y a un autre fait peu connu de la limite de 2 Go. De nombreuses applications fonctionnent généralement avec beaucoup d'arithmétique de pointeur (en particulier les applications écrites en C, C ++, ...). Dans ces applications, il est assez fréquent d'ajouter des compensations aux pointeurs, ou même à soustraire des pointeurs.

Si votre disposition espace d'adressage virtuel est de 2 Go, vous êtes assuré que la soustraction de deux pointeurs est toujours entre -2147483647 et 2147483648 (ce sont les limites pour les valeurs signées 32 bits).

Si l'espace d'adressage serait 3Go, la différence possible serait plus grande que toute valeur qui peut être représentée dans une valeur signée 32 bits.

Si vous savez que votre application est sûr, et non la soustraction des pointeurs totalement sans rapport avec (et vos tableaux sont moins de 2 Go!), Vous pouvez indiquer à Windows que votre application peut fonctionner avec un espace d'adressage plus de 2 Go, en réglant l'éditeur de liens LARGEADDRESSAWARE drapeau (ou ensemble avec l'utilitaire ce EDITBIN).

Avec XP (pas tout à fait sûr de Vista et W7) vous pouvez démarrer dans un mode où l' « espace noyau » est seulement 1 Go et 3 Go dans l'espace d'adressage virtuel est laissée à l'application. Si votre application est LARGEADDRESSAWARE, vous obtenez le plein 3Go. Sinon, vous obtenez seulement 2 Go.

Sur Windows 64 bits, LARGEADDRESSAWARE applications 32 bits même obtenir 4 Go, depuis Windows n'a pas besoin d'espace d'adressage importante dans la zone 32 bits (après tout, il est un système d'exploitation 64 bits).

Programme écrit en langage de haut niveau, comme C ++, est enfin traduit à OS appels API, spécifiquement, API Windows pour Windows OS. Beaucoup API Windows, comme CreateFile, sont en fait parler avec les pilotes en mode noyau. L'espace noyau dans l'espace d'adressage du processus est utilisé pour l'allocation des ressources du noyau pour ce processus. Par exemple, les appels IOCTL du pilote contiennent des tampons d'entrée-sortie, transmises entre API en mode utilisateur et le pilote. Ces tampons sont attribués dans l'espace du noyau de processus.

En général, l'espace noyau contient des ressources allouées par les composants en mode noyau pour le compte de ce processus.

Votre question semble être « pourquoi » pas « quoi » comme présenté dans le titre.

En outre, votre question suppose 32 bits. les versions 64 bits de Windows sont très différentes (par exemple, le SAV est 8TB ou 7TB sur un système de itanium).

En ce qui concerne « pourquoi », comment voulez-vous passer des pointeurs à partir d'une fonction du noyau (comme un pilote) qui ne figurent pas dans le VAS du processus? Un bon livre à lire pour comprendre cela serait Windows Internals.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top