Question

Il est un fait connu que les applications Windows ont généralement 2Gb de l'espace d'adressage privé sur un système 32 bits. Cet espace peut être étendu à 3Go avec le commutateur / 3GB.

Les réserves du système d'exploitation lui-même le reste de l'4Go.

Ma question est pourquoi?

code en cours d'exécution en mode noyau (à savoir le code de pilote de périphérique) a son propre espace d'adressage. Pourquoi, au-dessus d'un espace d'adressage 4Gb exclusif, le système d'exploitation veulent toujours réserver 2Gb de chaque processus en mode utilisateur?

Je pensais que la raison est la transition entre en mode utilisateur et appels en mode noyau. Par exemple, un appel à NtWriteFile aura besoin d'une adresse pour la routine d'expédition du noyau (donc pourquoi la réserve du système 2Gb dans chaque application). Mais, en utilisant SYSENTER, n'est pas le numéro de service du système suffisant pour le code en mode noyau pour savoir quelle fonction / service est appelé?

Si vous pouviez me préciser pourquoi il est si important pour le système d'exploitation à prendre 2Gb (ou 1Gb) de chaque processus en mode utilisateur.

Était-ce utile?

La solution

Deux processus d'utilisateurs différents ont des espaces d'adressage virtuel. Parce que les correspondances d'adresses virtual↔physical sont différents, le le cache de TLB est invalidée lors du passage des contextes d'un utilisateur processus à l'autre. Ceci est très cher, car sans l'adresse déjà mis en cache dans le TLB, tout accès mémoire se traduira par un défaut et une promenade de escudos s.

SYSCALLS impliquent deux changements de contexte: l'utilisateur → noyau, puis le noyau → utilisateur. Pour accélérer ce, il est fréquent de réserver la partie supérieure de 1 Go ou 2 Go d'espace d'adressage virtuel pour l'utilisation du noyau. Parce que l'espace d'adressage virtuel ne change pas à travers ces changements de contexte, pas Bouffées TLB sont nécessaires. Cette option est activée par un bit utilisateur / superviseur dans chaque escudos, qui assure que la mémoire du noyau est accessible alors que dans le espace noyau; userspace n'a pas accès même si la table de page est le même.

S'il y avait un support matériel pour deux TLB séparés, avec un usage exclusivement noyau, cette optimisation ne serait plus utile. Toutefois, si vous avez assez d'espace pour consacrer, il est probablement plus utile de faire un peu plus TLB.

Linux sur x86, une fois pris en charge un mode appelé "4G / 4G split". Dans ce mode, l'espace utilisateur a accès à l'ensemble de l'espace d'adressage virtuel de 4 Go, et le noyau dispose également d'un espace d'adressage virtuel complet de 4 Go. Le coût, comme mentionné ci-dessus, est que tous syscall nécessite une purge de TLB, ainsi que des routines plus complexes pour copier des données entre l'utilisateur et la mémoire du noyau. Cette mesure a été d'imposer à une pénalité de performance de 30%.


Les temps ont changé depuis cette question a été posée et a répondu: beaucoup plus répandu des systèmes d'exploitation sont maintenant 64 bits. Dans les systèmes d'exploitation actuels sur x86-64, adresses virtuelles de 0 à 2 47 -1 (0-128TB) sont autorisés pour les programmes utilisateur alors que le noyau réside en permanence dans des adresses virtuelles de 2 47 x (2 17 -1) à 2 64 -1 (ou de -2 47 à -1, si on traite les adresses que entiers signés).

Qu'est-ce qui se passe si vous exécutez un exécutable 32 bits sur Windows 64 bits? On pourrait penser que toutes les adresses virtuelles de 0 à 2 32 (0-4GB) serait facilement disponible, mais afin d'éviter d'exposer les bugs dans les programmes existants, executables 32 bits sont encore limités à 0- 2 Go à moins qu'ils ne soient recompilés avec /LARGEADDRESSAWARE. Pour ceux qui sont, ils ont accès à 0-4GB. (Ce n'est pas un nouveau drapeau, le même appliqué dans les noyaux Windows 32 bits en cours d'exécution avec le commutateur /3GB, qui a changé la valeur par défaut 2G / utilisateur 2G / split noyau 3G / 1G, même si bien sûr 3-4GB ne seront toujours pas de gamme).

Quelles sortes d'insectes pourrait-il y avoir? À titre d'exemple, supposons que vous implémentez quicksort et ont deux pointeurs, a et pointant b au début et après la fin d'un tableau. Si vous choisissez le milieu comme le pivot avec (a+b)/2, cela fonctionnera aussi longtemps que les deux adresses sont inférieures à 2 Go, mais si elles sont à la fois ci-dessus, l'addition rencontrera des débordement d'entier et le résultat sera en dehors du tableau. (L'expression correcte est a+(b-a)/2.)

En aparté, Linux 32 bits, avec sa valeur par défaut 3G / 1G utilisateur / split du noyau, a toujours exécuter des programmes avec leur pile situé dans la plage 2-3GB, de sorte que de telles erreurs de programmation auraient probablement être vidées rapidement . Linux 64 bits donne des programmes 32 bits accès à 0-4GB.

Autres conseils

(Windows comme tout OS) est beaucoup plus que le noyau + pilotes.

Votre demande repose sur un grand nombre de services de systèmes d'exploitation qui n'existent pas seulement dans l'espace du noyau. Il y a beaucoup de tampons, poignées et toutes sortes de ressources qui peuvent se mappées à propre espace d'adressage de votre processus. Chaque fois que vous appelez une fonction API Win32 qui renvoie, par exemple, une poignée de fenêtre, ou une brosse, ces choses doivent être réparties quelque part dans votre processus. Donc, une partie de Windows fonctionne dans le noyau, oui, d'autres parties fonctionnent dans leurs propres processus en mode utilisateur, et quelques-uns, ceux de votre application a besoin d'un accès direct à, sont mis en correspondance avec l'espace d'adressage. Une partie de cela est difficile à éviter, mais un facteur supplémentaire important est la performance. Si tous appel Win32 nécessaire un changement de contexte, ce serait un succès majeur de performance. Si certains d'entre eux peuvent être traités dans usermode car les données qu'ils comptent sur est déjà mis en correspondance avec l'espace d'adressage, le changement de contexte est évité, et vous faire économiser un peu de cycles CPU.

les besoins OS certains quantité de l'espace d'adressage mis de côté. Je crois que Linux par des ensembles par défaut uniquement 1 Go pour le système d'exploitation.

La raison pour laquelle MS réglé sur 2 Go avec Windows a été expliqué sur le blog de Raymond Chen fois. Je n'ai pas le lien, et je ne me souviens pas des détails, mais la décision a été prise parce que Windows NT a été initialement destiné aux processeurs Alpha ainsi, et sur Alpha ce, il y avait vraiment une bonne raison de faire le 50/50 Divisé. ;)

Il était quelque chose à voir avec le soutien de l'Alpha 32, ainsi que le code 64 bits. :)

  

code en cours d'exécution en mode noyau (par exemple le code de pilote de périphérique) dispose de son propre espace d'adressage.

Non, il ne fonctionne pas. Il doit partager l'espace d'adressage avec la partie en mode utilisateur d'un processus sur les processeurs x86. Voilà pourquoi le noyau doivent réserver suffisamment d'espace au total et limité l'espace d'adressage.

Je crois que la meilleure réponse est que les concepteurs de systèmes d'exploitation estimé que le temps que vous auriez à prendre soin, les gens utiliser Windows 64 bits.

Mais voici une une meilleure discussion .

Une partie de la réponse est de faire avec l'histoire des architectures de microprocesseur. Voici une partie de ce que je sais, d'autres peuvent fournir des détails plus récents.

Le processeur Intel 8086 avait une architecture de décalage de segment de mémoire, ce qui donne des adresses de mémoire 20 bits, et par conséquent la mémoire physique adressable totale de 1MB.

Contrairement à la concurrence des processeurs de l'époque - comme le Zilog Z80 - Intel 8086 avait seulement un espace d'adressage qui devait accueillir non seulement la mémoire électronique, mais toutes les communications d'entrée / sortie avec de tels périphériques mineurs que clavier, ports série, les ports d'imprimante et les écrans vidéo. (A titre de comparaison, le Zilog Z80 a un espace d'adressage entrée / sortie séparée avec opcodes d'assemblage dédiés pour l'accès)

La nécessité de laisser un espace pour une gamme sans cesse croissante d'expansion périphériques conduit à la décision initiale de segmenter l'espace d'adressage dans la mémoire électronique de 0-640K, et « autres choses » (entrée / sortie, ROMS, mémoire vidéo, etc.) de 640K à 1Mo.

Comme la ligne x86 a grandi et évolué, et les PC ont évolué avec eux, des programmes similaires ont été utilisés, se terminant par aujourd'hui 2G / 2G répartition de l'espace d'adressage 4G.

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