Общие утверждения, обвиняющие 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, - это перенос одного сектора.