Виртуальная память и выравнивание - как они влияют вместе? - PullRequest
8 голосов
/ 19 ноября 2011

Я думаю, что понимаю выравнивание памяти, но что меня смущает, так это то, что адрес указателя в некоторых системах будет находиться в виртуальной памяти, верно?Так что большая часть проверки / обеспечения выравнивания, которую я видел, кажется, просто использует адрес указателя.Разве не возможно, что адрес физической памяти не будет выровнен?Разве это не проблематично для таких вещей, как SSE?

Ответы [ 2 ]

8 голосов
/ 19 ноября 2011

Физический адрес будет выровнен, поскольку виртуальная память отображает только выровненные страницы в физическую память (а размер страниц обычно составляет 4 КБ).

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

В конкретном случае SSE все работает нормально, потому что вам нужно только 16-байтовое выравнивание.

4 голосов
/ 19 ноября 2011

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

Как правило, все выравнивания на данной платформе имеют степени двойки.Например, в 32-разрядных целых числах x86 естественное выравнивание составляет 4 байта (2 ^ 2).Размер страницы, который определяет, насколько точно блок можно отобразить в физической памяти, обычно равен большой степени двух.На x86 наименьший допустимый размер страницы составляет 4096 байт (2 ^ 12).Самый большой тип данных, который может нуждаться в выравнивании на x86, составляет 128 бит (для регистров XMM и CMPXCHG16B) 32 байта (для AVX) - 2 ^ 5.Поскольку 2 ^ 12 делится на 2 ^ 5, вы обнаружите, что все выровнено в самом начале страницы, а поскольку страницы выровнены как в виртуальной, так и в физической памяти, виртуально выровненный адрес всегда будет физически выровненным.

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

Обратите внимание, что у вас может быть причина требовать большего выравнивания, чем время от времени страница.Как правило, для кодирования пространства пользователя не имеет значения, выравнивается ли это в физической ОЗУ (в этом случае, если вы запрашиваете несколько страниц, это вряд ли будет даже непрерывным!).Проблемы здесь возникают, только если вы пишете драйвер устройства и вам нужен большой, выровненный, непрерывный блок для прямого доступа к памяти.Но даже тогда, как правило, устройство не является сторонником выравнивания размером больше, чем размер страницы.

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