Zrozumienie Linux / proc / id / maps

155

Próbuję zrozumieć użycie pamięci przez moją wbudowaną aplikację Linux. /proc/pid/mapsUżyteczność / plik wydaje się być dobrym źródłem informacji dla widząc szczegóły. Niestety nie rozumiem wszystkich kolumn i wpisów.

Co oznaczają anonimowe wpisy i-węzła 0? Wydaje się, że są to jedne z większych segmentów pamięci.

Szymon
źródło
1
proc(5) mmap(2)„Zrozumienie jądra Linuksa” 9.3. Regiony pamięci; 16.2. Mapowanie pamięci „Zrozumienie menedżera pamięci wirtualnej systemu Linux” 4.4 Regiony pamięci
wRAR

Odpowiedzi:

261

Każdy wiersz /proc/$PID/mapsopisuje region ciągłej pamięci wirtualnej w procesie lub wątku. Każdy wiersz zawiera następujące pola:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • adres - jest to początkowy i końcowy adres regionu w przestrzeni adresowej procesu
  • uprawnienia - opisuje, w jaki sposób można uzyskać dostęp do stron w regionie. Istnieją cztery różne uprawnienia: odczyt, zapis, wykonywanie i udostępnianie. Jeśli odczyt / zapis / wykonanie są wyłączone, -zamiast r/ w/ x. Jeśli region nie jest udostępniany , jest prywatny , więc pzamiast s. Jeśli proces próbuje uzyskać dostęp do pamięci w sposób, który jest niedozwolony, generowany jest błąd segmentacji. Uprawnienia można zmienić za pomocą mprotectwywołania systemowego.
  • offset - jeśli region został odwzorowany z pliku (przy użyciu mmap), jest to przesunięcie w pliku, w którym zaczyna się mapowanie. Jeśli pamięć nie została zmapowana z pliku, to tylko 0.
  • urządzenie - jeśli region został zmapowany z pliku, jest to główny i pomocniczy numer urządzenia (szesnastkowo), na którym znajduje się plik.
  • i-węzeł - jeśli region został zmapowany z pliku, jest to numer pliku.
  • nazwa_ścieżki - jeśli region został zmapowany z pliku, jest to nazwa pliku. To pole jest puste w przypadku anonimowych regionów mapowanych. Istnieją również specjalne obszary o nazwach takich jak [heap], [stack]lub [vdso]. [vdso]oznacza wirtualny dynamiczny obiekt współdzielony. Jest używany przez wywołania systemowe do przełączania się w tryb jądra. Oto dobry artykuł na ten temat: „Co to jest linux-gate.so.1?”

Możesz zauważyć wiele anonimowych regionów. Są one zwykle tworzone przez, mmapale nie są dołączane do żadnego pliku. Są używane do wielu różnych rzeczy, takich jak pamięć współdzielona lub bufory nieprzydzielone na stercie. Na przykład, myślę, że biblioteka pthread używa anonimowych mapowanych regionów jako stosów dla nowych wątków.

Jay Conrod
źródło
4
Tak, pthreads alokują bloki 8Mb dla stosu z mniejszą sekcją do wykrywania przepełnienia stosu (tak myślę). Zatem każdy utworzony pthread domyślnie przydziela region pamięci i-węzła 0 o wielkości 8 Mb i region i-węzła 0 o wielkości 4 KB.
simon
Więc w twoim przykładzie gpmjest mapowanie pliku binarnego pod jakimś wirtualnym adresem od samego początku, z nagłówkiem ELF itp.? Czy program ładujący nie powinien analizować nagłówka ELF i mapować poszczególne sekcje, a nie cały plik?
Dmitrij Grigoriew
9

mapowanie pamięci służy nie tylko do mapowania plików do pamięci, ale jest również narzędziem do żądania pamięci RAM od jądra. To są te wpisy i-węzłów 0 - Twój stos, sterta, segmenty BSS i inne

Xeor
źródło
5

Sprawdź: 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

Pole adresu to przestrzeń adresowa w procesie zajmowanym przez mapowanie.

Pole uprawnień to zestaw uprawnień:

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

Pole offset to przesunięcie w pliku / cokolwiek;

dev to urządzenie (główne: podrzędne);

i-węzeł jest i-węzłem na tym urządzeniu. 0 wskazuje, że żaden i-węzeł nie jest powiązany z obszarem pamięci, jak miałoby to miejsce w przypadku BSS (dane niezainicjowane).

Pole nazwy ścieżki będzie zwykle plikiem, który stanowi kopię zapasową mapowania. W przypadku plików ELF można łatwo skoordynować z polem przesunięcia, patrząc na pole Offset w nagłówkach programu ELF (readelf -l).

W Linuksie 2.0 nie ma pola z nazwą ścieżki.

cahit beyaz
źródło