Отображение общей библиотеки в физическую память - PullRequest
0 голосов
/ 05 ноября 2018

Недавно я читал "компьютерные системы". В нем говорится, что разделяемая библиотека отображается на той же странице физической памяти, что и разделяемый объект между процессами, включая разделы .data и раздел .text. И операция записи в общем объекте в одном процессе также может быть «разделена» другим процессом. Вот проблема: при создании разделяемой библиотеки раздел данных начинается с GOT, который содержит адреса глобальных переменных. А динамический загрузчик отвечает за заполнение адресов для каждой программы, связанной с общей библиотекой, что означает запись адресов на соответствующей странице физической памяти, так как это может не повлиять на другой процесс, связанный с общей библиотека, так как она содержит совершенно другой GOT.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Недавно я читал "компьютерные системы". В нем говорится, что разделяемая библиотека отображается на той же странице физической памяти, что и разделяемый объект между процессами, включая разделы .data и раздел .text. И операция записи в общем объекте в одном процессе также может быть «разделена» другим процессом.

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

Некоторые системы делятся данными в общих библиотеках. Это было чудовищной болью в раннем Виндозе. Однако ни одна надежная система не позволила бы это без какой-либо установки.

0 голосов
/ 05 ноября 2018

Значения в GOT относятся к виртуальной памяти, а не к физической памяти. Таким образом, разделяемая библиотека может быть сопоставлена ​​с одним и тем же адресом виртуальной памяти в нескольких процессах несколько раз без необходимости дальнейшего перемещения с использованием виртуальных адресов, установленных компоновщиком .

.

Если виртуальная память не может быть отображена, потому что она уже занята чем-то другим, загрузчик отобразит библиотеку в свободную область виртуальной памяти и создаст копию и переместит ее.

...