web-dev-qa-db-fra.com

Différence entre l'adresse de mémoire physique/logique/virtuelle

Je suis un peu confus quant aux termes adresses physique/logique/virtuelle dans un système d'exploitation (j'utilise Linux - open SUSE)

Voici ce que j'ai compris:

  1. Adresse physique: lorsque le processeur est en mode système, l'adresse utilisée par le processeur est l'adresse physique.

  2. Adresse logique: lorsque le processeur est en mode utilisateur, l'adresse utilisée est l'adresse logique. ceux-ci sont quand même mappés sur une adresse physique en ajoutant un registre de base avec la valeur de décalage.Il fournit en quelque sorte une sorte de protection de la mémoire.

  3. Je suis tombé sur la discussion que les adresses virtuelles et logiques/espace d'adressage sont les mêmes. Est-ce vrai? 

Toute aide est très appréciée.

22
vk_gst

Ma réponse est vraie pour les processeurs Intel fonctionnant sur un système Linux moderne, et je parle de processus au niveau utilisateur, pas de code de noyau. Néanmoins, je pense que cela vous donnera suffisamment de perspicacité pour penser aux autres possibilités

Types d'adresse

En ce qui concerne la question 3:

Je suis tombé sur une discussion aussi virtuelle que logique les adresses/espaces d'adresses sont les mêmes. Est-ce vrai?

Autant que je sache, ils sont identiques, du moins dans les systèmes d’exploitation modernes fonctionnant au-dessus des processeurs Intel.

Laissez-moi essayer de définir deux notions avant d’en expliquer davantage:

  • Adresse physique : L'adresse de l'emplacement physique de quelque chose dans la puce RAM.
  • Adresse logique/virtuelle : L'adresse que votre programme utilise pour atteindre ses objets. Il est généralement converti ultérieurement en adresse physique par une puce matérielle (la plupart du temps, même le processeur n'est pas au courant de cette conversion).

Adresse virtuelle/logique

L’adresse virtuelle est bien, une adresse virtuelle, le système d’exploitation associé à un circuit matériel appelé MMU (unité de gestion de la mémoire) indiquent à votre programme qu’il est exécuté seul dans le système, il possède tout l’espace adresse (32 Le système de bits signifie que votre programme pensera avoir 4 Go de RAM;.

Évidemment, si vous avez plus d'un programme en cours d'exécution à la fois (vous le faites toujours, interface graphique, processus Init, Shell, application d'horloge, calendrier, etc.), cela ne fonctionnera pas.

Ce qui se passera, c’est que le système d’exploitation mettra la plus grande partie de la mémoire de votre programme sur le disque dur. Les parties que vous utilisez le plus seront présentes dans la RAM mais bon, cela ne signifie pas qu’ils auront l’adresse que vous avez choisie. savoir.

Exemple: Votre processus peut avoir une variable nommée (compteur) qui reçoit l'adresse virtuelle 0xff (imaginable ...) et une autre variable nommée (souvent non utilisée) qui reçoit l'adresse virtuelle (0xaa).

Si vous lisez l'assemblage de votre code compilé après que tous les liens ont été établis, vous y accéderez en utilisant ces adresses, mais bon, la variable (souvent notée non utilisée) ne sera pas vraiment là dans RAM à 0xaa, ce sera dans le disque dur parce que vous ne l'utilisez pas.

De plus, la variable (compteur) ne sera probablement pas physiquement à (0xff), ce sera quelque part dans la RAM, lorsque votre CPU essaiera d'extraire le contenu de 0xff, le MMU et une partie du système d'exploitation, effectuera un mappage et obtiendra cette variable à partir de là 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 notée non utilisée)? MMU + OS remarquera ce "message manquant" et le récupérera du disque dur vers RAM, puis vous le remettra comme s'il se trouvait dans l'adresse (0xaa); cette extraction signifie que certaines données présentes dans RAM seront renvoyées au disque dur.

Imaginez maintenant que cela fonctionne pour tous les processus de votre système. Tout le monde pense avoir 4 Go de RAM, mais personne ne l’a en fait, mais tout fonctionne parce que tout le monde a des 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 de programme insérée en HD avec les données de programme auxquelles vous pouvez accéder par le biais d’opérations sur les fichiers.

Résumé

Adresse virtuelle : L'adresse que vous utilisez dans vos programmes, l'adresse que votre CPU utilise pour extraire des données, n'est pas réelle et est traduite via MMU en une adresse physique quelconque; tout le monde en a un et sa taille dépend de votre système (Linux sous 32 bits a 4 Go d'espace d'adressage)

Adresse physique : L'adresse que vous n'atteindrez jamais si vous utilisez un système d'exploitation. C'est là que vos données, quelle que soit leur adresse virtuelle, résident dans la RAM. Cela changera si vos données sont envoyées dans les deux sens sur le disque dur afin de libérer plus d'espace pour d'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, constitue ce que l'on appelle la partie gestion de la mémoire du système informatique.

Conséquences de ce système

  • Les processus ne peuvent pas accéder aux autres mémoires, tout le monde a ses adresses virtuelles distinctes et chaque processus obtient une traduction différente dans des zones différentes, même si parfois vous pouvez rechercher que deux processus tentent d'accéder à la même adresse virtuelle.
  • Ce système fonctionne bien en tant que système de cache, vous n'utilisez généralement pas les 4 Go disponibles, alors pourquoi gaspiller cela? laissez les autres le partager et laissez-les l'utiliser aussi; quand vous aurez besoin de plus, vous récupérerez vos données sur le disque dur et vous les remplacerez, à un coût bien sûr. 
42
Fingolfin

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 processeur particulier. Sur les processeurs x86, une fois que vous avez activé la traduction de page, tout le code cesse de fonctionner avec des adresses physiques ou des adresses banalement convertibles en adresses physiques (sauf SMM, AFAIK, mais ce n'est pas important ici).

Adresse logique: lorsque le processeur est en mode utilisateur, l'adresse utilisée est l'adresse logique. ceux-ci sont néanmoins mappés à une adresse physique en ajoutant un registre de base avec la valeur de décalage.

Les adresses logiques ne s'appliquent pas nécessairement au mode utilisateur exclusivement. Sur les processeurs x86, ils existent également en mode noyau.

Je suis tombé sur la discussion que les adresses virtuelles et logiques/espace d'adressage sont les mêmes. Est-ce vrai?

Cela dépend du processeur particulier. Les processeurs x86 peuvent être configurés de telle sorte que les segments ne soient pas utilisés explicitement. Ils sont utilisés implicitement et leurs bases sont toujours égales à 0 (sauf pour les segments de thread-local-storage). Ce qui reste lorsque vous supprimez le sélecteur de segment d'une adresse logique correspond à un décalage de 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 considérer que les deux sont identiques ou que les adresses logiques n'existent pas. Ce n'est pas vrai, mais dans la plupart des cas pratiques, c'est assez approximatif.

10
Alexey Frunze

Je me réfère à la base de réponses ci-dessous sur Intel x86 CPU

Différence entre adresse logique et adresse virtuelle

Chaque fois que votre programme est en cours d'exécution, la CPU génère une adresse logique pour les instructions contenant (sélecteur de segment 16 bits et décalage de 32 bits). Généralement virtuelle (adresse linéaire) est générée à l'aide de champs d'adresse logique.

Le sélecteur de segment est un champ de 16 bits sur lequel le premier 13 bits est un index (qui est un pointeur sur le descripteur de segment situé dans GDT, décrit ci-dessous), champ TI à 1 bit (TI = 1, reportez-vous à LDT, TI = 0 reportez-vous à GDT)

Maintenant le sélecteur de segment OR dit identificateur de segment fait référence au segment de code OR segment de données OR segment de pile, etc. Linux contient un GDT/LDT (table de descripteur global/local) qui contient un descripteur de 8 octets de chacun des segments et contient l'adresse de base (virtuelle) du segment.

Donc, pour chaque adresse logique, l'adresse virtuelle est calculée en utilisant les étapes ci-dessous.

1) Examine le champ TI du sélecteur de segment pour déterminer quel descripteur La table stocke le descripteur de segment. Ce champ indique que le descripteur est Soit dans le GDT (auquel cas l'unité de segmentation obtient l'adresse linéaire De base du GDT du registre gdtr) ou dans le LDT actif (auquel cas le l’unité de segmentation obtient l’adresse linéaire de base de ce LDT à partir du registre ldtr).

2) Calcule l'adresse du descripteur de segment à partir du champ d'index du sélecteur de segment Le champ d'index est multiplié par 8 (taille d'un descripteur de segment), Et le résultat est ajouté au contenu du registre gdtr ou ldtr.

3) Ajoute le décalage de l'adresse logique au champ Base du descripteur de segment, , Obtenant ainsi l'adresse linéaire (virtuelle).

Il incombe maintenant à l’unité de pagination de traduire l’adresse physique de l’adresse virtuelle.

Voir: Comprendre le noyau Linux, Chapitre 2 Adressage de la mémoire 

5
Nishith Goswami

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 une table de pages.
Un bel article expliquant la même chose en profondeur:
http://duartes.org/gustavo/blog/post/memory-translation-and-segmentation/

3
qstack

La mémoire logique est relative au programme respectif i.e (point de départ du programme + décalage)

La mémoire virtuelle utilise une table de pages qui mappe à la RAM et au disque. Ainsi, chaque processus peut promettre plus de mémoire pour chaque processus. 

1
ShowLove

L'adresse physique est l'adresse visible par l'unité de mémoire, c'est-à-dire celle chargée dans le registre d'adresses mémoire . Adresse logique est l'adresse générée par la CPU . Le programme utilisateur ne peut jamais voir l'adresse physique réelle L'unité de mappage .Memory convertit l'adresse logique en adresse physique . L'adresse logique générée par le processus utilisateur doit être mappée sur la mémoire physique avant d'être utilisée.

1
Manohar A

lorsque vous écrivez 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 permettant de comprendre les fichiers objets et le fichier exécutable qui seront en 0 et en 1. la sortie est écrite dans le fichier readelf_onj.txt

`>vim readelf_obj.txt`

/ * sous "en-tête de section", vous verrez les sections .data .text et .rodata de votre fichier objet. chaque adresse de départ ou de base est démarrée à partir de 0000 et croît jusqu'à la taille respective jusqu'à atteindre la taille sous l'en-tête "taille" ----> il s'agit des 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 commencera à partir de l'adresse particulière et se terminera à l'adresse particulière. L'éditeur de liens donnera les adresses continues à toutes les sections (observez dans le fichier readelf_exe.txt. Observez l'adresse de base et la taille de chaque section. Elles commencent continuellement) afin que seules les adresses de base soient différentes. espace d'adressage. * / 

Adresse physique-> la mémoire aura l'adresse physique. Lorsque votre fichier exécutable est chargé en mémoire, il aura une adresse physique. En réalité, les adresses virtuelles sont mappées sur des adresses physiques pour l'exécution.

0
sneha maganahalli

En mode Usermode ou UserSpace, toutes les adresses vues par programme sont des adresses virtuelles . En mode noyau, les adresses vues par le noyau sont toujours virtuelles mais qualifiées de logiques car égales à physical + pageoffset . Les adresses physiques sont celles qui sont vues par RAM . Avec la mémoire virtuelle, chaque adresse du programme passe par des tables de pages. 

0
Ulka Vaze

Adresses virtuelles utilisateur Ce sont les adresses habituelles vues par les programmes de l'espace utilisateur. Les adresses utilisateur ont une longueur de 32 ou 64 bits, en fonction de 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 32 ou 64 bits; Même les systèmes 32 bits peuvent utiliser des adresses physiques 64 bits dans certaines situations.

Adresses de bus Les adresses utilisées entre les bus de périphériques et la mémoire. Souvent, elles sont identiques aux adresses physiques utilisées par le processeur, mais ce n'est pas nécessairement le cas. Les adresses de bus dépendent bien entendu de l'architecture.

Adresses logiques du noyau Celles-ci constituent l'espace d'adressage normal du noyau. Ces adresses mappent la plupart ou la totalité de la mémoire principale et sont souvent traitées comme s'il s'agissait d'adresses physiques. Sur la plupart des architectures, les adresses logiques et les 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 lourdement équipés. Les adresses logiques sont généralement stockées dans des variables de type unsigned long ou void *. La mémoire renvoyée par kmalloc a une adresse logique.

Adresses virtuelles du noyau Celles-ci diffèrent des adresses logiques en ce qu'elles ne permettent pas nécessairement un mappage direct aux adresses physiques. Toutes les adresses logiques sont des adresses virtuelles du noyau; La mémoire allouée par vmalloc a également 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) renvoie l'adresse physique associée. Les adresses physiques peuvent être remises en correspondance avec des adresses logiques avec __va (), mais uniquement pour les pages à faible mémoire.

Référence

0
subodh saxena