Утверждения о платьях, обвиняющие 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, - это передача в одном секторе.
Как это сделать быстрее путем согласования с 512 байтами, как если бы данные передавались 4 байта в цикле – Poorna
@siri, вот в чем суть - этого может и не быть. Он может быть передан 8, 16, 32 или даже больше, как и все 512 байтов за один цикл. Аппаратное обеспечение DMA может делать в основном что угодно - все зависит от реализации. –
@siri: он выполняется быстрее, не имея процессора, участвующего в передаче вообще (это то, что DMA все о), но аппаратное обеспечение DMA иногда налагает ограничения выше и выше тех, которые скрыты в самой архитектуре. – dmckee