Динамический загрузчик использует mmap(2)
с MAP_PRIVATE и соответствующими разрешениями.Вы можете увидеть, что именно он делает, запустив команду из strace -e file,mmap
.Например:
strace -e file,mmap ls
Вся магия исходит от mmap(2)
.mmap(2)
создает сопоставления в вызывающем процессе, они обычно поддерживаются либо файлом, либо подкачкой (анонимные сопоставления).В отображении с файловой поддержкой MAP_PRIVATE означает, что запись в память не обновляет файл и приводит к резервному копированию этой страницы с этого момента (копирование при записи).
ДинамическоеЗагрузчик получает необходимую информацию из заголовков программ ELF, которые вы можете просматривать с помощью:
readelf -l libfoo.so
Из них динамический загрузчик определяет, что отображать как код, данные только для чтения, данные и bss (нользаполненный сегмент с нулевым размером в файле, ненулевым размером в памяти и именем, совпадающим в загадочности только с автомобилем Лиспа и cdr).
Итак, на самом деле, код , а также данные является общим , пока запись не вызовет копирование при записи.Вот почему пометка постоянных данных как постоянных является потенциально важной оптимизацией пространства (см. DSO howto ).
Более подробную информацию можно получить на справочной странице mmap(2)
и в документации ./nommu-mmap.txt (случай MMU, no-MMU - для встроенных устройств, таких как ADSL-маршрутизаторы и Nintendo DS).