Вы смешиваете множество концепций. Относительный адрес - это просто адрес, для которого необходим базовый адрес для преобразования в абсолютный адрес. Это преобразование может произойти во многих отношениях. One способ преобразовывает их во время загрузки, но их также можно использовать только вместе с инструкциями CPU, которые по существу поддерживают относительную адресацию, делая математику справа, когда необходимо получить доступ к памяти.
Если операционная система поддерживает виртуальную память, все адреса, используемые в обычном процессе, являются логическими, независимо от того, имеют ли они относительные или абсолютные ссылки. Переход от логических к физическим адресам выходит за рамки приложения и не зависит от какой-либо другой концепции, о которой вы говорите в своем вопросе.
Формат файла класса не работает с точки зрения местоположения памяти.
Если вы хотите применить термины «абсолютный» и «относительный» на этом более высоком уровне, индексы постоянного пула абсолютные, поскольку они не требуют базового индекса для определения фактического индекса. Тем не менее, если вы хотите найти местоположение памяти в загруженном файле, вам нужно не только использовать адрес, к которому был загружен файл класса, но также необходимо проанализировать весь пул констант до нужного элемента, поскольку постоянные пулы разные размеры байтов. По этой причине элементы обычно не просматриваются вообще. Вместо этого весь пул преобразуется в конкретное представление JVM с постоянными размерами элементов за один проход, а позже JVM может искать записи этой таблицы, которая не зависит от местоположения памяти файла класса.
В инструкциях с байтовым кодом используются относительные смещения, которые требуют добавления позиции текущей инструкции для получения абсолютной позиции, но обратите внимание, как это не соответствует понятиям, указанным в вашем вопросе. Абсолютные позиции по-прежнему являются позициями в последовательности команд и, следовательно, относительно местоположения памяти кода при разговоре о адресах. Кроме того, относительные смещения не используются, поскольку «привязка невозможна во время компиляции», результирующие абсолютные позиции известны во время компиляции. Набор инструкций для байтового кода Java определен только для использования относительных смещений для обеспечения более компактного кода. С точки зрения набора инструкций мы могли бы сказать, что он по существу поддерживает относительную адресацию. Как JVM фактически реализует свое исполнение, зависит от JVM.
С you mentioned the JVM’s native code generation, когда JVM создает собственный код, он знает адрес цели кода и может свободно решать использовать относительные или абсолютные адреса, точно так же, как он подходит.
Как уже упоминалось, все описанное выше происходит в течение одного процесса, поэтому, если операционная система использует виртуальную память, все это в терминах логических адресов, которые могут быть адаптированы операционной системой, например. через MMU. Эти понятия не связаны.
Вы сняли вопрос в ногу, представив RELOCATABLE. Это независимая концепция, которая на данный момент выходит за рамки вашего понимания. –
@BruceDavidWilner Насколько я помню. Могут быть два типа привязки адреса. Относительно логического и логического относительно. Иногда иногда относительный адрес и ссылочные термины используются взаимозаменяемо. Вот почему я использовал этот термин. – zgulser
@BruceDavidWilner Но я согласен с вашей точкой зрения. Перемещаемый больше относится к еще неразрешенным адресам (если вы имели ввиду). – zgulser