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

156

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

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

Саймон
источник
1
proc(5) mmap(2)«Понимание ядра Linux» 9.3. Регионы памяти; 16,2. Отображение памяти «Понимание диспетчера виртуальной памяти Linux» 4.4 Области памяти
wRAR

Ответы:

264

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

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

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

Джей Конрод
источник
4
Да, pthreads выделяет 8Mb блоков для стека с меньшим разделом для обнаружения переполнения стека (я думаю). Таким образом, каждый созданный pthread по умолчанию выделяет область памяти с индексом 0 8 МБ и область с индексом 0 4 КБ.
Симон
Итак, в вашем примере gpmсопоставление двоичного файла по какому-либо виртуальному адресу с самого начала, с заголовком ELF и т. Д.? Разве загрузчик не должен анализировать заголовок ELF и отображать отдельные разделы, а не весь файл?
Дмитрий Григорьев
9

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

Xeor
источник
5

Пожалуйста, проверьте: 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 нет поля с указанием пути.

каит беяз
источник