Выравнивание памяти для транзакции DMA (Windows Driver Foundation)

Мы пишем драйвер на основе DMA для нестандартного устройства PCI-Express с использованием WDF для Windows 7.

Как вы, возможно, знаете, транзакции шины PCI-Express не могут пересекать границу памяти 4 КБ. Пользовательское устройство не проверяет это, и поэтому мы должны убедиться, что драйвер запрашивает только передачи DMA, которые выровнены по границам памяти 4 КБ.

Профиль для устройства - WdfDmaProfilePacket64.

Мы попытались использовать WdfDeviceSetAlignmentRequirement(DevExt->Device, 4095), но это не приводит к правильному выравниванию начального адреса DMA.

Как мы можем настроить структуру WDF так, чтобы она запрашивала только правильно выровненные адреса?

1 ответ

Вы можете обработать это в приложении пользовательского пространства, так как вы инициируете / выделяете выровненную память в пользовательском пространстве, а затем отправляете ее программе ядра. водителю нелегко выровнять память, которая уже выделена и инициирована. даже в приложении пользовательского пространства мы должны выделить дополнительное пространство и затем использовать выровненную часть (я знаю, это не красиво, поэтому я рекомендую решить эту проблему на стороне устройства)

например, если вы используете C++ для своего пользовательского приложения, вы можете сделать что-то вроде этого

Другие вопросы по тегам