Maison  >  Article  >  Opération et maintenance  >  Qu'est-ce que pfn sous Linux

Qu'est-ce que pfn sous Linux

青灯夜游
青灯夜游original
2022-03-24 11:57:323901parcourir

Sous Linux, pfn signifie « numéro de cadre de page », qui est le numéro de zone de mémoire physique. Le « cadre de page » fait référence à la mémoire physique. Il divise la mémoire physique en zones de taille de page et attribue à chaque page un numéro, et ce numéro est PFN.

Qu'est-ce que pfn sous Linux

L'environnement d'exploitation de ce tutoriel : système linux5.9.8, ordinateur Dell G3.

1. Qu'est-ce que le cadre de page ?

L'une des fonctions les plus importantes du système d'exploitation est de gérer diverses ressources du système informatique. En tant que ressource la plus importante : la mémoire, nous devons la gérer. Dans le système d'exploitation Linux, la mémoire physique est gérée en fonction de la taille de la page. La taille spécifique de la page est liée au matériel et à la configuration du système Linux 4k est le paramètre le plus classique. Par conséquent, pour la mémoire physique, nous la divisons en pages classées par taille de page. La zone mémoire de taille de page dans chaque mémoire physique est appelée cadre de page. Nous établissons une structure de données de page struct pour chaque cadre de page physique afin de suivre l'utilisation de chaque page physique : est-elle utilisée pour le segment de texte du noyau ? Ou s'agit-il d'un tableau de pages pour un processus ? Est-il utilisé pour divers caches de fichiers ou est-il dans un état libre...

Chaque cadre de page a une structure de données de page correspondante un à un. Les macros page_to_pfn et pfn_to_page sont définies dans le système pour les utiliser entre les pages. Le numéro de trame et la structure des données de la page. La méthode spécifique de conversion est liée au modèle de mémoire. Nous décrirons en détail les trois modèles de mémoire dans le noyau Linux au chapitre 3.

2. Qu'est-ce que le PFN ?

Pour un système informatique, l'intégralité de son espace d'adressage physique doit être une période d'espace d'adressage commençant à 0 et se terminant par l'espace physique maximum que le système réel peut prendre en charge. Dans le système ARM, en supposant que l'adresse physique est de 32 bits, alors l'espace d'adressage physique est de 4G. Dans le système ARM64, si le nombre de bits d'adresse physique pris en charge est de 48, alors l'espace d'adressage physique est de 256T. Bien sûr, en fait, tout un espace d'adressage physique aussi grand n'est pas utilisé pour la mémoire, certains appartiennent également à l'espace d'E/S (bien sûr, certaines arches de CPU ont leur propre espace d'adressage IO indépendant). Par conséquent, l'espace d'adressage physique occupé par la mémoire doit être un intervalle limité et il est impossible de couvrir la totalité de l'espace d'adressage physique. Cependant, maintenant que la mémoire devient de plus en plus grande, pour les systèmes 32 bits, l'espace d'adressage physique 4G ne peut plus répondre aux besoins en mémoire, il existe donc le concept de mémoire élevée, qui sera décrit en détail plus tard.

PFN est l'abréviation du numéro de cadre de page. Le soi-disant cadre de page est pour la mémoire physique. La mémoire physique est divisée en zones de taille de page, et chaque page est numérotée. En supposant que la mémoire physique commence à l'adresse 0, alors le cadre de page avec PFN égal à 0 est la page qui commence à l'adresse 0 (adresse physique). En supposant que la mémoire physique commence à l'adresse x, le numéro du premier cadre de page est (x>>PAGE_SHIFT).

La plage de valeurs du PFN est 0---- (taille de la mémoire >> 12).

Mais en raison de la relation de mappage de la mémoire physique, l'adresse de la mémoire physique 0 ne correspond pas à l'adresse physique 0 sur le système. Par exemple : sur s3c2440, l'adresse mémoire commence à 0x30000000. Lorsque la RAM est connectée, l'adresse 0 de la RAM est 0x30000000 selon s3c2440. Par conséquent, la valeur de pfn dans le système doit être égale à (adresse physique - adresse de base de mémoire) >>

Mais sous Linux, des adresses virtuelles sont utilisées, donc l'adresse virtuelle doit d'abord être convertie en adresse physique. Il existe donc une définition de macro sous Linux pour convertir l'adresse virtuelle de l'espace linéaire du noyau en pfn :

#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)   //__pa() 将虚拟地址转化成物理地址  
#define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT)

Donc pfn doit correspondre au numéro de cadre de page dans le noyau Linux. L'adresse physique correspondante peut être trouvée par simple conversion.

Pour chaque page physique, le noyau attribue un descripteur pour la décrire : page. pfn peut être converti en page :

#define page_to_pfn __page_to_pfn
#define pfn_to_page __pfn_to_page

Toutes les structures de page sont stockées dans mem_map pour une gestion facile.

Parce que Linux divise la mémoire physique en pages 4K pour la gestion. Par conséquent, la MMU sera également configurée dans le logiciel pour la mise en correspondance. Décrit plus tard.

Linux divise l'espace virtuel 4G en espace utilisateur et espace noyau. L'espace utilisateur est 0---3G et l'espace noyau est 3G---4G. L'espace utilisateur est accessible depuis l'espace noyau, mais l'espace noyau doit être accessible depuis l'espace utilisateur via des appels système.

Recommandations associées : "Tutoriel vidéo Linux"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn