Виртуальная память и выравнивание - как они влияют друг на друга?
Я думаю, что понимаю выравнивание памяти, но меня смущает то, что адрес указателя на некоторых системах будет в виртуальной памяти, верно? Поэтому большая часть проверки / обеспечения выравнивания, которую я видел, похоже, просто использует адрес указателя. Возможно ли, что адрес физической памяти не будет выровнен? Разве это не проблематично для таких вещей, как ночь?
2 ответов
физический адрес будет выровнен, потому что виртуальная память отображает только выровненные страницы в физическую память (а страницы обычно 4KB).
поэтому, если вам не нужно выравнивание > размер страницы, физическая память будет выровнена в соответствии с вашими требованиями.
в конкретном случае SSE, все работает нормально, потому что вам нужно только 16 байтовое выравнивание.
Я не в курсе каких-либо фактических систему, в которой согласованы адрес виртуальной памяти может привести к смещению физический адрес памяти.
Как правило, все выравнивания на данной платформе будут силы два. Например, на x86 32-разрядные целые числа имеют естественное выравнивание 4 байта (2^2). Размер страницы-который определяет, насколько хорошо блок можно отобразить в физической памяти-обычно большой власть два. На x86, наименьший допустимый размер страницы составляет 4096 байтов (2^12). Самый большой тип данных, который может потребоваться выравнивание на x86, -128 бит (для регистров XMM и CMPXCHG16B) 32 байта (для AVX) - 2^5. Поскольку 2^12 делится на 2^5, вы обнаружите, что все выравнивается прямо в начале страницы, а поскольку страницы выровнены как в виртуальной, так и в физической памяти, виртуальный выровненный адрес всегда будет выровнен по физическому.
на более практическом уровне, позволяя выровненным виртуальным адресам сопоставляться с несогласованными физическими адресами не только было бы очень сложно генерировать код, это также сделало бы архитектуру процессора более чем просто разрешить любое выравнивание (так как теперь у нас есть страницы нечетного размера и другие странности...)
обратите внимание, что у вас могут быть причины время от времени запрашивать большие выравнивания, чем страница. Как правило, для кодирования пользовательского пространства не имеет значения, выровнено ли это в физической ОЗУ (если на то пошло, если вы запрашиваете несколько страниц, это вряд ли будет даже смежно!). Проблемы здесь возникают, только если вы пишете драйвер устройства и нужен большой, выровненный, смежный блок для DMA. Но даже тогда, как правило, устройство не является приверженцем выравнивания больше, чем размер страницы.