Поделиться через


Выполнение DMA в 64-разрядной версии Windows

Добавление поддержки 64-разрядной адресации в драйвер может значительно повысить общую производительность системы. Это особенно важно для драйверов устройств, которые осуществляют прямой доступ к памяти (DMA). В 64-разрядной версии Microsoft Windows драйверы устройств, которые выполняют DMA, но не поддерживают 64-разрядную адресацию, имеют двойную буферизацию, что приводит к снижению относительной производительности.

Хотя двойная буферизация обычно оказывает относительно небольшое влияние (один процентный пункт) на системы размером 8 ГБ, этого достаточно, чтобы повлиять на задачи с интенсивным вводом-выводом, такие как активность базы данных. По мере увеличения объема физической памяти это негативное влияние на производительность также увеличивается.

Для поддержки 64-разрядной DMA драйверы должны соблюдать следующие рекомендации.

  1. Используйте PHYSICAL_ADDRESS структуры для вычислений физических адресов.

  2. Рассматривайте весь 64-разрядный адрес как допустимый физический адрес. Например, драйверы не должны вызывать MmGetPhysicalAddress в заблокированном буфере, удалять высокие 32 бита и передавать усеченный адрес адаптеру 32-разрядного компонента. Это приводит к повреждению памяти, потере операций ввода-вывода и сбою системы.

  3. Используйте высокопроизводительные подпрограммы точечной и сборной (GetScatterGatherList и PutScatterGatherList), которые были добавлены в Windows 2000.

  4. Проверьте значение глобальной системной переменной Mm64BitPhysicalAddress . Если задано значение TRUE, система поддерживает 64-разрядную физическую адресацию.

  5. Задайте для элемента Dma64BitAddresses структуры DEVICE_DESCRIPTIONзначение TRUE , чтобы указать, что драйвер поддерживает 64-разрядные адреса DMA.

Подпрограммы DMA в 32-разрядной версии Windows готовы к работе с 64-разрядной версией. Если драйвер устройства правильно использует эти подпрограммы, код DMA должен работать без изменений в 64-разрядной версии Windows.