Ответ 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 использует анонимные сопоставленные области в качестве стеков для новых потоков.