Как разделяемая библиотека может использоваться разными процессами? - PullRequest
2 голосов
/ 26 октября 2010

Я прочитал некоторые документы, которые совместно используют библиотеку с аргументом -fPIC, Сегмент .text .so будет доступен на этапе динамической компоновки форка процесса (например, процесс сопоставит .so с тем же физическим адресом)

меня интересует кто (ядро или ld.so) и как этого добиться? может быть, мне следует отследить код, но я не знаю, с чего начать.

Тем не менее, я пытаюсь проверить утверждение.
Я решил проверить адрес функции, такой как printf, который находится в libc.so, на который будет ссылаться вся программа c. Я получаю виртуальный адрес printf процесса, и мне нужно получить физический адрес. Попытался написать модуль ядра и передать ядру значение адреса, затем вызвать virt_to_phys. Но это не сработало, потому что virt_to_phys работает только для адреса kmalloc.

Таким образом, просмотр таблицы страниц процесса может быть решением для поиска виртуальной карты адресов по физическим адресам. Были ли способы сделать просмотр таблицы страниц? Или другие способы могут соответствовать проверенному эксперименту?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 06 ноября 2010

Динамический загрузчик использует 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).

2 голосов
/ 26 октября 2010

Общие библиотеки только для определенного использования сопоставленных файлов.

Адрес, по которому файл отображается в адресном пространстве процесса, не имеет никакого отношения к тому, является ли он общим или нет.

Страницы могут быть общими, даже если они сопоставлены по разным адресам.

Чтобы узнать, являются ли страницы общими, сделайте следующее:

  1. Найдите адрес, на который отображаются файлы, изучив / proc / pid / maps
  2. Существует инструмент, который извлекает данные из / proc / pid / pagemap - найдите их и используйте. Это дает вам информацию о том, какие именно страницы отображаются на карте и в каком физическом месте они находятся

Если у двух процессов есть страница, сопоставленная по одному и тому же физическому адресу, она, разумеется, является общей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...