Différence entre l'adresse mémoire physique / logique / virtuelle
je suis un peu confus sur les conditions physiques/logiques/adresses virtuelles dans un Système d'Exploitation(j'utilise Linux open SUSE)
voici ce que je comprends:
Adresse Physique - Lorsque le processeur est en mode système, l'adresse utilisée par le processeur est l'adresse physique.
Adresse Logique - Lorsque le processeur est en mode utilisateur, l'adresse utilisée est l'adresse logique. ce sont de toute façon mappé à l'adresse en ajout d'un registre de base avec la valeur offset.Il fournit en quelque sorte une sorte de protection de la mémoire.
je suis tombé sur une discussion que les adresses virtuelles et logiques/l'espace d'adresse sont les mêmes. Est-il vrai?
Toute aide est grandement appréciée.
9 réponses
ma réponse est vraie pour les processeurs Intel tournant sur un système Linux moderne, et je parle de processus au niveau de l'Utilisateur, pas de code du noyau. Pourtant, je pense que cela vous donnera assez de perspicacité pour penser aux autres possibilités
Types D'Adresses
concernant la question 3:
j'ai rencontré des discussions que virtuel et logique adresses/espace d'adressage sont les mêmes. Est-il vrai?
autant Que je sache, ils sont les mêmes,au moins dans les systèmes D'exploitation modernes sur les processeurs Intel.
Permettez-moi de tenter de définir deux notions avant d'expliquer plus:
- Adresse Physique: l'adresse de l'endroit où quelque chose se trouve physiquement dans la puce de mémoire vive.
- Adresse Logique/Virtuelle: l'adresse que votre programme utilise pour atteindre ses objets. Il est généralement converti à une adresse physique plus tard par une puce matérielle (la plupart du temps, pas même le CPU est conscient de cette conversion).
Adresse Virtuelle / Logique
l'adresse virtuelle est bien, une adresse virtuelle, L'OS avec un circuit matériel appelé le MMU (Unité de gestion de mémoire) tromper votre programme qu'il fonctionne seul dans le système, il a l'espace d'adresse complète(ayant système de 32 bits signifie que votre programme pensera qu'il a 4 GBs de RAM; en gros).
Évidemment, si vous avez plus d'un programme en cours d'exécution à l'époque (vous toujours faire, l'interface, le processus Init, la Coquille, l'application horloge, calendrier, peu importe), cela ne fonctionne pas.
ce qui va se passer, c'est que L'OS va mettre la plupart de votre mémoire de programme dans le disque dur, les parties que vous utilisez le plus seront présentes dans la mémoire vive, mais bon, ça ne veut pas dire qu'ils auront l'adresse que vous connaissez.
Exemple: votre processus peut avoir une variable nommée (counter) Qui donne l'adresse virtuelle 0xff (imaginablement...) et une autre variable nommée (souvent non utilisée) qui a donné l'adresse virtuelle (0xaa).
si vous lisez l'assemblage de votre code compilé après que tous les liens se soient produits, vous y accéderez en utilisant ces adresses mais bien, la variable (oftenNotUsed) ne sera pas vraiment là en RAM à 0xaa, elle sera dans le disque dur parce que vous ne l'utilisez pas.
de plus, la variable (counter) ne sera probablement pas physiquement à (0xff), elle sera ailleurs en RAM, quand votre CPU essaiera de récupérer ce qui est en 0xff, le MMU et un une partie de L'OS, va faire un mappage et obtenir cette variable d'où elle est vraiment disponible dans la RAM, vous ne remarquerez même pas qu'elle n'était pas dans 0xff.
maintenant que se passe-t-il si votre programme demande la variable (souvent pas utilisée)? Le système D'exploitation MMU + remarquera cette "erreur" et la récupérera pour vous à partir du disque dur vers RAM, puis vous la remettra comme si elle se trouvait dans l'adresse (0xaa); cette récupération signifie que certaines données qui étaient présentes en RAM seront renvoyées vers le disque dur.
Maintenant, imaginez cela fonctionne pour chaque processus dans votre système. Tout le monde pense qu'ils ont 4 Go de RAMs, personne ne l'a vraiment mais tout fonctionne parce que tout le monde a certaines parties de son programme disponibles physiquement dans la RAM mais la plupart du programme réside dans le disque dur. Ne confondez pas cette partie de la mémoire du programme étant mis en HD avec les données du programme que vous pouvez accéder par des opérations de fichier.
résumé
adresse Virtuelle: L'adresse que vous utilisez dans votre programmes, l'adresse que votre CPU utilise pour récupérer des données, n'est pas réelle et est traduite via MMU à une adresse physique; tout le monde en a une et sa taille dépend de votre système(Linux tournant 32 bits a une adresse de 4 Go)
adresse Physique: l'adresse que vous n'atteindrez jamais si vous courez sur un OS. C'est là que vos données, quelle que soit leur adresse virtuelle, se trouvent en RAM. Cela va changer si vos données sont renvoyées sur le disque dur pour accueillir plus d'espace pour les autres processus.
Tout ce que j'ai mentionné ci-dessus, bien qu'il s'agisse d'une version simplifiée de l'ensemble du concept, est ce qu'on appelle la gestion de la mémoire du système informatique.
conséquences de ce système
- les processus ne peuvent pas accéder entre eux la mémoire, chacun a ses adresses virtuelles séparées et chaque processus obtient une traduction différente à différents domaines, même si parfois vous pouvez regarder et trouver que deux processus essayez d'accéder à la même adresse virtuelle.
- ce système fonctionne aussi bien qu'un système de mise en cache, vous n'utilisez généralement pas la totalité des 4 Go disponibles, alors pourquoi gaspiller cela? laissez les autres le partager et laissez-les l'utiliser aussi; si vous avez besoin de plus, vous récupérerez vos données de la HD et remplacerez les leurs, aux frais bien sûr.
Adresse Physique - Lorsque le processeur est en mode système, l'adresse utilisée par le processeur est l'adresse physique.
pas nécessairement vrai. Cela dépend du CPU particulier. Sur les CPUs x86, une fois que vous avez activé la traduction de page, tout le code cesse de fonctionner avec des adresses physiques ou des adresses trivialement convertibles en adresses physiques (sauf SMM, AFAIK, mais ce n'est pas important ici).
Adresse Logique - Lorsque le processeur est en en mode utilisateur, l'adresse utilisée est l'adresse logique. ceux-ci sont de toute façon mappés à une adresse physique en ajoutant un registre de base avec la valeur offset.
Les adresses logiques ne s'appliquent pas nécessairement exclusivement au mode utilisateur. Sur les processeurs x86, ils existent aussi en mode noyau.
je suis tombé sur une discussion que les adresses/espaces d'adresse virtuels et logiques sont les mêmes. Est-il vrai?
cela dépend du CPU particulier. x86 Les CPU peuvent être configurés de telle manière que les segments ne soient pas utilisés explicitement. Ils sont utilisés implicitement et leurs bases sont toujours 0 (à l'exception des segments thread-local-storage). Ce qui reste lorsque vous supprimez le sélecteur de segment d'une adresse logique est un offset 32 bits (ou 64 bits) dont la valeur coïncide avec l'adresse virtuelle 32 bits (ou 64 bits). Dans cette configuration simplifiée, vous pouvez envisager de les deux être les mêmes que les adresses logiques n'existent pas. Ce n'est pas vrai, mais pour la plupart des fins pratiques, assez bon d'un rapprochement.
je me réfère à la base de réponse ci-dessous sur Intel x86 CPU
différence entre L'adresse logique et L'adresse virtuelle
lorsque votre programme est en cours D'exécution, CPU génère une adresse logique pour les instructions qui contiennent (sélecteur de Segment 16 bits et offset 32 bits).Fondamentalement virtuel (adresse linéaire) est généré en utilisant des champs d'adresse logique.
le sélecteur de Segment est un champ de 16 bits dont le premier 13bit est index (ce qui est un pointeur vers le le descripteur de segment réside dans GDT, décrit ci-dessous) , champ TI de 1 bit ( TI = 1, Refer LDT , TI=0 Refer GDT )
maintenant le sélecteur de Segment ou l'Identificateur de segment say renvoie au Segment de Code ou au Segment de données ou au Segment de pile etc. Linux contient un GDT/LDT (Global / Local Descriptor Table) qui contient 8 byte descripteur de chaque segment et détient l'adresse de base (virtuelle) du segment.
ainsi pour chaque adresse logique, l'adresse virtuelle est calculée en utilisant ci-dessous étape.
1) examine le champ TI du sélecteur de Segments pour déterminer quel descripteur Le tableau conserve le descripteur de Segment. Ce champ indique que le Descripteur est soit dans le GDT (auquel cas l'Unité de segmentation obtient la base linéaire adresse du GDT du registre gdtr) ou dans la LDT active (auquel cas la Unité de segmentation obtient l'adresse de base linéaire de cette LDT à partir du registre LD tr).
2) Calcule l'adresse du Descripteur de Segment le champ index du Segment Sélecteur. Le champ index est multiplié par 8 (la taille d'un descripteur de Segment), et le résultat est ajouté au contenu de la gdtr ou ldtr registre.
3) ajoute le décalage de l'adresse logique au champ de Base du descripteur de Segment, obtenir ainsi l'adresse linéaire (virtuelle).
maintenant c'est le travail de L'Unité de pagination de traduire l'adresse physique de l'adresse virtuelle.
Refer: comprendre le noyau linux, Chapitre 2 Adressage De Mémoire
Normalement chaque adresse émise (pour l'architecture x86) est une adresse logique qui est traduite en une adresse linéaire via les tables de segments. Après la traduction en adresse linéaire, il est ensuite traduit en adresse physique via la table de page.
Un bel article expliquant la même chose dans depth:
http://duartes.org/gustavo/blog/post/memory-translation-and-segmentation/
L'adresse physique est l'adresse qui est vue par l'Unité de mémoire, c'est-à-dire une adresse chargée dans le registre d'adresses mémoire. L'adresse logique est l'adresse générée par le CPU. Le programme utilisateur ne peut jamais voir la vraie adresse physique.Unité de cartographie mémoire convertit l'adresse logique en adresse physique. Adresse logique généré par l'utilisateur doit être mappé à la mémoire physique, avant de servir.
la mémoire logique est relative au programme respectif I. e (Point de départ du programme + décalage)
mémoire virtuelle utilise une table de page qui correspond à la mémoire vive et au disque. De cette façon, chaque processus peut promettre plus de mémoire pour chaque processus individuel.
dans le Usermode ou UserSpace toutes les adresses vues par le programme sont des adresses virtuelles. En mode noyau, les adresses vues par le noyau sont encore virtuelles mais appelées aussi logiques qu'elles sont égales à physical + pageoffset . Les adresses physiques sont celles qui sont vues par RAM . Avec la mémoire virtuelle chaque adresse dans le programme passe par les tables de page.
quand u écrire un petit programme par exemple:
int a=10;
int main()
{
printf("%d",a);
}
compile: >gcc -c fname.c
>ls
fname.o //fname.o is generated
>readelf -a fname.o >readelf_obj.txt
/readelf est une commande pour comprendre les fichiers d'objets et les fichiers exécutables qui seront en 0s et 1s. la sortie est écrite en readelf_onj.fichier txt/
`>vim readelf_obj.txt`
/ * sous "en-tête de section" vous verrez .données. texte. sections rodata de votre fichier objet. chaque début ou l'adresse de base est commencée à partir de 0000 et croît à la taille respective jusqu'à ce qu'elle atteigne la taille sous la rubrique "taille" - - - > ceux-ci sont les adresses logiques.* /
>gcc fname.c
>ls
a.out //your executabe
>readelf -a a.out>readelf_exe.txt
>vim readelf_exe.txt
/* ici l'adresse de base de toutes les sections n'est pas zéro. il part d'une adresse particulière et se termine à l'adresse particulière. Le linker donnera les adresses continues à toutes les sections (observer dans le readelf_exe.fichier txt. observer l'adresse de base et la taille de chaque section. Ils commencent en continu) donc seules les adresses de base sont différentes.---> ceci est appelé l'espace d'adressage virtuel.* /
adresse Physique-> la mémoire ll avoir l'adresse physique. lorsque votre fichier exécutable est chargé en mémoire, il disposerez d'adresse physique. En fait, les adresses virtuelles sont mappées aux adresses physiques pour l'exécution.
adresses virtuelles des utilisateurs Ce sont les adresses régulières vues par les programmes de l'espace utilisateur. Les adresses des utilisateurs sont soit 32 ou 64 bits selon l'architecture matérielle sous-jacente, et chaque processus a son propre espace d'adressage virtuel.
adresses Physiques Les adresses utilisées entre le processeur et la mémoire du système. Les adresses physiques sont des quantités de 32 ou 64 bits; même les systèmes 32 bits peuvent utiliser des adresses physiques 64 bits dans certains cas. situation.
adresses des Bus Les adresses utilisées entre les bus périphériques et la mémoire. Souvent, ils sont les mêmes que les adresses physiques utilisées par le processeur, mais qui n'est pas nécessairement le cas. Les adresses des Bus dépendent fortement de l'architecture, bien sûr.
adresses logiques du noyau Ceux-ci constituent l'espace d'adresse normal du noyau. Ces adresses cartographient la plupart ou la totalité de la mémoire principale, et sont souvent traitées comme si elles étaient physiques adresse. Sur la plupart des architectures, les adresses logiques et leurs adresses physiques associées ne diffèrent que par un décalage constant. Les adresses logiques utilisent la taille du pointeur natif du matériel, et peuvent donc être incapables d'adresser toute la mémoire physique sur des systèmes 32 bits fortement équipés. Les adresses logiques sont généralement stockées dans des variables de type non signé long ou void *. La mémoire retournée par kmalloc a une adresse logique.
adresses virtuelles du noyau Ils diffèrent de la logique les adresses qu'ils n'ont pas nécessairement une correspondance directe aux adresses physiques. Toutes les adresses logiques sont des adresses virtuelles du noyau; la mémoire allouée par vmalloc a aussi une adresse virtuelle (mais pas de mappage physique direct). La fonction kmap renvoie des adresses virtuelles. Les adresses virtuelles sont généralement stockées dans des variables de pointeur.
si vous avez une adresse logique, la macro __pa() (définie dans ) retournera son adresse physique associée. Adresses physiques peuvent être mappés à les adresses logiques avec _ _ va (), mais seulement pour les pages à faible mémoire.