Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Проверка DMA отслеживает использование прямого доступа к памяти (DMA). Так как процедуры DMA изменились по мере разработки Windows, многие драйверы неправильно используют вызовы DMA. Кроме того, некоторые авторы драйверов пытаются обойти подсистему HAL DMA в целом. Эта практика может привести к коварным ошибкам в драйвере.
Опция проверки DMA средства проверки драйвера пытается выявить распространенные ошибки DMA. Вместе с расширением отладчика ядра !dma его можно использовать для проверки правильности использования драйвера DMA.
Этот параметр проверки драйвера также называется HAL Authentication. Некоторые сообщения об ошибках, созданные проверятелем драйверов, могут использовать этот термин.
Различные типы DMA
DMA — это механизм, с помощью которого аппаратное устройство может передавать данные в память или из памяти без использования процессора. Процессор требуется для настройки передачи, и устройство сигнализирует процессору после завершения передачи. Преимущество этой системы заключается в том, что процессор может выполнять другие задачи во время выполнения передачи DMA.
В Windows 2000 и более поздних версиях используется несколько типов DMA:
Общий буфер DMA
Операция общего буфера DMA выполняется, когда система может выделить один буфер, доступный как оборудованию, так и программному обеспечению. Драйвер отвечает за синхронизацию доступа к буферу. Память не кэшируется, что упрощает эту синхронизацию для драйвера. После настройки общего буфера драйвер и оборудование могут записывать непосредственно в адреса в буфере без какого-либо вмешательства со стороны HAL.
Packet DMA
Пакетный DMA выполняется, когда имеется один существующий буфер, который должен быть сопоставлен для работы с оборудованием. Пример использования DMA пакета — передача файла из памяти на диск. Использование общего буфера DMA в этой ситуации было бы расточительным, так как файл должен быть передан в общий буфер, прежде чем оборудование может передать его на диск. Вместо этого используется HAL; он предоставляет драйверу информацию, необходимую для того, чтобы оборудование могло обнаружить фактический буфер в памяти. Эта операция усложняется потребностью в подпрограммах, участвующих в работе в разных архитектурах.
Точечная и сборная DMA
Рассеивающий/сборный DMA — это упрощённый метод, который одновременно настраивает несколько передач пакетов DMA. При передаче пакета через сеть, например, каждая часть сетевого стека добавляет собственный заголовок (TCP, IP, Ethernet и т. д.). Эти заголовки выделяются из разных мест в памяти. В этом случае точечная или сборная DMA экономит время путем выдачи пакетного запроса в HAL для сопоставления каждого заголовка и сегмента данных для доступа к оборудованию. Вместо того чтобы вызывать подпрограммы DMA пакета для каждой части пакета, этот метод вызывает каждую подпрограмму один раз и позволяет HAL отвечать за сопоставление каждого из них по отдельности.
Обратите внимание, что возможность разброса/сбора не означает, что устройство может использовать подпрограммы разброса/сбора. Функция scatter/gather означает флаг в описании устройства, указывающий, что устройство может читать или записывать данные из любой области памяти, а не только в пределах определенного диапазона.
Система DMA
Система DMA выполняется путем программирования системного контроллера DMA на материнской плате для непосредственного выполнения передачи. Только карты ISA могут использовать системные каналы DMA.
Эффекты проверки DMA
Если проверка DMA активна, средство проверки драйверов обнаруживает неправильное использование подпрограмм DMA, в том числе:
Переполнение или недополнение буфера памяти DMA (эти ошибки могут быть вызваны аппаратным обеспечением или драйвером).
Двойное освобождение общего буфера, канала адаптера, регистра карты или списка точечной или сборной.
Утечка памяти из-за неосвобождения общих буферов, каналов адаптера, регистров карты, списков разноски/сбора или адаптеров.
Наличие нескольких каналов для адаптера одновременно.
Попытка использовать адаптер, который уже освобожден и больше не существует.
Не очищает буфер адаптера.
Наличие слишком большого количества незакрытых ссылочных счетчиков для адаптера.
Выполнение DMA в страничном буфере (все буферы должны быть заблокированы перед началом передачи DMA).
Выполнение DMA на 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Использование диспетчера проверки драйверов
- Запустите диспетчер проверки драйверов. В окне командной строки введите средство проверки .
- Выберите "Создать настраиваемые параметры" (для разработчиков кода) и нажмите кнопку "Далее".
- Выберите отдельные параметры из полного списка.
- Выберите (проверьте) проверку DMA.
Функция проверки DMA также включена в стандартные параметры. Чтобы использовать эту функцию, в диспетчере проверки драйверов нажмите кнопку "Создать стандартные параметры".