Отображения общих библиотек в / proc / pid / maps

8

Почему /proc/pid/mapsсодержит несколько записей для одной и той же библиотеки? Вот пример:

7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20

Что это значит ?

Irbis
источник

Ответы:

12

Четыре записи имеют разные разрешения, поэтому их нельзя объединить.

  • r-xpЗапись описывает блок памяти исполняемого ( xфлаг разрешения). Это код.
  • r--pЗапись описывает блок памяти , который доступен только для чтения ( rфлаг разрешения). Это статические данные (константы).
  • rw-pЗапись описывает блок памяти , который доступен для записи ( wфлаг разрешения). Это для глобальных переменных библиотеки.
  • ---pЗапись описывает кусок адресного пространства , который не имеет каких - либо разрешений (или любую память , отображенный на него).

Все они являются частными ( pфлаг), это означает, что если процесс изменяет страницу (что возможно только для записываемой части), эта страница будет скопирована (копирование при записи), и другие процессы не увидят никаких изменений.

Эта последняя запись представляет собой разрыв между сегментом кода и сегментом данных, который явно вставляется компоновщиком GNU при определенных обстоятельствах. Цель этого разрыва заключается в том, чтобы гарантировать, что код (общий для процессов, использующих одну и ту же библиотеку) и доступные для записи данные (не для общего доступа) никогда не находятся на одной странице. Размер разрыва составляет 2 МБ, потому что это самый большой размер страницы¹, который Linux использует в вашей архитектуре (amd64). См. Какова цель на первый взгляд непригодных отображений памяти в Linux? Больше подробностей.

¹ Большинство страниц имеют размер 4 КБ, что является «нормальным» размером страницы. Но могут быть страницы, которые используют меньше косвенных обращений MMU, что немного быстрее, но тратит много места, если приложение фактически не использует очень большие блоки памяти. Linux называет эти огромные страницы .

Источник и дополнительная информация для неиспользованного разрыва: почему панель gnome использует 290 МБ? по RJK. Смотрите также запись для /proc/PID/mapsв документации ядра Linux , Понимание Linux / ргос / ID / карты и / Proc / $ PID / Картах страницы без RWX разрешений на x86_64 Linux на переполнение стека.

Жиль "ТАК - перестань быть злым"
источник