Понимание 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 нет поля, дающего путь.