Понимание выхода 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-отображения).
Есть ли у кого-нибудь объяснения? Я вроде как чувствую, что, возможно, сопоставление с защитой только для чтения выполняется загрузчиком для чтения метаданных библиотеки, а часть с исполняемым разрешением фактически является кодом для библиотеки. Возможно, я ошибаюсь.
Но я не имею в виду эту среднюю строку. Нет разрешения и нет обычаев? Здесь есть какие-то слова мудрости?
Я также видел несколько страниц, которые, как сообщается, были в анонимной памяти и не имеют установленного бита режима. Что они представляют?
Ответы
Ответ 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, например, это может использовать систему защиты памяти ЦП, чтобы улавливать древовидные обозначения указателей.