1. Введение
Очень часто при разработке программного обеспечения возникает необходимость, проследить за его работой: сколько времени его потоки выполняются в режиме ядра, сколько - в пользовательском режиме, сколько времени они проводят в ожидании, а также количество переключений контекста из одного режима в другой. Всё это важно, так как каждый из режимов имеет свои особенности. В режиме ядра код выполняется быстрее, но существует потенциальная возможность повреждения данных/кода системы. В противоположность режиму ядра, пользовательский режим ограничен в предоставляемых ему сервисах так, чтобы его код не мог привести к краху системы. Для этой же цели в пользовательском режиме выполняются дополнительные проверки, позволяющие предотваратить выполнение вредоносных инструкций. Поэтому скорость выполнения кода пользовательского режима существенно ниже. Количество переключений контекста тоже влияет на скорость выполнения кода, так как это операция является довольно дорогостоящей (около 2000 тактов). Это было хорошо заметно при разработке лабораторных работ и курсового проекта по машинной графике: при рисовании изображения попиксельно с помощью функции SetPixel, скорость прорисовки была несоизмеримо меньше, чем при использовании буфера пользовательского режима, в который постепенно заносилась информация о цвете соответствующих элементам буффера пикселям. Это происходило засчёт того, что при использовании функции SetPixel происходило два переключения контекста (из пользовательского режима в режим ядра и обратно) на один пиксель, а при использовании буфера, хранящего контекстно независимое представление цвета, - те же два переключения, но один раз на прорисовку целого кадра.
Таким образом, возможность узнать вышеуказанную статистическую информацию о целевом программном обеспечении, позволит своевременно заметить так называемые «узкие» места в программе, которые мешают улучшению производительности приложения в целом.
- 1. Введение
- 2. Аналитический раздел
- 2.1 Техническое задание
- 2.2 Обзор архитектуры Windows NT 5.x
- 2.3 Классификация драйверов
- 2.4 Общая структура Legacy-драйвера
- 2.4.1 Процедура DriverEntry
- 2.4.2 Процедура DriverUnload
- 2.4.3 Рабочие процедуры обработки IRP-пакетов
- 2.4.4 ISR - процедура обработки прерываний
- 2.4.5 DPC - процедура отложенного вызова
- 3. Конструкторский раздел
- 3.1 Legacy-драйвер
- 3.1.1 Процедура DriverEntry
- 3.1.2 DriverUnload
- 3.1.3 DispatchCreate и DispatchClose
- 3.1.4 DispatchDeviceControl
- 3.2 Пользовательское приложение
- 4. Технический раздел
- 4.1 Выбор операционной системы и среды программирования
- 4.2 Интерфейс
- 4.3 Системные требования