Почему общие библиотеки (файлы .so) загружаются как частные?

#linux #shared-libraries #.so

#linux #общие библиотеки #.so

Вопрос:

Это из файла smaps:
b750d000-b76bc000 r-xp 00000000 08:01 918842 /lib/i386-linux-gnu/libc-2.23.so
p r-xp Я полагаю, что in указывает, что он загружен как частный. Почему это так? Разве это не противоречит назначению общих библиотек, если копия каждого файла .so загружается в разные адреса памяти для разных процессов? Какое преимущество дает эта частная загрузка?

Ответ №1:

p соответствует MAP_PRIVATE . man mmap утверждает, что:

MAP_PRIVATE : Создайте частное сопоставление копирования при записи. Обновления сопоставления не видны другим процессам, отображающим тот же файл, и не передаются в базовый файл. […]

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

Давайте посмотрим на:

$ cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:11 529223 /bin/cat
0060b000-0060c000 r--p 0000b000 08:11 529223 /bin/cat
0060c000-0060d000 rw-p 0000c000 08:11 529223 /bin/cat
[...]
  • Первая и вторая виртуальные машины доступны только для чтения. Они (обычно) не будут изменены и будут (обычно) использоваться всеми процессами.

  • Третья VMA ( rw-p ) доступна для записи, но изменения в одном процессе не должны быть видны в других процессах. Эта виртуальная машина содержит (изменяемые) глобальные переменные, которые не являются общими для разных процессов.