2010-06-08 21 views
0

Cette image donne une bonne image de l'espace d'adressage virtuel. Mais cela ne dit que la moitié de l'histoire. Il donne seulement une image complète de l'espace de l'adresse de l'utilisateur, c'est-à-dire inférieure à 50% (ou 75% dans certains cas).Besoin d'une image complète de l'espace d'adressage virtuel

Qu'en est-il du reste 50% (ou 25%) qui est occupé par le noyau. Je sais que le noyau a aussi beaucoup de choses différentes comme les modules du noyau, les pilotes de périphériques, le noyau lui-même. Il doit y avoir une sorte de mise en page droite?

Quelle est sa disposition? Si vous dites que son système d'exploitation dépend. Je dirais, il y a deux principaux systèmes d'exploitation Windows & Linux. S'il vous plaît donner une réponse pour l'un de ceux-ci.

alt text http://img690.imageshack.us/img690/2543/virtualadressspace.gif

+2

J'ai de mauvaises nouvelles pour vous. Ce que vous voulez ne peut pas être fourni. Cela dépend non seulement du système d'exploitation, mais également de la version du système d'exploitation utilisée. En outre, votre diagramme d'espace d'adresses utilisateur est également incomplet et dépend beaucoup du compilateur que vous utilisez et de la version qui s'y trouve. –

+1

Seulement deux principaux systèmes d'exploitation? –

+0

@JUST MY correcte OPINION: 'Aussi, votre diagramme d'espace adresse de l'utilisateur est également incomplète': Comment? J'ai toujours pensé que c'était complet. Et comment cela dépend du compilateur? Je pensais que cela ne dépend que du système d'exploitation. – claws

Répondre

2

J'ai encore pire nouvelles pour vous, il y a aussi une fonction de randomiser explicitement mises en page d'adresse du noyau par le système d'exploitation comme une caractéristique de sécurité. Ceci est activé par défaut dans la version la plus récente de Windows, OpenBSD, en plus d'être une option pour Linux.

1

Comme les utilisateurs ont dit ici, votre image est incomplète. Il a tendance à ressembler à un système d'exploitation à un seul thread. En particulier, il peut y avoir des centaines de threads dans le processus (donc partager le même espace d'adressage), chacun avec sa propre pile.

En outre, je crois que l'image réelle de l'espace d'adressage peut varier fortement selon la version du système d'exploitation et quelques changements subtils.

0

Ce n'est pas tout à fait clair à partir de votre question ou de l'image, mais avec le 'System Address Space', vous voulez probablement dire que la zone entre 2 Go et 4 Go. Cela prend en effet la moitié de l'espace théorique de 4 Go, mais il y a une raison valable pour cela.

Normalement avec 32 bits vous pouvez adresser 4 Go de mémoire (2^32 = 4294967296) donc il semblerait logique d'avoir 4 Go d'espace d'adressage, pas 2 Go. La raison est la suivante: Supposons que vous ayez 2 pointeurs, comme celui-ci en C/C++:

char *ptr1; 
char *ptr2; 

Je veux maintenant savoir quelle est la différence entre les deux pointeurs, comme ceci:

offset = ptr2 - ptr1; 

Quel devrait être le type de données 'offset'? Si nous ne savons pas si ptr1 vient avant ptr2 ou vice versa, le décalage peut être positif ou négatif. Maintenant, si ptr1 ou ptr2 sont tous deux compris entre 0 et 2 Go, le décalage est toujours compris entre -2147483648 et +2147483647, ce qui correspond exactement à un entier signé de 4 octets. Toutefois, si ptr1 et ptr2 pouvaient accéder à l'espace d'adressage complet de 4 Go, le décalage se situerait entre -4294967296 et +4294967295, ce qui ne correspond plus à un entier signé de 4 octets. Si vous êtes sûr que vous ne faites jamais ce genre de calculs dans votre application, ou si vous êtes sûr que si vous soustrayez 2 pointeurs, ils ne seront jamais plus éloignés que 2 Go (ou vos vecteurs sont toujours plus petits que 2) GB), vous pouvez indiquer à l'éditeur de liens (Windows, Visual Studio) que votre application est LARGEADDRESSAWARE. Cet indicateur de liaison définit un bit dans l'exécutable, et si un Windows 32 bits est démarré correctement (sous XP, vous devez démarrer avec le flag/3GB), Windows vous donne 3GB au lieu de 2GB (uniquement pour les exécutables LARGEADDRESSAWARE). Le 1 Go restant est toujours utilisé pour les structures de données du système d'exploitation (mais je n'ai pas de détails à leur sujet).

Si vous utilisez Windows 64 bits, les choses deviennent encore plus intéressantes, car les exécutables LARGEADDRESSAWARE obtiendront 4 Go de mémoire. Apparemment, les structures de données du système d'exploitation sont maintenant stockées quelque part dans l'espace d'adressage de 64 bits, en dehors des 4 Go utilisés par l'application.

Espérons que cela clarifie un peu.