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

Почему в файле /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 

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

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

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

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

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

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

Источник и дополнительная информация для неотображаемого разрыва: почему gnome-панель использует 290MB? RJK. См. Также запись для /proc/PID/maps в документации на ядро ​​Linux. Общие сведения о Linux / proc / id / maps и / proc / $ pid / maps показывают страницы без разрешений rwx для x86_64 linux в Stack Overflow.