Was ist pfn unter Linux?

青灯夜游
青灯夜游Original
2022-03-24 11:57:323960Durchsuche

Unter Linux steht pfn für „Page Frame Number“, also die Nummer des physischen Speicherbereichs. „Seitenrahmen“ bezieht sich auf den physischen Speicher. Er unterteilt den physischen Speicher in Seitengrößenbereiche und gibt jeder Seite eine Nummer. Diese Nummer ist PFN.

Was ist pfn unter Linux?

Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.

1. Was ist ein Seitenrahmen?

Eine der wichtigsten Funktionen des Betriebssystems ist die Verwaltung verschiedener Ressourcen im Computersystem. Als wichtigste Ressource: den Speicher, müssen wir ihn verwalten. Im Linux-Betriebssystem wird der physische Speicher entsprechend der Seitengröße verwaltet. Die spezifische Seitengröße hängt von der Hardware ab und die Linux-Systemkonfiguration ist die klassischste Einstellung. Daher teilen wir den physischen Speicher in Seiten auf, die nach Seitengröße geordnet sind. Der Speicherbereich der Seitengröße in jedem physischen Speicher wird als Seitenrahmen bezeichnet. Wir erstellen eine Strukturseitendatenstruktur für jeden physischen Seitenrahmen, um die Nutzung jeder physischen Seite zu verfolgen: Wird sie für das Textsegment des Kernels verwendet? Oder ist es eine Seitentabelle für einen Prozess? Wird es für verschiedene Dateicaches verwendet oder befindet es sich in einem freien Zustand ...

Jeder Seitenrahmen verfügt über eine eins zu eins entsprechende Seitendatenstruktur. Die Makros page_to_pfn und pfn_to_page sind im System definiert, um sie zwischen den Seiten zu verwenden Die Frame-Nummer und die Seitendatenstruktur hängen mit dem Speichermodell zusammen. Wir werden die drei Speichermodelle im Linux-Kernel im Detail beschreiben.

2. Was ist PFN?

Für ein Computersystem sollte sein gesamter physischer Adressraum ein Adressraumzeitraum sein, der bei 0 beginnt und mit dem maximalen physischen Raum endet, den das tatsächliche System unterstützen kann. Unter der Annahme, dass die physische Adresse im ARM-System 32 Bit beträgt, beträgt der physische Adressraum 4G. Wenn im ARM64-System die Anzahl der unterstützten physischen Adressbits 48 beträgt, beträgt der physische Adressraum 256T. Tatsächlich wird natürlich nicht jeder so große physische Adressraum für den Speicher verwendet, einige gehören auch zum E/A-Bereich (natürlich verfügen einige CPU-Architekturen über einen eigenen unabhängigen E/A-Adressraum). Daher sollte der vom Speicher belegte physische Adressraum ein begrenztes Intervall sein und es ist unmöglich, den gesamten physischen Adressraum abzudecken. Da der Speicher jedoch immer größer wird, kann der physische 4G-Adressraum für 32-Bit-Systeme die Speicheranforderungen nicht mehr erfüllen. Daher gibt es das Konzept des hohen Speichers, das später ausführlich beschrieben wird.

PFN ist die Abkürzung für Seitenrahmennummer. Der sogenannte Seitenrahmen ist in Bereiche der Seitengröße unterteilt, und jede Seite ist nummeriert. Unter der Annahme, dass der physische Speicher bei Adresse 0 beginnt, ist der Seitenrahmen mit PFN gleich 0 die Seite, die bei Adresse 0 (physikalische Adresse) beginnt. Unter der Annahme, dass der physische Speicher bei Adresse x beginnt, ist die erste Seitenrahmennummer (x>>PAGE_SHIFT).

Der Wertebereich von PFN beträgt 0---- (Speichergröße >> 12).

Aber aufgrund der Zuordnungsbeziehung des physischen Speichers entspricht die physische Speicheradresse 0 nicht der physischen Adresse 0 im System. Beispiel: Auf s3c2440 beginnt die Speicheradresse bei 0x30000000. Wenn der RAM angeschlossen ist, ist die 0-Adresse des RAM in der Ansicht von s3c2440 0x30000000. Daher sollte der Wert von pfn im System gleich (physische Adresse – Speicherbasisadresse) >> sein.

Aber unter Linux werden alle virtuellen Adressen verwendet, daher muss die virtuelle Adresse zuerst in eine physische Adresse umgewandelt werden. Daher gibt es in Linux eine Makrodefinition, um die virtuelle Adresse des linearen Kernelraums in pfn umzuwandeln:

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

PFn sollte also der Seitenrahmennummer im Linux-Kernel entsprechen. Durch einfache Umrechnung lässt sich die entsprechende physikalische Adresse ermitteln.

Für jede physische Seite weist der Kernel einen Deskriptor zu, um sie zu beschreiben: Seite. pfn kann in eine Seite konvertiert werden:

#define page_to_pfn __page_to_pfn
#define pfn_to_page __pfn_to_page

Alle Seitenstrukturen werden zur einfachen Verwaltung in mem_map gespeichert.

Weil Linux den physischen Speicher zur Verwaltung in 4K-Seiten unterteilt. Daher wird die MMU auch für den Abgleich in der Software eingerichtet. Später erzählt.

Linux unterteilt den virtuellen 4G-Raum in Benutzerraum und Kernelraum. Der Benutzerbereich beträgt 0 --- 3G und der Kernelbereich beträgt 3G --- 4G. Auf den Benutzerbereich kann vom Kernelbereich aus zugegriffen werden, auf den Kernelbereich muss jedoch über Systemaufrufe vom Benutzerbereich aus zugegriffen werden.

Verwandte Empfehlungen: „Linux-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist pfn unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn