Grundlegendes zu Linux / proc / id / maps

155

Ich versuche, die Speichernutzung meiner eingebetteten Linux-Anwendung zu verstehen. Das /proc/pid/mapsDienstprogramm / die Datei scheint eine gute Ressource zu sein, um die Details anzuzeigen. Leider verstehe ich nicht alle Spalten und Einträge.

Was bedeuten die anonymen Inode 0-Einträge? Dies scheinen einige der größeren Speichersegmente zu sein.

Simon
quelle
1
proc(5) mmap(2)"Grundlegendes zum Linux-Kernel" 9.3. Speicherbereiche; 16.2. Speicherzuordnung "
Grundlegendes

Antworten:

261

Jede Zeile in /proc/$PID/mapsbeschreibt einen Bereich zusammenhängenden virtuellen Speichers in einem Prozess oder Thread. Jede Zeile enthält die folgenden Felder:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • Adresse - Dies ist die Start- und Endadresse der Region im Adressraum des Prozesses
  • Berechtigungen - Hier wird beschrieben, wie auf Seiten in der Region zugegriffen werden kann. Es gibt vier verschiedene Berechtigungen: Lesen, Schreiben, Ausführen und Freigeben. Wenn Lesen / Schreiben / Ausführen deaktiviert ist, -wird anstelle von r/ w/ ein angezeigt x. Wenn eine Region nicht freigegeben ist , ist sie privat , sodass panstelle von a eine angezeigt wird s. Wenn der Prozess versucht, auf eine nicht zulässige Weise auf den Speicher zuzugreifen, wird ein Segmentierungsfehler generiert. Berechtigungen können über den mprotectSystemaufruf geändert werden .
  • Offset - Wenn der Bereich aus einer Datei (mit mmap) zugeordnet wurde, ist dies der Versatz in der Datei, in der die Zuordnung beginnt. Wenn der Speicher nicht aus einer Datei zugeordnet wurde, ist er nur 0.
  • Gerät - Wenn die Region aus einer Datei zugeordnet wurde, ist dies die Haupt- und Nebengerätenummer (in hexadezimaler Reihenfolge), in der sich die Datei befindet.
  • inode - Wenn die Region aus einer Datei zugeordnet wurde, ist dies die Dateinummer.
  • Pfadname - Wenn die Region aus einer Datei zugeordnet wurde, ist dies der Name der Datei. Dieses Feld ist für anonyme zugeordnete Regionen leer. Es gibt auch spezielle Regionen mit Namen wie [heap], [stack]oder [vdso]. [vdso]steht für Virtual Dynamic Shared Object. Es wird von Systemaufrufen verwendet, um in den Kernelmodus zu wechseln. Hier ist ein guter Artikel darüber: "Was ist linux-gate.so.1?"

Möglicherweise bemerken Sie viele anonyme Regionen. Diese werden normalerweise von mmapeiner Datei erstellt, aber nicht an diese angehängt. Sie werden für viele verschiedene Dinge wie gemeinsam genutzten Speicher oder Puffer verwendet, die nicht auf dem Heap zugeordnet sind. Ich denke zum Beispiel, dass die pthread-Bibliothek anonyme zugeordnete Regionen als Stapel für neue Threads verwendet.

Jay Conrod
quelle
4
Ja, die Pthreads weisen einem Stapel 8-MB-Blöcke mit einem kleineren Abschnitt für die Stapelüberlauferkennung zu (glaube ich). Daher weist jeder standardmäßig erstellte Pthread einen Inode 0-Speicherbereich von 8 MB und einen Inode 0-Bereich von 4 KB zu.
Simon
In Ihrem Beispiel gpmwird also die Binärdatei von Anfang an an einer virtuellen Adresse mit ELF-Header usw. zugeordnet? Soll der Loader nicht den ELF-Header analysieren und einzelne Abschnitte zuordnen, nicht die gesamte Datei?
Dmitry Grigoryev
9

Die Speicherzuordnung wird nicht nur zum Zuordnen von Dateien zum Speicher verwendet, sondern ist auch ein Tool zum Anfordern von RAM vom Kernel. Dies sind die Inode 0-Einträge - Ihr Stack, Heap, BSS-Segmente und mehr

Xeor
quelle
5

Bitte überprüfen Sie: http://man7.org/linux/man-pages/man5/proc.5.html

address           perms offset  dev   inode       pathname
00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon

Das Adressfeld ist der Adressraum in dem Prozess, den das Mapping belegt.

Das Dauerwellenfeld besteht aus einer Reihe von Berechtigungen:

 r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

Das Versatzfeld ist der Versatz in die Datei / was auch immer;

dev ist das Gerät (Dur: Moll);

Inode ist der Inode auf diesem Gerät. 0 gibt an, dass dem Speicherbereich kein Inode zugeordnet ist, wie dies bei BSS (nicht initialisierte Daten) der Fall wäre.

Das Pfadnamenfeld ist normalerweise die Datei, die die Zuordnung unterstützt. Bei ELF-Dateien können Sie einfach mit dem Versatzfeld koordinieren, indem Sie das Versatzfeld in den ELF-Programmüberschriften (readelf -l) anzeigen.

Unter Linux 2.0 gibt es kein Feld mit dem Pfadnamen.

cahit beyaz
quelle