Подтвердить что ты не робот

Понимание выхода pmap

Я пытался увидеть карту памяти процесса на Linux x86-64 с помощью команды pmap -x. Я смутился, глядя на выход pmap. В частности, для записей для отображения динамических библиотек. Для них есть несколько записей (на самом деле 4 для большинства из них, причем некоторые из них имеют 3 записи). Ниже приведен пример

  Address           Kbytes   RSS   Dirty Mode   Mapping

00000036ca200000      88      64       0 r-x--  libpthread-2.5.so
00000036ca216000    2044       0       0 -----  libpthread-2.5.so
00000036ca415000       4       4       4 r----  libpthread-2.5.so
00000036ca416000       4       4       4 rw---  libpthread-2.5.so

Вторая строка для каждой библиотеки всегда имеет размер 2 МБ, тогда как у нее нет разрешения на страницу. Во всех библиотеках кажется, что RSS ВСЕГДА равен нулю. Последние две строки имеют одинаковый размер (размер базовой страницы) и одинаковые разрешения (в нескольких библиотеках нет rw-отображения).

Есть ли у кого-нибудь объяснения? Я вроде как чувствую, что, возможно, сопоставление с защитой только для чтения выполняется загрузчиком для чтения метаданных библиотеки, а часть с исполняемым разрешением фактически является кодом для библиотеки. Возможно, я ошибаюсь.

Но я не имею в виду эту среднюю строку. Нет разрешения и нет обычаев? Здесь есть какие-то слова мудрости?

Я также видел несколько страниц, которые, как сообщается, были в анонимной памяти и не имеют установленного бита режима. Что они представляют?

4b9b3361

Ответ 1

Прежде всего, может случиться так, что один и тот же процесс может использовать более одного экземпляра использования памяти. Я не знаю, это то, что вы хотите знать. Я видел это, пользуясь браузером в Linux, открывая только одну вкладку и используя верхнюю команду, она показывает больше, чем 4 использования в списке использования памяти, охватывая более 10 МБ памяти. Я думаю, что это нормально из-за большего количества потоков, выполняемых одним и тем же процессом.

Эта ссылка может быть полезна, поскольку в примере использования, если вы заметили, отображение команды -x показывает больше количества использования.

http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

Ответ 2

Эти защищенные "----" страницы представляют собой защищенные страницы, чтобы предотвратить индексирование указателей между сегментами кода и данных библиотеки. Они существуют только в виртуальном пространстве процесса и существуют, чтобы вызвать ошибку, если указатель проходит мимо конца сегмента.

Если они не были адресованы в файл общей библиотеки, я бы сказал, что они служат в качестве буфера для расширения распределений, например. malloc или рост стека. Например, glibc запрашивает большие куски адресного пространства из ядра для арены локализации потоков, затем медленно их потребляет для распределения malloc'd. В гораздо большем pmap из JVM я смотрю, есть несколько десятков из них, каждый из которых следует за страницей RW или заполняет пространство между двумя большими выделениями RW, а границы между ними сдвигаются по мере увеличения страниц RW. На защищенных страницах X86_64, например, это может использовать систему защиты памяти ЦП, чтобы улавливать древовидные обозначения указателей.