Heim  >  Artikel  >  System-Tutorial  >  Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

WBOY
WBOYnach vorne
2024-02-10 23:48:03666Durchsuche

Heute werden wir Linuxs Gedächtnismanagement untersuchen.

Für BWL-Studenten, die sich mit CURD auskennen, scheint das Gedächtnismanagement weit von uns entfernt zu sein. Obwohl dieser Wissenspunkt nicht beliebt ist (es wird geschätzt, dass viele Menschen ihn nach dem Erlernen überhaupt nicht mehr verwenden), ist er definitiv die Grundlage der Grundlage.

Das ist wie das innere Krafttraining in Kampfkunstromanen. Sie werden keine unmittelbaren Ergebnisse sehen, nachdem Sie es gelernt haben, aber es wird für Ihre zukünftige Entwicklungsarbeit von großem Nutzen sein, weil Sie größer werden.

Alle Beispielbilder im Artikel sind von mir gezeichnet. Das Zeichnen von Bildern nimmt mehr Zeit in Anspruch als das Codieren, aber jeder versteht es intuitiver, wenn er sich Bilder ansieht als Worte, also zeichne ich sie immer noch. Für Studierende, die hochauflösende Beispielbilder benötigen, gibt es am Ende des Artikels Möglichkeiten, diese zu erhalten.

Um es nützlicher auszudrücken: Wenn Sie während des Interviews versehentlich offenbaren, dass Sie dieses Wissen verstehen und es im Detail darlegen können, kann dies das Interesse des Interviewers an Ihnen steigern und Sie können möglicherweise eine Beförderung, eine Gehaltserhöhung usw. erhalten. und starte dein Leben. Der Höhepunkt ist einen Schritt näher.

Prämissenvereinbarung: Die Prämisse des in diesem Artikel besprochenen technischen Inhalts ist, dass die Betriebssystemumgebung x86 32-Bit-x86 架构的 32 位 Linux-System.

Virtuelle Adresse

Selbst in modernen Betriebssystemen ist der Speicher immer noch eine äußerst wertvolle Ressource in Ihrem Computer. Schauen Sie sich einfach die Größe des Solid-State-Laufwerks Ihres Computers und dann die Speichergröße an.

Um die Systemspeicherressourcen vollständig zu nutzen und zu verwalten, verwendet Linux die virtuelle Speicherverwaltungstechnologie. Mithilfe der virtuellen Speichertechnologie verfügt jeder Prozess über einen virtuellen Adressraum von 4 GB, der sich gegenseitig nicht beeinträchtigt.

Zuweisung und Betrieb der Prozessinitialisierung basieren auf dieser „virtuellen Adresse“. Erst wenn der Prozess tatsächlich auf Speicherressourcen zugreifen muss, wird die Zuordnung zwischen der virtuellen Adresse und der physischen Adresse hergestellt und die physische Speicherseite übertragen.

Um eine unangemessene Analogie zu geben: Dieses Prinzip ist tatsächlich das gleiche wie bei der aktuellen XX-Netzwerkfestplatte. Wenn Ihr Netzwerkspeicherplatz 1 TB beträgt, glauben Sie dann wirklich, dass Ihnen so viel Speicherplatz auf einmal zur Verfügung gestellt wird? Das ist noch zu jung. Der Platz wird Ihnen nur zugewiesen, wenn Sie Dinge hineinlegen. Ihnen wird so viel Platz zugewiesen, wie Sie tatsächlich hineingelegt haben. Aber es sieht so aus, als hätten Sie und Ihr Freund beide 1 TB Speicherplatz.

Vorteile der virtuellen Adresse

  • Verhindern Sie, dass Benutzer direkt auf physische Speicheradressen zugreifen, verhindern Sie destruktive Vorgänge und schützen Sie das Betriebssystem.
  • Jedem Prozess werden 4 GB virtueller Speicher zugewiesen, sodass Benutzerprogramme einen größeren Adressraum als den tatsächlichen physischen Speicher nutzen können.

Der virtuelle Adressraum des 4-GB-Prozesses ist in zwei Teile unterteilt: „Benutzerraum“ und „Kernelraum“.

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Benutzerbereich Kernelbereich

Physische Adresse

Im obigen Kapitel wissen wir bereits, dass die verwendeten Adressen virtuelle Adressen sind, unabhängig davon, ob es sich um Benutzerraum oder Kernelraum handelt. Wenn der Prozess tatsächlich auf den Speicher zugreifen muss, wird durch die „Anfrage“ des Kernels eine „Seitenfehlerausnahme“ generiert Paging-Mechanismus“ und wird an die physikalische Adresse übertragen. Speicherseite.

Konvertieren Sie die virtuelle Adresse in die physische Adresse des Speichers. Dazu müssen Sie die MMUSpeicherverwaltungseinheit verwenden, um die Adresskonvertierung der virtuellen Adresse (Segmentseitentyp) zu segmentieren und zu paginieren. Auf den spezifischen Prozess der Segmentierung und Paging werden wir nicht eingehen Weitere Einzelheiten finden Sie in einem beliebigen Lehrbuch über Computerkompositionsprinzipien.

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Adresskonvertierung für die Segmentseitenspeicherverwaltung

Linux Der Kernel unterteilt den physischen Speicher in drei Verwaltungsbereiche:

ZONE_DMA

DMA内存区域。包含0MB~16MB之间的内存页框,可以由老式基于ISA的设备通过DMAWird verwendet und direkt dem Adressraum des Kernels zugeordnet.

ZONE_NORMAL

Normaler Speicherbereich. Enthält Speicherseitenrahmen zwischen 16 MB und 896 MB, normale Seitenrahmen, die direkt dem Adressraum des Kernels zugeordnet sind.

ZONE_HIGHMEM

High-End-Speicherbereich. Enthält Speicherseitenrahmen über 896 MB, die nicht direkt zugeordnet sind. Auf diesen Teil des Speicherseitenrahmens kann durch permanente Zuordnung und temporäre Zuordnung zugegriffen werden.

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Aufteilung des physischen Speicherbereichs

Benutzerbereich

Auf den Benutzerprozess zugreifen kann, ist „Benutzerbereich“. Jeder Prozess verfügt über einen eigenen unabhängigen Benutzerbereich und der virtuelle Adressbereich beträgt 0x000000000xBFFFFFFF Die Gesamtkapazität beträgt 3G.

Benutzerprozesse können normalerweise nur auf virtuelle Adressen im Benutzerbereich zugreifen und können nur auf den Kernelbereich zugreifen, wenn sie Inline-Operationen oder Systemaufrufe ausführen.

Prozess und Gedächtnis

Der vom Prozess (ausgeführte Programm) belegte Benutzerraum wird nach dem Prinzip „Adressräume mit konsistenten Zugriffsattributen werden zusammen gespeichert“ in 5verschiedene Speicherbereiche unterteilt. Zugriffseigenschaften beziehen sich auf „lesbar, beschreibbar, ausführbar usw.“

  • Codeausschnitt

    Das Codesegment wird verwendet, um die Betriebsanweisungen der ausführbaren Datei und das Bild des ausführbaren Programms im Speicher zu speichern. Das Codesegment muss zur Laufzeit vor illegalen Änderungen geschützt werden, sodass nur Lesevorgänge zulässig sind und es nicht beschreibbar ist.

  • Datensegment

    Das Datensegment wird zum Speichern initialisierter globaler Variablen in der ausführbaren Datei verwendet. Mit anderen Worten: Es speichert Variablen und globale Variablen, die vom Programm statisch zugewiesen werden.

  • BSS-Bereich

    BSS段包含了程序中未初始化的全局变量,在内存中 bss Alle Segmente auf Null setzen.

  • Haufen heap

    Der Heap wird zum Speichern von Speichersegmenten verwendet, die während der Ausführung des Prozesses dynamisch zugewiesen werden. Seine Größe ist nicht festgelegt und kann dynamisch erweitert oder reduziert werden. Wenn ein Prozess eine Funktion wie malloc aufruft, um Speicher zuzuweisen, wird der neu zugewiesene Speicher dynamisch zum Heap hinzugefügt (der Heap wird erweitert); wenn eine Funktion wie free zum Freigeben von Speicher verwendet wird, wird der freigegebene Speicher aus dem Heap entfernt (Der Haufen wird reduziert).

  • Stapel

    stack

    Der Stapel ist eine vom Benutzer vorübergehend erstellte lokale Variable zum Speichern des Programms, dh der in der Funktion definierten Variablen (jedoch nicht einschließlich der durch

    deklarierten Variablen, statisch bedeutet, Variablen im Datensegment zu speichern). Darüber hinaus werden beim Aufruf einer Funktion auch deren Parameter auf den Stapel des Prozesses verschoben, der den Aufruf initiiert hat, und nach Abschluss des Aufrufs wird auch der Rückgabewert der Funktion wieder auf dem Stapel gespeichert. Aufgrund der First-In-Last-Out-Funktion des Stacks eignet sich der Stack besonders gut zum Speichern/Wiederherstellen der Anrufszene. In diesem Sinne können wir uns den Stapel als einen Speicherbereich vorstellen, der temporäre Daten speichert und austauscht. static

In den oben genannten Speicherbereichen, dem Datensegment und

in der Architektur dehnt sich der Stapel nach unten und der Heap nach oben aus, die relativ zueinander sind. BSS 段、堆通常是被连续存储在内存中,在位置上是连续的,而代码段和栈往往会被独立存放。堆和栈两个区域在 i386Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Sie können unter Linux auch den Befehl

verwenden, um die Größe jedes Speicherbereichs des kompilierten Programms zu überprüfen: size

[lemon ~]# size /usr/local/sbin/sshd
   text   data    bss    dec    hexfilename
1924532  12412 4268962363840 2411c0/usr/local/sbin/sshd

Kernelraum

Die Kapazität von

umfasst Kernel-Image, physische Seitentabelle, Treiber usw., die im Kernel-Bereich ausgeführt werden. x86 32 位系统里,Linux 内核地址空间是指虚拟地址从 0xC0000000 开始到 0xFFFFFFFF 为止的高端内存地址空间,总计 1G

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!Kernelraum-Unterteilungsbereich.

Direkter Kartierungsbereich

Direkter Zuordnungsbereich Der Kernelraum-Adressbereich von

ist ein direkter Speicherzuordnungsbereich. Direct Memory Region:从内核空间起始地址开始,最大896M

Die „lineare Adresse“ von 896 MB im direkten Zuordnungsbereich ist direkt mit der Vorderseite der „physikalischen Adresse“ verbunden 896MB进行映射,也就是说线性地址和分配的物理地址都是连续的。内核地址空间的线性地址0xC0000001所对应的物理地址为0x00000001,它们之间相差一个偏移量PAGE_OFFSET = 0xC0000000

In diesem Bereich besteht eine lineare Konvertierungsbeziehung zwischen der linearen Adresse und der physischen Adresse. „Lineare Adresse = PAGE_OFFSET + 物理地址」也可以用 virt_to_phys()Die Funktion wandelt die lineare Adresse im virtuellen Kernelraum in eine physische Adresse um.

Linearer High-End-Speicheradressraum

Der lineare Adressbereich des Kernelraums reicht von 896 MB bis 1 GB, und der Adressbereich mit einer Kapazität von 128 MB ist der lineare Adressraum des High-End-Speichers. Warum wird er als linearer Adressraum des High-End-Speichers bezeichnet? Lass es mich dir erklären:

Wie bereits erwähnt, beträgt die Gesamtgröße des Kernelraums 1 GB, und die lineare Adresse von 896 MB, beginnend mit der Startadresse des Kernelraums, kann direkt einem Adressbereich mit einer physischen Adressgröße von 896 MB zugeordnet werden.

Machen Sie einen Schritt zurück: Auch wenn die lineare 1-GB-Adresse im Kernelraum einer physischen Adresse zugeordnet ist, kann sie nur maximal 1 GB des physischen Speicheradressbereichs adressieren.

Wie groß ist der Speicherstick, den Sie jetzt haben? Wachen Sie auf, es ist fast 2023 und der Speicher der meisten PCs ist größer als 1 GB!

Also hat der Kernelraum den letzten 128-MB-Adressbereich herausgenommen und ihn in die folgenden drei High-End-Speicherzuordnungsbereiche unterteilt, um den gesamten physischen Adressbereich abzudecken. Auf 64-Bit-Systemen besteht dieses Problem nicht, da der verfügbare lineare Adressraum viel größer ist als der installierbare Speicher.

Dynamischer Speicherzuordnungsbereich

vmalloc Region 该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc Die physische Seite, die der zugewiesenen linearen Adresse entspricht, kann sich im Low-End-Speicher oder im High-End-Speicher befinden.

Permanenter Speicherzuordnungsbereich
Die Funktion

Persistent Kernel Mapping Region 该区域可访问高端内存。访问方法是使用 alloc_page (_GFP_HIGHMEM) 分配高端内存页或者使用kmap ordnet den zugewiesenen High-End-Speicher diesem Bereich zu.

Fester Kartenbereich

Fixing kernel Mapping Region 该区域和 4G 的顶端只有 4k 的隔离带,其每个地址项都服务于特定的用途,如 ACPI_BASEusw.

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Physische Speicherzuordnung des Kernel-Speicherplatzes

Rezension

Oben gibt es viel zu besprechen, also überstürzen Sie sich nicht mit dem nächsten Abschnitt. Schauen wir uns vorher noch einmal an, was wir oben gesagt haben. Wenn Sie die obigen Kapitel sorgfältig lesen, habe ich hier ein weiteres Bild gezeichnet, und jetzt sollten Sie ein solches globales Bild der Speicherverwaltung im Kopf haben.

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

Vollständiges Bild des Kernel- und Benutzerraums

Speicherdatenstruktur

Damit der Kernel den virtuellen Speicher im System verwalten kann, müssen Speicherverwaltungsoperationen wie „Zuweisung, Freigabe usw.“ von ihm abstrahiert werden Strukturen, die den virtuellen Speicherbereich verwalten.

Benutzerspeicher-Datenstruktur

Im vorherigen Kapitel „Prozess und Speicher“ haben wir erwähnt, dass der Linux-Prozess in 5 verschiedene Speicherbereiche unterteilt werden kann, nämlich: Codesegment, Datensegment, BSS、堆、栈,内核管理这些区域的方式是,将这些内存区域抽象成vm_area_structSpeicherverwaltungsobjekt.

vm_area_struct是描述进程地址空间的基本管理单元,一个进程往往需要多个vm_area_struct来描述它的用户空间虚拟地址,需要使用「链表」和「红黑树」来组织各个vm_area_struct.

Verknüpfte Listen werden verwendet, wenn alle Knoten durchlaufen werden müssen, während sich Rot-Schwarz-Bäume zum Auffinden bestimmter Speicherbereiche im Adressraum eignen. Der Kernel nutzt beide Datenstrukturen, um eine hohe Leistung für verschiedene Operationen auf Speicherbereichen zu erreichen.

Adressverwaltungsmodell des User-Space-Prozesses:

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!

wm_arem_struct

Kernelraum weist die Speicherdatenstruktur dynamisch zu

Im Kapitel zum Kernelraum haben wir den „dynamischen Speicherzuordnungsbereich“ erwähnt. Die physische Seite, die der von der Kernelfunktion zugewiesenen linearen Adresse entspricht, kann sich im Low-End-Speicher oder im High-End-Speicher befinden. vmalloc来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc

große Anti-Kreuzungs-Freibereichstrennwand. vmalloc 分配的地址则限于vmalloc_startvmalloc_end之间。每一块vmalloc分配的内核虚拟内存都对应一个vm_struct结构体,不同的内核空间虚拟地址之间有4k

Ähnlich wie die Eigenschaften virtueller Adressen im Benutzerbereich haben diese virtuellen Adressen keine einfache Zuordnungsbeziehung zum physischen Speicher. Sie müssen über die Kernel-Seitentabelle in physische Adressen oder physische Seiten umgewandelt werden Sie werden erst zugeordnet, wenn ein Seitenfehler auftritt. Ordnen Sie tatsächlich physische Seiten zu.

Hören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!Dynamische Speicherzuordnung

Um es zusammenzufassen

Speicherverwaltung ist ein sehr komplexes System. Was in diesem Artikel beschrieben wird, ist nur die Spitze des Eisbergs. Er zeigt Ihnen das Gesamtbild der Speicherverwaltung aus einer Makroperspektive, aber im Allgemeinen reicht dieses Wissen aus, wenn Sie chatten Mit dem Interviewer hoffe ich natürlich auch, dass jeder durch die Lektüre tiefere Prinzipien verstehen kann. Linux

Dieser Artikel kann als indexähnlicher Studienführer verwendet werden. Wenn Sie einen bestimmten Punkt eingehend untersuchen möchten, können Sie den Einstiegspunkt in diesen Kapiteln und die Position dieses Wissenspunkts in der makroskopischen Sicht der Speicherverwaltung finden.

Ich habe bei der Erstellung dieses Artikels auch viele Beispieldiagramme gezeichnet, die als Wissensindex verwendet werden können. Ich persönlich finde, dass das Betrachten von Bildern klarer ist als das Lesen von Text. Sie können sie erhalten, indem Sie auf „Speicher“ antworten Management“ im Hintergrund meines offiziellen Accounts „Backend Technology School“ Hochauflösende Originale dieser Bilder.

Alte Regel, der Zweck des Artikels besteht darin, das Wissen über technische Artikel weiterzugeben, um die Richtigkeit des Artikels so weit wie möglich sicherzustellen Gerne können wir darauf hinweisen. Lassen Sie uns gemeinsam aus der Diskussion lernen. Das ist alles für den heutigen Technologieaustausch. Wir sehen uns in der nächsten Ausgabe.

Das obige ist der detaillierte Inhalt vonHören Sie auf zu sagen, dass Sie die Linux-Speicherverwaltung nicht verstehen, 10 Bilder werden es Ihnen klar machen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen