Eine Einführung in die Verbindung Seiten

Eine Einführung in die Verbindung Seiten

Der Editor wurde Graben durch ein Patch-Set, dass Änderungen vornimmt beteiligt Verbindung Seiten, als er erkannte, dass sein Verständnis dieser Seiten ein bisschen auf der schwachen Seite war. Nach einiger Zeit durch die Quelle zu graben, um diese Situation zu korrigieren, ein Gedanke aufgetaucht: die Welt der Menschen voll sein müssen wollen sie mehr über Verbindung Seiten kannten. Für alle, deren Liste der gewünschten Lebensdauer Leistungen beinhaltet ein besser dieses Thema zu verstehen, hier ist eine kurze Einführung in der Verbindung Seiten in dem Linux-Kernel.

Eine Verbindung Seite ist einfach eine Gruppierung von zwei oder mehr physisch zusammenhängenden Seiten in eine Einheit , die Dose, in vielerlei Hinsicht als eine einzige, größere Seite behandelt werden. Sie werden am häufigsten verwendet , große Seiten zu erstellen, innerhalb verwendet  hugetlbfs  oder dem  transparenten großen Seiten -  Subsystem, sie zeigen aber auch in anderen Kontexten auf. Verbindung Seiten können als anonyme Speicher dienen oder als Puffer im Kernel genutzt werden; sie können jedoch nicht erscheinen in den Seiten - Cache, der nur mit Singletons Seiten beschäftigen vorbereitet.

Eine Verbindung Zuteilen Seite ist eine Frage der eine normale Speicherzuteilungsfunktion wie der Aufruf  () alloc_pages  mit dem  __GFP_COMP  Zuordnungs - Flag gesetzt und ein um mindestens eines. Es ist nicht möglich , eine Bestellung von Null (single-page) -Verbindung Seite aufgrund der Art und Weise Verbindung Seiten implementiert werden zu erstellen. (Die „Ordnung“ ein Zuordnungs ist die Basis-2 - Logarithmus der Zahl der Seiten zu verteilen; Null entspricht somit eine einzelne Seite, 1.59 Seiten, etc.).

Beachten Sie, dass eine Verbindung Seite unterscheidet sich von den Seiten von einem normalen höherer Ordnung Zuteilungsanforderung zurückgegeben. Ein Aufruf wie:

 

    pages = alloc_pages (GFP_KERNEL, 2); / * Keine __GFP_COMP * /

wird vier physisch zusammenhängende Seiten zurückkehren, aber sie werden nicht eine Verbindung Seite sein. Der Unterschied besteht darin, dass eine Verbindung zu schaffen Seite die Schaffung einer angemessenen Menge von Metadaten umfasst; dass Metadaten viel von der Zeit, wird nicht benötigt, so dass die Kosten es schaffen kann vermieden werden.

Was bedeutet , dass Metadaten aus? Da die meisten davon in den zugehörigen gespeicherten  Seite  Strukturen, kann man davon ausgehen , dass  es kompliziert . Beginnen wir mit den Fahnen Seite starten. Die erste (normal) Seite in einer Verbindung - Seite wird die „Kopfseite“ genannt; es hat die  PG_head  Flag gesetzt ist . Alle anderen Seiten sind „tail Seiten“; sie sind mit markiert  PG_tail . Zumindest ist das der Fall ist auf Systeme , in denen Seite Flags sind nicht knapp - 64-Bit - Systeme, mit anderen Worten. Auf 32-Bit - Systemen gibt es keine Seite Fahnen Ersatz, so dass ein anderes Schema verwendet wird; Alle Seiten in einer Verbindung Seite haben die  PG_compound -  Flag gesetzt und die Schwanz Seiten haben  PG_reclaim  auch eingestellt. die  PG_reclaim Bit wird normalerweise durch die Seiten-Cache-Code verwendet, aber, da Verbindung Seiten können nicht in den Seiten-Cache dargestellt werden, dass Flag hier wiederverwendet werden kann.

Code mit Verbindung Seiten zu tun brauchen sich keine Sorgen über die verschiedenen Markierungs Konventionen, though. Egal , die Konvention in Gebrauch ist, ein Aufruf an  PageCompound ()  wird einen wahren Wert zurück , wenn die übergebene-in - Seite eine Verbindung Seite. Kopf und Schwanz - Seiten unterschieden werden, sollte die Notwendigkeit entstehen, mit  pagehead ()  und  PageTail () .

Jeder Schwanz Seite hat einen Zeiger auf den Kopf Seite in dem gespeicherten  FIRST_PAGE  Bereich der  Struktur Seite . Dieses Feld den gleichen Speicher als besetzt  privater  Bereich, verwendete der spinlock , wenn die Seite Seitentabelleneinträge enthält, oder der  slab_cache  Zeiger verwendet , wenn die Seite durch eine Platte Allocator gehört. Die  compound_head ()  Hilfsfunktion kann verwendet werden , um die Kopfseite mit jedem Schwanz Seite zugeordnet zu finden.

Es gibt eine Menge an Informationen , die die Verbindung Seite als Ganze zu beschreiben: die Ordnung (Größe) der Seite und eine destructor verwendet , um die Seite zu dem System zurück , wenn es nicht mehr benötigt wird. Man könnte denken , zuerst , dass die Informationen zu speichern , in der Haupt - Seite  struct Seite , aber es gibt keinen Platz für sie gibt. Stattdessen wird die Reihenfolge , in dem gespeicherten  lru.prev  Feld in der  Seitenstruktur für die erste  tail  Seite. Während Gewerkschaften für viele der überlagerten Felder verwendet werden  struct Seite , hier ist die Reihenfolge einfach in einen Zeigertyp gegossen , bevor in einem Zeigerfeld gespeichert werden. In ähnlicher Weise wird ein Zeiger auf den destructor in dem gespeicherten  lru.next  Feld der ersten Schwanzes Seite  struct page. Diese Erweiterung der Verbindung-Seite Metadaten in die zweite  Seite  Struktur Deshalb Verbindung Seiten von mindestens zwei Seiten bestehen muss.

Im übrigen gibt es nur zwei Verbindung Seite Destruktoren im Kernel erklärt. Standardmäßig  free_compound_page ()  verwendet wird ; Denn es macht nicht, die Erinnerung an die Seite Allocator zurückzukehren. Das hugetlbfs Subsystem, obwohl verwendet  free_huge_page ()  seine bisher Buchhaltung zu halten.

In den meisten Fällen sind zusammengesetzte Seiten unnötig und gewöhnliche Zuordnungen können verwendet werden; Code Bedürfnisse Aufruf erinnern, wie viele Seiten zugeordnet, aber ansonsten die Metadaten, die in einer Verbindung Seite gespeichert werden würden, werden nicht benötigt. Eine Verbindung Seite wird angezeigt, obwohl, wann immer es ist wichtig, die Gruppe von Seiten als Ganze, auch wenn jemand verweist auf eine einzelne Seite innerhalb sie zu behandeln. Transparent riesige Seiten sind ein klassisches Beispiel; wenn Benutzerraum versucht, die Schutzmechanismen auf einem Teil einer großen Seite zu ändern, wird die gesamte riesige Seite muß lokalisiert werden und aufgebrochen. Verschiedene Treiber verwenden auch Verbindung Seiten, die die Verwaltung größerer Puffer zu erleichtern.

Und das ist so ziemlich alles, was das unterscheidet eine Verbindung Seite von einer gewöhnlichen, höherer Ordnung Zuteilung. Die meisten Entwickler werden nicht begegnen Verbindung Seiten in ihrem Bereich des Kernels. In Fällen, in denen es wirklich notwendig ist, eine Reihe von Seiten als eine einzige Einheit zu behandeln, können jedoch Verbindung Seiten auch Teil der Lösung Toolkit sein.

 

von:

https://lwn.net/Articles/619514/

 

Kernel \ include \ linux \ Seiten-flags.h

set page-> compound_head:

set_compound_head

get page-> compound_head:

compound_head ()

Ich denke du magst

Origin www.cnblogs.com/aspirs/p/12600155.html
Empfohlen
Rangfolge