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


Проверка DMA

Проверка DMA отслеживает использование прямого доступа к памяти (DMA). Так как процедуры DMA изменились по мере разработки Windows, многие драйверы неправильно используют вызовы DMA. Кроме того, некоторые средства записи драйверов пытаются обойти подсистему HAL DMA. Эта практика может привести к коварным ошибкам в драйвере.

Параметр Проверки DMA средства проверки драйверов пытается перехватывать распространенные ошибки DMA. Вместе с расширением отладчика ядра !dma его можно использовать для проверки правильности использования DMA драйвером.

Этот параметр средства проверки драйверов также называется проверкой HAL. Некоторые сообщения об ошибках, создаваемые средством проверки драйверов, могут использовать этот термин.

Различные типы DMA

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

Существует несколько типов DMA, используемых в Windows 2000 и более поздних версиях:

DMA с общим буфером
Общий буфер DMA выполняется, когда система может выделить один буфер, доступный как для оборудования, так и для программного обеспечения. Драйвер отвечает за синхронизацию доступа к буферу. Память не кэшируется, что упрощает синхронизацию для драйвера. После настройки общего буфера драйвер и оборудование могут выполнять запись непосредственно в адреса в буфере без какого-либо вмешательства со стороны HAL.

Пакет DMA
DMA пакетов выполняется при наличии одного существующего буфера, который должен быть сопоставлен для использования оборудованием. Примером использования DMA пакета является передача файла из памяти на диск. Использование DMA с общим буфером в этой ситуации было бы расточительным, так как файл должен быть передан в общий буфер, прежде чем оборудование сможет перенести его на диск. Вместо этого проводится консультации с HAL; он предоставляет драйверу сведения, необходимые для того, чтобы помочь оборудованию найти фактический буфер в памяти. Эта операция осложняется необходимостью работы процедур в разных архитектурах.

Точечная или сборная DMA
Точечная и сборная DMA — это быстрый метод, который настраивает несколько передач пакетов DMA одновременно. Например, при передаче пакета по сети каждая часть сетевого стека добавляет собственный заголовок (TCP, IP, Ethernet и т. д.). Все эти заголовки выделяются из разных мест в памяти. В этом случае DMA точечной и сборной экономит время, отправляя пакетный запрос в HAL для сопоставления каждого заголовка и сегмента данных для доступа оборудования. Вместо того, чтобы вызывать подпрограммы DMA пакета для каждой части пакета, этот метод вызывает каждую подпрограмму один раз и позволяет HAL отвечать за сопоставление каждой из них по отдельности.

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

Системный DMA
Системный DMA выполняется путем программирования системного контроллера DMA на системной плате для выполнения передачи напрямую. Использовать системный DMA могут только карты ISA.

Эффекты проверки DMA

При активной проверке DMA средство проверки драйверов обнаруживает неправильное использование процедур DMA, в том числе:

  • Переполнение или недостаточное выполнение буфера памяти DMA (эти ошибки могут быть вызваны оборудованием или драйвером).

  • Двойное освобождение общего буфера, канала адаптера, регистра карты или точечной или сборной списка.

  • Утечка памяти не освобождает общие буферы, каналы адаптера, регистры карт, списки точечной и сборной данных или адаптеры.

  • Наличие нескольких каналов адаптера для адаптера одновременно.

  • Попытка использования адаптера, который уже освобожден и больше не существует.

  • Не очищает буфер адаптера.

  • Слишком много невыполненных ссылок для адаптера.

  • Выполнение DMA в страничном буфере (все буферы должны быть заблокированы до начала передачи DMA).

  • Выполнение DMA в MDL с искаженными флагами.

  • Ссылка на недопустимый системный адрес до первого MDL или после окончания первого MDL либо с использованием длины передачи, которая больше буфера MDL и пересекает границу страницы в MDL.

  • Одновременное выделение слишком большого количества регистров карты или выделение большего количества регистров карты, чем максимально допустимое число.

  • Двойное сопоставление регистров карты.

  • Попытка освободить регистры карты, пока некоторые из них все еще сопоставлены.

  • Попытка очистки регистра карты, который не был сопоставлен.

  • Попытка очистить слишком много байтов в конце файла регистра карты.

  • Вызов процедур DMA при неправильном IRQL.

  • Передача DMA_ADAPTER со значением NULL в подпрограмму HAL.

  • Передача адреса и MDL в подпрограмму HAL, если адрес не содержится в MDL.

  • Попытка сопоставить уже сопоставленный диапазон адресов.

  • Попытка очистки буфера, который не сопоставлен.

  • Попытка сопоставить буфер нулевой длины для передачи.

  • Вызов устаревшей функции HalGetAdapter (все драйверы должны использовать IoGetDmaAdapter ).

Средство проверки драйверов отслеживает поведение драйвера и выдает проверка 0xE6 ошибок при возникновении каких-либо из этих нарушений. Список параметров проверка ошибок см. в разделе 0xE6 проверки ошибок (DRIVER_VERIFIER_DMA_VIOLATION).

Когда полезна проверка DMA?

Все драйверы, использующие DMA напрямую (путем вызова процедур HAL DMA), должны тестироваться с помощью проверки DMA.

Кроме того, необходимо также протестировать драйверы минипорта, так как они часто используют DMA косвенно (путем вызова драйверов портов, использующих DMA).

Проверка DMA также может быть эффективным способом обнаружения повреждений памяти, так как она может обнаружить, когда драйвер или аппаратное устройство переполнит буфер DMA.

Мониторинг проверки DMA

Расширение отладчика ядра !dma можно использовать для отображения большого объема сведений DMA. Он может отображать различные сведения о поведении каждого адаптера DMA. Подробный пример расширения !dma , а также общие сведения о расширениях отладчика приведены в документации по пакету Средств отладки для Windows. Дополнительные сведения см. в разделе Отладка Windows .

Активация этого параметра

Функцию проверки DMA можно активировать для одного или нескольких драйверов с помощью диспетчера проверки драйверов или командной строки Verifier.exe. Дополнительные сведения см. в разделе Выбор параметров средства проверки драйверов.

  • В командной строке

    В командной строке параметр проверки DMA представлен битом 7 (0x80). Чтобы активировать проверку DMA, используйте значение флага 0x80 или добавьте 0x80 к значению флага. Пример:

    verifier /flags 0x80 /driver MyDriver.sys
    

    Функция будет активна после следующей загрузки.

    В Windows Vista и более поздних версиях Windows можно также активировать и отключить проверку DMA без перезагрузки компьютера, добавив параметр /volatile в команду . Пример:

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    Этот параметр вступает в силу немедленно, но теряется при завершении работы или перезагрузке компьютера. Дополнительные сведения см. в разделе Использование переменных параметров.

    Функция проверки DMA также включена в стандартные параметры. Пример:

    verifier /standard /driver MyDriver.sys
    
  • Использование диспетчера проверки драйверов

    1. Запустите диспетчер проверки драйверов. Введите Verifier в окне командной строки.
    2. Выберите Создать пользовательские параметры (для разработчиков кода) и нажмите кнопку Далее.
    3. Выберите Выбрать отдельные параметры из полного списка.
    4. Выберите (проверка) проверка DMA.

    Функция проверки DMA также включена в стандартные параметры. Чтобы использовать эту функцию, в диспетчере проверки драйверов щелкните Создать стандартные параметры.