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

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

132 голосов
/ 09 сентября 2009

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

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

Ответы [ 3 ]

230 голосов
/ 09 сентября 2009

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

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

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

8 голосов
/ 09 сентября 2009

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

5 голосов
/ 01 февраля 2017

Пожалуйста, проверьте: 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 (неинициализированные данные).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...