- •Введение 5
- •1 Исследовательский раздел
- •1.1 Анализ существующих аналогичных систем
- •1.1.1 Обзор архитектуры устройств usb
- •1.2 Обоснование выбора программно-аппаратных средств
- •1.3 Постановка задачи
- •1.4 Развернутое техническое задание
- •1.4.1 Общие сведения
- •2.1.1 Основные дескрипторы usb драйвера
- •2.1.1.1 Дескриптор устройства
- •2.1.1.2 Дескриптор расширения устройства
- •2.1.1.3 Дескриптор конфигурации
- •2.1.1.4 Дескриптор интерфейса
- •2.1.1.5 Дескриптор конечной точки
- •2.2 Разработка функциональной схемы драйвера
- •2.2.1 Драйвер в иерархии wdm
- •2.2.2 Уровни обмена данными usb устройств
- •2.2.3 Архитектура системного драйвера usb
- •2.2.4 Основные рабочие процедуры драйвера
- •2.2.5 Управление перемещаемостью кода в драйвере
- •2.3 Разработка алгоритмического обеспечения
- •2.3.1 Инициализация драйвера
- •2.3.3 Обработка расширенных запросов ioctl
- •2.3.4 Поддержка запросов Plug and Play
- •2.3.5 Управление питанием
- •2.3.5.1 Обработка запросов irp_mj_power
- •2.3.6 Процедура деинициализации драйвера
- •2.4 Разработка программного обеспечения
- •2.4.1 Процедура DriverEntry
- •2.4.2 Процедура DriverUnload
- •2.4.3 Процедура AddDevice
- •2.4.4 Процедура передачи запроса usbd
- •2.4.5 Обработчики usbCreate и usbClose
- •2.4.6 Обработчик ConfigureDevice
- •2.4.7 Обработчики запросов на чтение и запись
- •3 Технологический раздел
- •3.1 Технология разработки драйверов для операционных систем семейства Windows
- •3.1.1 Архитектура Windows Driver Model
- •3.1.2 Выбор типа разрабатываемого драйвера
- •3.1.3 Разработка usb драйвера
- •3.2 Технология отладки драйверов в операционных системах семейства Windows
- •3.2.1 Основные отладочные тесты
- •3.2.2 Основные «проблемы», возникающие при отладке драйвера
- •3.2.2.1 Аппаратные проблемы
- •3.2.2.2 Программные проблемы
- •3.2.3 Основные отладчики и утилиты для проверки драйвера
- •3.2.3.1 Отладчик WinDbg
- •3.2.3.2 Driver Verifier
- •3.2.4 Общие приемы отладки драйвера
- •3.2.4.1 Установка фиксированных точек прерывания
- •3.2.4.2 Промежуточный вывод на экран
- •3.2.4.3 Сохранение отладочного кода в исходном тексте драйвера
- •3.2.4.4 Перехват некорректных условий
- •3.2.4.5 Обнаружение утечек памяти
- •3.2.5 Замечания по отладке драйверов
- •4 Безопасность жизнедеятельности
- •4.1 Анализ эргономических параметров рабочего места пользователя пэвм
- •4.1.1 Общие эргономические аспекты рабочего места
- •4.2 Организация рабочего места пользователя с учётом эргономических требований
- •4.2.1 Организация рабочего стола
- •4.2.2 Рабочее кресло
- •4.2.3 Работа с клавиатурой и мышью
- •4.2.4 Расположение и эргономические характеристики монитора
- •4.2.5 Внутренний объем
- •4.2.6 Рабочая поза пользователя пэвм
- •4.3 Экологическая оценка и переработка узлов компьютерной техники содержащих платину
- •4.3.1 Извлечение платины из отработанных катализаторов
- •4.3.2 Извлечение платины из радиооборудования и сплавов для электрических контактов
- •5 Экономический раздел
- •5.1 Планирование разработки драйвера с построением графика выполнения работ
- •5.1.1 Определение этапов и работ по созданию программного продукта
- •5.1.2 Расчет трудоемкости и продолжительности работ
- •5.1.3 Построение графика выполнения работ
- •5.2 Расчет затрат на разработку
- •5.3 Оценка экономической эффективности проекта
- •1 К исследовательскому разделу
- •2 К специальному разделу
- •3 К технологическому разделу
- •4 К разделу «Безопасность Жизнедеятельности»
- •5 К экономическому разделу
- •Приложение а Установка драйвера с помощью inf-файла
- •Приложение б Графические материалы
3.2.3 Основные отладчики и утилиты для проверки драйвера
3.2.3.1 Отладчик WinDbg
Одним из отладчиков, которые может использовать разработчик драйверов, является отладчик WinDbg, поставляющийся в составе пакета DDK. Отладчик WinDbg представляет собой гибрид отладчика уровня ядра и пользовательского режима. При помощи WinDbg можно проводить анализ файлов «crash dump files» (отображение физической памяти в момент сбоя), отлаживать драйверный код путем трассировки (пошагового выполнения), анализировать «dump file» приложений [3.5].
Помимо того, что WinDbg выполняет свои задачи и в режиме ядра, и в пользовательском режиме, он также предоставляет рабочий интерфейс и в графической форме, и в форме командной строки, характерной для старых отладчиков.
Одной из самых значительных возможностей, которой обладает отладчик WinDbg, является его способность поддерживать отладку компонентов уровня ядра в исходных текстах отлаживаемых модулей. При этом отладчику должны быть доступны и исходные тексты, и файлы с отладочными символами («файлы идентификаторов»).
Тем не менее, отладка в исходных текстах представляет достаточно существенную организационную проблему. Во-первых, для отладки драйвера требуется два компьютера, на одном из которых работает собственно отладчик, а на втором — отладочный агент, относительно небольшой объем кода, который получает управляющие команды с первого компьютера. Во-вторых, для проведения отладки потребуется отладочная версия операционной системы, для которой имеются соответствующие файлы отладочных символов [3.5].
3.2.3.2 Driver Verifier
Утилита Driver Verifier входит как в отладочные, так и в свободные сборки операционных систем и быстро становится одним из основных инструментов Microsoft для проверки качества драйверов [3.6]. Driver Verifier запустить из командной строки или команды меню пуск «выполнить», набрав «verifier.exe». При запуске пользователь проходит через несколько экранов программы- мастера (wizard). Далее описывается процесс отладки драйвера с помощью данной утилиты.
Рисунок 3.4 – Начальная страница Driver Verifier
После выбора режима на первой странице на экране появляется вторая страница (рис. 3.5). Здесь установим режим Выбрать отдельные параметры из полного списка.
Рисунок 3.5 – Окно создания параметров тестирования драйвера
На следующей странице (рис. 3.6) выбираются нужные режимы проверки. Они добавляются к тем проверкам, которые Driver Verifier выполняет автоматически.
Рисунок 3.6 – Окно выбора параметров тестирования драйвера
Доступны следующие режимы [3.6]:
Особый пул (Special Pool) — вся память в проверяемых драйверах выделяется из специального пула. Такие блоки располагаются в конце (или начале) страницы, поэтому сохранение данных перед выделенной памятью (или до нее) приводит к немедленному фатальному сбою.
Слежение за пулом (Pool Tracking) — заставляет Driver Verifier отслеживать операции выделения памяти, выполненные проверяемыми драйверами. Пользователь может наблюдать за статистикой использования памяти и за тем, как она изменяется со временем. Driver Verifier также гарантирует освобождение всей выделенной памяти при выгрузке проверяемых драйверов, что упрощает выявление утечки памяти.
Обязательная проверка IRQL (Force IRQL Checking) — фактически обеспечивает очистку перемещаемой памяти каждый раз, когда проверяемый драйвер поднимает IRQL до уровня DISPATCH_LEVEL и выше. Эта операция помогает выявлять некорректные обращения к перемещаемой памяти в драйверах. При включении этого режима система работает относительно медленно.
Проверка I/O (I/O Verification) — заставляет Driver Verifier выполнять базовые проверки пакетов IRP, создаваемых драйвером или пересылаемых другим драйверам.
Проверка взаимоблокировок (Deadlock Detection) — строит диаграмму с иерархией блокировок для спин-блокировок, мьютексов и быстрых мьютексов, используемых проверяемыми драйверами, с целью выявления потенциальных взаимных блокировок.
Проверка DMA (DMA Checking) — следит за тем, чтобы проверяемые драйверы использовали при работе с DMA только методы, предписанные в DDK.
Имитация нехватки ресурсов (Low Resources Simulation) — имитация случайных сбоев при выделении памяти проверяемыми драйверами, начиная через 7 минут после запуска системы. Таким образом, проверяется обработка возвращаемых значений, получаемых драйверами при выделении памяти.
Выбранные режимы могут быть связаны между собой. Например, возможность в настоящее время включения проверки DMA или выявления взаимных блокировок приводит к отключению проверки ввода/вывода [3.6].
После выбора режимов проверки открывается последняя страница мастера. На этой странице выбираются проверяемые драйверы, для чего пользователь устанавливает флажки в соответствующих строках списка (рис. 3.7). Затем компьютер необходимо перезагрузить, потому что многие проверки Driver Verifier требуют инициализации на стадии загрузки.
Рисунок 3.7 – Окно настроек выборки проверяемых драйверов
На мой взгляд, при отладке драйверов удобнее, если драйвер не был загружен на момент перезапуска системы. Если в списке такие драйверы отсутствуют, их приходится добавлять кнопкой (рис 3.8).
Рисунок 3.8 – Окно выбора конкретных драйверов для проверки
Кстати говоря, сбои Driver Verifier являются фатальными. Для выявления причины сбоя в системе должен работать отладчик режима ядра, в противном случае придется анализировать аварийный дамп.