2010-08-12 3 views
4

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

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

Что необходимо для выравнивания адреса до 512 байт.

ответ

5

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

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

Однако аппаратное обеспечение имеет дело с физическими адресами, в то время как ОС имеет дело с адресами виртуальной памяти (которая является конструкцией защищенного режима в процессоре x86). Это означает, что смежный буфер в пространстве процессов может не быть смежным в физическом RAM. Если не заботиться о создании физически смежных буферов, перенос DMA необходимо разбить на границах страниц VM (обычно 4K, возможно 2M).

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

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

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

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

4

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

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

+0

Как это сделать быстрее путем согласования с 512 байтами, как если бы данные передавались 4 байта в цикле – Poorna

+0

@siri, вот в чем суть - этого может и не быть. Он может быть передан 8, 16, 32 или даже больше, как и все 512 байтов за один цикл. Аппаратное обеспечение DMA может делать в основном что угодно - все зависит от реализации. –

+4

@siri: он выполняется быстрее, не имея процессора, участвующего в передаче вообще (это то, что DMA все о), но аппаратное обеспечение DMA иногда налагает ограничения выше и выше тех, которые скрыты в самой архитектуре. – dmckee

0

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

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

EDIT: Требования к выравниванию предназначены для смещения/размера ввода-вывода; это обычно не требование к выравниванию памяти.

EDIT: Если вы смотрите на this page (это, кажется, единственный хит), он также говорит о том, что память должна быть страница выровнен.

Смежные вопросы