Выравнивание памяти - PullRequest
       42

Выравнивание памяти

4 голосов
/ 12 августа 2010

Я понял, почему память должна быть выровнена до 4 байтов и 8 байтов в зависимости от ширины данных шины.Но следующее утверждение смущает меня

«IoDrive требует, чтобы все операции ввода-вывода, выполняемые на устройстве с использованием O_DIRECT, были выровнены по 512 байтам и имели размер, кратный 512 байтам».

Для чего нужно выровнять адрес до 512 байт.

Ответы [ 3 ]

5 голосов
/ 16 декабря 2010

Общие утверждения, обвиняющие DMA в больших ограничениях выравнивания буфера, неверны.

Аппаратные передачи DMA обычно выровнены на границах 4 или 8 байтов, поскольку шина PCI может физически передавать 32 или 64 бита за раз. Помимо этого базового выравнивания, аппаратные передачи DMA предназначены для работы с любым предоставленным адресом.

Однако аппаратное обеспечение работает с физическими адресами, а ОС - с адресами виртуальной памяти (это конструкция защищенного режима в процессоре x86). Это означает, что непрерывный буфер в пространстве процесса может не быть непрерывным в физическом ОЗУ. Если не предпринимаются усилия для создания физически смежных буферов, передача DMA должна быть разбита на границах страницы ВМ (обычно 4 КБ, возможно, 2 МБ).

Что касается буферов, нуждающихся в выравнивании по размеру сектора диска, это совершенно не соответствует действительности; аппаратное обеспечение DMA полностью игнорирует размер физического сектора на жестком диске.

В Linux 2.4 для O_DIRECT требуется выравнивание 4K, в версии 2.6 оно уменьшено до 512B. В любом случае, это было, вероятно, проектное решение, чтобы предотвратить пересечение одиночных секторных обновлений границ страниц ВМ и, следовательно, необходимость разделенных передач DMA. (Произвольный буфер 512B имеет шанс 1/4 пересечь страницу 4K).

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

Редактировать: Конечно, если мы в любом случае пишем большие буферы (100 КБ), то количество пересеченных границ страницы виртуальной машины будет практически одинаковым независимо от того, выровнены ли мы на 512 Б или нет. Таким образом, основной случай, оптимизируемый выравниванием 512B, - это перенос одного сектора.

4 голосов
/ 12 августа 2010

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

На некоторых процессорах ARM таблица перевода первого уровня должна быть выровнена по 16Граница КБ!

0 голосов
/ 12 августа 2010

Если вы не знаете, что делаете, не используйте O_DIRECT.

O_DIRECT означает «прямой доступ к устройству». Это означает, что он обходит все кэши ОС, напрямую ударяя по диску (или, возможно, RAID-контроллеру и т. Д.). Доступ к диску осуществляется по секторам.

РЕДАКТИРОВАТЬ: Требование выравнивания для смещения / размера IO; обычно это не требование выравнивания памяти.

РЕДАКТИРОВАТЬ: Если вы смотрите на эту страницу (кажется, это единственный удар), это также говорит о том, что память должна быть выровнена по странице.

...