Понимание Linux / proc / id / карты

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

есть ли хороший ресурс / документация для proc/pid/maps файловые утилиты/?

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

4 ответов


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

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

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


proc(5)

mmap(2)

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

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


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


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

поле offset-смещение в файле;

dev-это устройство (major: minor);

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

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

в Linux 2.0 нет поля, дающего путь.