Понимание Linux/proc/id/maps

Я пытаюсь понять использование памяти встроенным приложением Linux. Утилита /proc/pid/maps является хорошим ресурсом для просмотра деталей. К сожалению, я не понимаю все столбцы и записи.

Что означают анонимные записи inode 0? Похоже, это одни из самых больших сегментов памяти.

Ответ 1

Каждая строка в /proc/$PID/maps описывает область непрерывной виртуальной памяти в процессе или потоке. Каждая строка имеет следующие поля:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • адрес - это начальный и конечный адрес региона в адресном пространстве процесса
  • permissions - описывает, как можно получить доступ к страницам в регионе. Существует четыре различных разрешения: чтение, запись, выполнение и совместное использование. При чтение/запись/выполнение являются отключен, - появится вместо r/w/x. Если регион не является общим, он является закрытым, поэтому вместо s появится p. Если процесс пытается получить доступ к памяти способом, который не разрешен, генерируется ошибка сегментации. Разрешения можно изменить с mprotect системного вызова mprotect.
  • смещение - если область была отображена из файла (с помощью mmap), это смещение в файле, с которого начинается отображение. Если память не была отображена из файла, это просто 0.
  • устройство - если регион был сопоставлен из файла, это основной и младший номер устройства (в шестнадцатеричном формате), в котором находится файл.
  • inode - если регион был отображен из файла, это номер файла.
  • pathname - если регион был отображен из файла, это имя файла. Это поле пустое для анонимных сопоставленных регионов. Существуют также специальные области с именами, такими как [heap], [stack] или [vdso]. [vdso] обозначает виртуальный динамический общий объект. Используется системными вызовами для переключения в режим ядра. Вот хорошая статья об этом: "Что такое linux-gate.so.1?"

Вы можете заметить много анонимных регионов. Они обычно создаются mmap но не прикрепляются ни к какому файлу. Они используются для множества разных вещей, таких как общая память или буферы, не выделенные в куче. Например, я думаю, что библиотека pthread использует анонимные сопоставленные области в качестве стеков для новых потоков.

Ответ 2

proc(5)

mmap(2)

"Понимание ядра Linux" 9.3. Регионы памяти; 16,2. Отображение памяти

"Общие сведения о диспетчере виртуальной памяти Linux" 4.4 Области памяти

Ответ 3

отображение памяти не только используется для сопоставления файлов в память, но также является инструментом для запроса ОЗУ из ядра. Это те записи inode 0 - ваш стек, куча, сегменты bss и многое другое

Ответ 4

Пожалуйста, проверьте: 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

Поле адреса - это адресное пространство в процессе, который занимает отображение.

Поле perms представляет собой набор разрешений:

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

Поле смещения - это смещение в файл/что угодно;

dev - устройство (мажор: минор);

inode - это inode на этом устройстве. 0 указывает, что ни один inode не связан с областью памяти, как в случае с BSS (неинициализированные данные).

Поле pathname обычно будет файлом, который поддерживает отображение. Для файлов ELF вы можете легко координировать свои действия с полем смещения, просматривая поле "Смещение" в заголовках программы ELF (readelf -l).

В Linux 2.0 нет поля с указанием пути.