Différence entre L'adresse virtuelle du noyau et L'adresse logique du noyau?
Je ne suis pas capable de faire exactement la différence entre l'adresse logique du noyau et l'adresse virtuelle. Dans le livre des pilotes de périphériques Linux, il est dit que toutes les adresses logiques sont des adresses virtuelles du noyau, et que les adresses virtuelles n'ont pas de mappage linéaire. Mais logiquement sage quand nous disons qu'il est logique et quand nous disons virtuel et dans quelle situation nous utilisons ces deux ?
4 réponses
le noyau Linux mappe la plupart de l'espace d'adresse virtuelle qui appartient au noyau pour effectuer une mapping 1:1 avec un décalage de la première partie de la mémoire physique. (un peu moins que pour 1 Go pour 32bit x86, peut être différent pour d'autres processeurs ou configurations). Par exemple, pour le code du noyau sur x86, l'adresse 0xc000001 est associée à l'adresse physique 0x1.
c'est ce qu'on appelle la cartographie logique - une cartographie 1:1 (avec un décalage) qui permet au noyau d'accéder à la plupart des la mémoire de la machine.
mais ce n'est pas suffisant - parfois nous avons plus de mémoire physique de 1 Go sur une machine 32 bits, parfois nous voulons référencer des blocs de mémoire physique non contigus comme contigus pour rendre les choses simples, parfois nous voulons cartographier des régions de mémoire io cartographiées qui ne sont pas de la mémoire vive.
pour cela, le noyau garde une région au sommet de son espace d'adresse virtuel où il fait un mappage "aléatoire" de page en page. La cartographie ne suit pas le schéma 1:1 de la zone de cartographie logique. C'est ce que nous appelons le mappage virtuel.
il est important d'ajouter que sur de nombreuses plates-formes (x86 en est un exemple), la cartographie logique et virtuelle est réalisée à l'aide du même mécanisme matériel (TLB contrôlant la mémoire virtuelle). Dans de nombreux cas, la "cartographie logique" est en fait effectuée en utilisant la fonction mémoire virtuelle du processeur, donc cela peut être un peu confus. La différence est donc le modèle selon lequel la cartographie est faite: 1:1 pour logique, quelque chose d'aléatoire pour virtuel.
il y a essentiellement 3 types d'adressage, à savoir
- adressage logique: L'adresse est formée par la base et l'offset. Ce n'est rien d'autre qu'une adresse segmentée, où l'adresse (ou l'offset) dans le programme est toujours utilisé avec la valeur de base dans le descripteur de segment
- adressage linéaire: aussi appelé adresse virtuelle. Ici, les adresses sont contiguës, mais pas l'adresse physique. La pagination est utilisée pour mettre en oeuvre ceci.
- adressage Physique : L' adresse réelle sur la Mémoire Principale!
maintenant, sous linux, la mémoire du noyau (dans l'espace d'adresse) est supérieure à 3 Go ( 3 Go à 4 Go), soit 0xc000000..Les adresses utilisées par le noyau ne sont pas des adresses physiques. Pour mapper l'adresse virtuelle, il utilise PAGE_OFFSET. Il faut veiller à ce qu'il n'y ait pas de traduction de page. c'est-à-dire que ces adresses sont contiguës par nature. Toutefois, il y a une limite à cela, c'est-à-dire 896 Mo sur x86. Au-delà de laquelle la pagination est utilisée pour la traduction. Lorsque vous utilisez vmalloc, ces adresses sont retournés à accéder à la mémoire allouée.
en bref, quand quelqu'un se réfère à la mémoire virtuelle dans le contexte de L'espace utilisateur, alors c'est par le biais de la pagination. Si la mémoire virtuelle du noyau est mentionnée, alors il s'agit de L'adresse PAGE_OFFSETed ou vmalloced.
(Référence de la Compréhension du Noyau Linux - 2.6 )
Shash
les adresses logiques du noyau sont des mappages accessibles au Code du noyau par les fonctions normales D'accès en mémoire CPU. Sur les systèmes 32 bits, il n'existe que 4 Go d'espace d'adresse logique du noyau, même si la mémoire physique utilisée est plus importante. L'espace d'adresse logique appuyé par la mémoire physique peut être attribué avec kmalloc
.
adresses Virtuelles n'ont pas forcément logique correspondant adresses. Vous pouvez affecter la mémoire physique avec vmalloc
et récupérer une adresse virtuelle, qui n'a pas de adresse logique correspondante (sur les systèmes 32 bits avec PAE, par exemple). Vous pouvez ensuite utiliser kmap
pour attribuer une adresse logique à cette adresse virtuelle.
pour parler simplement, l'adresse virtuelle inclurait "haute mémoire", qui ne fait pas le mappage 1:1 pour l'adresse physique,si la taille de votre RAM est supérieure à la plage d'adresses du noyau(typiquement,pour 1G/3G dans X86, votre RAM est 3G mais votre plage d'adresses du noyau est 1G) et aussi le retour d'adresse de kmap() et vmalloc (), qui nécessite que le noyau établisse la table de page pour la cartographie mémoire. puisque l'adresse logique est toujours en mémoire mappée par le noyau( mappage 1:1), vous n'avez pas besoin d'indiquer explicitement appelez L'API du noyau, comme set_pte pour configurer l'entrée de la table de page pour la page en question.
ainsi l'adresse virtuelle ne peut pas être l'adresse logique tout le temps.