Что такое привязка адресов?

Я нашел некоторые объяснения о том, что такое «привязка адреса» . Они говорят, что «привязка адресов – это операция сопоставления виртуальных или логических адресов с физическими адресами».

Это определение правильно?

Я не могу убедиться, что это правильно или нет, потому что в презентации университета говорится, что преобразование виртуальных адресов в физические адреса выполняется во время выполнения. Однако привязка адреса говорит о том, что операция привязки может быть реализована во время компиляции, времени загрузки или выполнения.

Это показывает, что есть противоречие.

Объяснение Quora кажется мне довольно запутанным и смешивает ряд понятий.

Термин «привязка адресов» в контексте адресов памяти (в отличие, например, от сетевых адресов) происходит из статьи Леона Прессера и Джона Р. Уайта 1972 года о компоновщиках и загрузчиках (см. Также запись ACM ), где он определен следующее:

Преобразование или отображение логического в физический адрес называется привязкой адреса .

Быстрое чтение может создать впечатление, что речь идет о логических и физических адресах с точки зрения управления памятью, но это не так; в статье физические адреса – это адреса «информации» в памяти, а логические адреса – символы, используемые для обращения к этой информации. Таким образом, привязка адреса – это то, что в настоящее время обычно называют перемещением символа (или указателя), и, как вы говорите, это может происходить во время компиляции (например, при создании статического двоичного файла), во время загрузки (когда динамический компоновщик разрешает символы в общая библиотека) или во время выполнения (когда работающая программа разрешает символы вручную, например, используя dlopen ).

Эта статья сбивает с толку. Самая первая часть этой статьи кажется точной. Виртуальные адреса используются kernelм ЦП, они сопоставляются MMU с физическими адресами, а затем они используются при переходе в ОЗУ. Я никогда не слышал, чтобы это называлось «привязка адресов». «Картирование» было бы более распространенным, но это всего лишь вопрос терминологии.

Тогда есть это утверждение в середине второго абзаца, ссылаясь на вышеуказанный процесс:

Этот тип привязки требует, чтобы компилятор генерировал перемещаемые или смещенные адреса из исходного кода.

Это чепуха.

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

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

Все это происходит в рамках представления процесса о виртуальном адресном пространстве. Он нуждается в поддержке компилятора, так как сам код должен знать об этом.

Трансляция виртуальных адресов MMU не требует сотрудничества с процессом. Вместо этого задача ОС состоит в том, чтобы при необходимости исправлять сопоставления адресов, например, если часть процесса выгружена для замены, и к ней необходимо получить доступ.

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

(Все вышеизложенное основано на том, что я знаю о системах x86. Другие системы могут отличаться.)