Как компилятор узнает выравнивание физического адреса?

Я знаю, что некоторые архитектуры ЦП не поддерживают доступ с невыровненным адресом (например, в архитектурах ARM до ARM 4 не было инструкций для доступа к объектам с половинным словом в памяти). И какой-то компилятор (например, некоторая версия GCC) для этой архитектуры будет использовать серию доступа к памяти, когда обнаружит смещенный адрес, так что смещенный доступ почти прозрачен для разработчиков (см. Полное руководство по GCC, Уильям фон Хаген)

Но мне интересно, как компилятор узнает, выровнен ли адрес или нет? В конце концов, то, что видит компилятор, — это виртуальный адрес (эффективный адрес, EA), если он может что-либо видеть. При запуске программы EA может быть сопоставлен с любым физическим адресом операционной системой. Даже если виртуальный адрес выровнен, результирующий физический адрес может быть смещен, не так ли? Выравнивание физического адреса — это то, что действительно имеет значение и передается по адресным линиям процессора.

Поскольку компилятор вообще не знает о физическом адресе, как он может быть достаточно умен, чтобы знать, совпадает ли адрес переменной?

11

Решение

Виртуальный адрес не привязан к какому-либо физическому адресу. Виртуальная память состоит из страниц, которые сопоставлены физическим страницам. (как правило, в соответствии с 4096).

Увидеть: Виртуальная память и выравнивание — как они учитываются вместе?

16

Другие решения

Выравнивание является очень полезным атрибутом для объектного кода, отчасти потому, что некоторые машины настаивают на «согласованном доступе», но на современных компьютерах, потому что строки кэша оказывают огромное влияние на производительность, и, следовательно, выравнивание кэша кода / циклов / данных / блокировок, таким образом, является требованием со стороны Ваш местный дружественный компилятор.

Практически все загрузчики в мире поддерживают загрузку кода с выравниванием по степени двойки небольшого размера и выше. (Ассемблеры и компоновщики также поддерживают это с помощью различных директив ALIGNMENT). Часто компоновщики и загрузчики просто выравнивают первое загруженное значение в любом случае с хорошо известным размером границы; Операционные системы с виртуальной памятью часто предоставляют удобную границу в зависимости от размера страницы виртуальной машины (связан с другим ответом).

Таким образом, компилятор может по существу знать, каково выравнивание его испускаемого кода / данных. И, отслеживая, сколько кода он испустил, он может знать, каково выравнивание любого испускаемого значения. Если ему требуется выравнивание, он может выдать директиву компоновщика или, для скромных размеров, просто дополнить, пока выделенное количество кода не будет соответствующим образом выровнено.

Из-за этого вы можете быть уверены, что большинство компиляторов не будут размещать код или конструкции данных так, чтобы они пересекали границы строк кэша (или навязывалась другая архитектура) таким образом, что это существенно влияет на производительность, если только на это нет указаний.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector