- •Программная архитектура микропроцессоров семейства Intel x86. Краткое описание.
- •Адресация в защищённом режиме МП8086
- •Hardware Abstraction Level (HAL)
- •Ядро (Kernel)
- •Менеджер виртуальной памяти (Virtual Memory Manager)
- •Монитор защиты (Security reference monitor)
- •Создание Отображения файла (File Mapping)
- •Реестр Windows
- •Основы проектирования Виртуальных Устройств Windows 95
- •Системные сообщения (примеры)
- •Управление аппаратными ресурсами. Обработка IRP_MN_START_DЕVICE
Основы проектирования Виртуальных Устройств Windows 95
Автор: Сидякин И.М.
Московский Государственный Технический Университет им. Н.Э. Баумана. Кафедра ИУ-3, (01.1999)
Email:sidiakin@iu3.bmstu.ru
Виртуальные устройства относятся к компонентам нулевого кольца операционной системы. VxD могут напрямую взаимодействовать с аппаратными устройствами. Они в частности выполняют обработку аппаратных прерываний и поддерживают низкоуровневые операции ввода-вывода. VxD предназначены не только для управления аппаратурой. Они так же используются для организации интерфейса пользовательского программного обеспечения с системным ПО нулевого кольца и приложениями MS-DOS которые исполняются в виртуальных машинах V86. Виртуальные устройства имеют интерфейс с Менеджером виртуальных машин, другими VxD, 16-ти и 32-х разрядными приложениями Windows и приложениями MSDOS. VxD используют различные преимущества программного обеспечения работающего в нулевом кольце защиты операционной системы Windows включая защиту памяти от доступа со стороны пользовательских приложений, свободный доступ к памяти, портам ввода-вывода и другим системным ресурсам, быструю обработку аппаратных прерываний, общее адресное пространство. Разработка VxD как правило необходима в приложениях сбора и обработки данных которые исполняются в реальном времени. Пример программной архитектуры такой системы приводится на рисунке 1.
|
|
|
|
|
|
|
|
|
|
|
|
|
Приложение |
|
|
Приложение Win32 |
|
|
Приложение Win16 |
|
MS_DOS |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
Кольцо 3 |
|
|
|
|
|
|
|
|||||||
Кольцо 0 |
управление |
|
данные |
|
|
|
||||||||
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Виртуальное |
|
|
|
|
|
|
|
|
|
|||
|
устройство (VxD) |
|
|
|
|
|
VMM32.VxD |
|||||||
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VPICD.VxD |
|
|
VDMAD.VxD |
|
|||
Аппаратура |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Устройство |
|
|
|
Программируем |
|
Контроллер |
|||||||
|
сбора данных |
|
|
|
ый контроллер |
|
прямого доступа |
|||||||
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
прерываний |
|
к памяти |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 1. Система сбора данных.
Аппаратное устройство сбора данных использует механизм ПДП для копирования входного потока данных в память и выставляет аппаратное прерывание для индикации готовности данных. Системные виртуальные устройства VPICD и VDMAD предоставляют функции необходимые для инициализации контроллера ПДП и контроллера прерываний, подстановки процедуры обработчика IRQ, и запуска цикла ПДП. Интерфейс менеджера виртуальных машин (VMM) содержит различные системные функции управления памятью, синхронизации, работы с реестром,
102
таймером и т.д. VxD может прямо обращаться к памяти и портам ввода вывода аппаратного устройства для чтения данных и информации о состоянии, а так же для записи команд. С другой стороны виртуальное устройство взаимодействует с пользовательскими приложениями Win32, Win16 и MS-DOS. VxD получает команды от приложений и возвращает данные полученные от аппаратуры. Приложения третьего кольца в такой системе обеспечивают пользовательский интерфейс. Приложения Windows имеют мощный графический интерфейс для отображения данных и управления аппаратурой в режиме реального времени. Иногда дополнительно к виртуальному устройству создаётся динамическая библиотека, которая экспортирует набор API функций необходимых для работы с устройством. Приложения обращаются к устройству через интерфейс динамической библиотеки (Рисунок 2).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Win 32 application |
|
|
|
|
|
Win 32 application |
|
|
|
Win 32 application |
|
|
|
|
Win 32 application |
|
|
||
|
|
Приложение |
|
|
|
|
|
Приложение |
|
|
|
|
Win32 |
|
|
|
|
|
Win16 |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
32-битовая DLL |
|
16-битовая DLL |
|
|
|
Кольцо 3
Кольцо 0
Виртуальное устройство (VxD)
Рисунок 2. DLL обеспечивает интерфейс VxD и пользовательских приложений.
Windows поддерживает стандартные интерфейсы для передачи данных между приложениями и виртуальными устройствами. Назначение DLL состоит в том, чтобы скрыть от приложения тонкости системных вызовов VxD и заменить их набором API функций. Например, передача данных и команд из приложения Win32 в VxD производится с помощью функции DeviceIoControl. Динамическая библиотека экспортирует функции с понятными именами, например InitializeDevice, StartDmaTransfer. Эти функции выполняют необходимые подготовительные операции и вызывают DeviceIoControl. Приложение, которое работает с устройством, не опускается до специфики организации передачи данных между нулевым и третьим кольцом защиты операционной системы.
Виртуальные Машины и Менеджер Виртуальных Машин (VMM).
VMM это ядро операционной системы. Он отвечает за управление виртуальными машинами. Каждая виртуальная машина это отдельная задача, которая исполняется в вычислительной системе. Виртуальная машина содержит код и данные приложений. С точки зрения приложения виртуальная машина это отдельный компьютер со всеми ресурсами необходимыми для работы приложения. Системная виртуальная машина содержит все 32-х и 16-ти разрядные приложения Windows. Дополнительно создаваемые виртуальные машины V86 предназначены для исполнения программ MSDOS.
103
|
Системная Виртуальная Машина |
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Приложение |
|
|
|
ВиртуальVirtual 86 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
Win16 |
|
|
|
|
|
||||
|
|
|
|
Win 32 |
|
|
|
|
|
|
|||||||
|
|
|
|
Win 32 |
|
|
|
|
|
|
|
Virtual 86 |
|
|
|||
|
|
|
Приложение |
|
|
|
|
|
|
|
|
наяMachine |
|
|
|||
|
|
|
|
application |
|
|
|
Приложение |
|
|
|
|
Machine |
|
|
||
|
|
|
application |
|
|
|
|
|
|
|
|
|
|||||
|
|
|
Win32 |
|
|
|
Win16 |
|
|
|
машина |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
V86 |
|
|
||
|
|
|
|
|
|
|
|
Приложение |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Win16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Модуль управления вирт. машинами VMM
Рисунок 3. Виртуальные машины.
VMM это 32-х разрядный модуль ОС который работает в плоской модели памяти. VMM размещается в сегментах размером 4ГБ. Селекторы этих сегментов располагаются в Глобальной дескрипторной таблице (GDT). Верхний гигабайт виртуальной памяти защищён от пользовательских программ. Кроме того, это общая память, которая одинаково отображается в физические адреса для всех процессов. В этой памяти размещается код и данные VMM и виртуальных устройств. Основные функции VMM следующие:
Управление виртуальной памятью.
Windows 95 использует механизм загрузки страниц по запросу (demand-paging). Часть кода и данных программ размещается на диске и загружается в память непосредственно при обращении. Процесс загрузки страниц скрыт от приложений и выполняется менеджером виртуальных машин. VMM создаёт для каждого процесса частное виртуальное адресное пространство размером примерно 2ГБ и управляет операцией трансляции виртуальных адресов в физические.
Переключение потоков
VMM содержит диспетчер потоков (scheduler) - системный модуль, который отвечает за разделение процессорного времени между потоками. Windows 95 использует механизм вытесняющей мультизадачности в котором переключение потоков происходит не зависимо от пользовательских программ. Диспетчер определяет момент переключения потоков, основываясь на приоритетах и текущем состоянии потоков.
Поддержка интерфейса с программами MS-DOS.
Каждое приложение MS-DOS запускается в отдельной виртуальной машине V86. VMM обеспечивает программам MS-DOS доступ к ресурсам ядра операционной системы. Например, VMM транслирует запросы аппаратных прерываний в виртуальные машины V86 и управляет отображением виртуальных адресов в диапазоне первого мегабайта памяти, который используется MS-DOS. VMM также отвечает за организацию интерфейса виртуальных устройств с приложениями Windows и DOS.
Стандартные виртуальные устройства.
VMM работает во взаимодействии с различными виртуальными устройствами, которые выполняют функции управления отдельными аппаратными устройствами и программными ресурсами вычислительной системы. Например, упомянутый выше VPICD.VxD это драйвер программируемого контроллера прерываний. Он предоставляет системный интерфейс для управления этим аппаратным устройством, включая функции инициализации контроллера и установки процедур обработчиков аппаратных прерываний. Некоторые стандартные VxD не связаны с какой либо аппаратурой. Они предназначены для управления программными ресурсами операционной системы. Например, виртуальное устройство Shell используется (помимо прочего) для организации интерфейса между виртуальными устройствами и пользовательскими приложениями Windows. В таблице приводятся вместе с кратким описанием некоторые стандартные виртуальные устройства.
104
Виртуальный контроллер ПДП |
VDMAD |
контроллер ПДП. |
|
|
|
|
||||
Виртуальный |
контроллер |
VPICD |
контроллер прерываний. |
|
|
|
||||
прерываний |
|
|
|
|
|
|
|
|
|
|
Виртуальный |
менеджер |
V86MMGR |
размещение памяти для машин V86 |
|||||||
режима V86. |
|
|
и |
организация |
вызовов |
из |
||||
|
|
|
защизённого |
режима |
|
функций |
||||
|
|
|
машины V86. |
|
|
|
|
|
||
Загрузчик VxD |
|
VXDLDR |
Функции |
загрузки |
и |
выгрузки |
||||
|
|
|
динамически загружаемых VxD. |
|
||||||
Виртуальный сопроцессор |
VMCPD |
Обеспечивает |
совместный |
доступ |
к |
|||||
|
|
|
сопроцессору из нескольких задач. |
|
||||||
Виртуальное устройство Shell |
SHELL |
Используется для связи VxD и |
||||||||
|
|
|
пользовательских |
|
приложений, |
|||||
|
|
|
Содержит |
функции |
|
посылки |
||||
|
|
|
сообщений |
окнам |
приложений, |
|||||
|
|
|
отображения сообщений на экране и |
|||||||
|
|
|
др. |
|
|
|
|
|
|
|
VWin 32 |
|
VWIN32 |
Набор |
функций |
для |
поддержки |
||||
|
|
|
асинхронного и синхронного обмена |
|||||||
|
|
|
данных между VxD и приложениями |
|||||||
|
|
|
Win32 |
|
|
|
|
|
|
|
Виртуальный таймер |
VTD |
Системный таймер |
|
|
|
|
Программная архитектура виртуальных устройств.
Для проектирования виртуальных устройств Windows 95 используется язык ассемблера и частично Cи. Ассемблерная часть может быть небольшим стандартным текстом, при этом основная часть проекта VxD пишется на языке Си. Правила и особенности проектирования VxD на языке Си в среде Microsoft Visual C будут рассмотрены позднее. Первые примеры текстов приводятся на языке ассемблер. Для компиляции программ следует использовать MASM. Кроме собственно компилятора и компоновщика для создания VxD требуются дополнительные средства: заголовочные файлы и библиотеки входящие в состав Microsoft Device Driver Kit (Windows 95 DDK). В состав DDK входят заголовочные файлы для ассемблера (.inc) и Си (.h). Эти файлы содержат заголовки функций, объявления констант, макроопределений и типов, необходимых для компиляции VxD. Следует отметить, что текст виртуального устройства содержит много макроопределений, что делает его несколько не похожим на обычную ассемблерную программу. Можно сказать, что VxD частично пишется на ассемблере, и частично на некотором «системном» языке, содержащем операторы, построенные на основе макроопределений.
Сегменты виртуальных устройств.
Код и данные VxD могут располагаться в нескольких секциях, которые называются сегментами. К этим сегментам относятся:
Сегмент кода защищённого режима. Наличие этого сегмента обязательно. В этом сегменте размещается код. В сегменте располагается одна или несколько так называемых точек входа. Точки входа это функции, которые обеспечивают интерфейс виртуального устройства с внешним миром. Операционная система имеет возможность определить адреса этих функций и вызывать их. Начало сегмента в тексте программы объявляется директивой VXD_CODE_SEG, конец директивой VXD_CODE_ENDS.
Сегмент данных защищённого режима. Сегмент содержит глобальные данные виртуального устройства. Сегмент объявляется директивами VXD_DATA_SEG и VXD_DATA_ENDS.
Сегмент кода инициализации защищённого режима. Сегмент уничтожается сразу после загрузки виртуального устройства. Код, размещаемый в этом сегменте доступен только в процессе загрузки VxD. В сегменте размещается код инициализации устройства, который не требуется после его загрузки. Сегмент объявляется директивами
VXD_ICODE_SEG и VXD_ICODE_ENDS.
Сегмент данных инициализации защищённого режима. Сегмент используется для размещения данных которые требуются только при загрузке для инициализации. После
105
загрузки сегмент уничтожается. Сегмент объявляется директивами VXD_IDATA_SEG и VXD_IDATA_ENDS.
Защёлкнутый сегмент кода защищённого режима. Код этого сегмента всегда располагается в оперативной памяти. В сегменте размещаются обработчики аппаратных прерываний и другой код критичный ко времени исполнения. Сегмент начинается директивой VXD_LOCKED_CODE_SEG и заканчивается директивой
VXD_LOCKED_CODE_ENDS.
Защелкнутый сегмент данных защищённого режима. Сегмент используется для хранения данных критичных ко времени доступа. Данные этого сегмента всегда располагаются в оперативной памяти и не могут быть выгружены на диск. Сегмент объявляется директивами VXD_LOCKED_DATA_SEG и VXD_LOCKED_DATA_ENDS.
Сегмент инициализации реального режима. Сегмент содержит код реального режима и данные. В сегменте должна находиться процедура, которая вызывается при загрузке виртуального устройства, ещё до переключения системы в защищённый режим. Этот сегмент используется в статических виртуальных устройствах, которые загружаются при запуске операционной системы. Начало и конец сегмента объявляются директивами VXD_REAL_INIT_SEG и VXD_REAL_INIT_ENDS.
Блок описания виртуального устройства.
Каждое VxD имеет блок описания устройства - device description block (DDB). DDB это структура данных которая содержит важные сведения об устройстве: имя, идентификатор, адреса процедур точек входа и т.п. Тип этой структуры объявлен в файле vmm.inc(h). Некоторые поля этой структуры должны быть заданы в тексте виртуального устройства. Для этой операции используется макроопределение
Declare_Virtual_Device.
Declare_Virtual_Device |
<Имя>, <Старшая версия>,<Младшая версия>, |
\ |
<Процедура обработки команд>, <Идентификатор устройства >, \ |
|
|
<Порядок загрузки>, |
\ |
|
< Обработчик API V86>, <Обработчик API защищённого режима> |
|
Имя задаёт имя VxD. Имя, как правило совпадает с именем файла.
Старшая и младшая версии определяют номер версии VxD. Например, если старшая версия равна 1 а младшая равна 0, полная версия определяется как 1.0.
Процедура обработки команд (Device control procedure) адрес системной точки входа виртуального устройства. Система вызывает эту процедуру для передачи устройству команд. Интерфейс этой функции описывается ниже.
Идентификатор устройства (Device ID) уникальный идентификатор виртуального устройства. Если виртуальное устройство статическое (загружается при запуске операционной системы) или если оно предоставляет свои функции другим VxD или приложениям MS-DOS и Win16, наличие уникального идентификационного номера обязательно. Этот номер выделяется компанией Microsoft по запросу. Нумерация предназначена для предотвращения конфликтов при обращении к устройствам. Если идентификатор не требуется, он может быть задан константой
UNDEFINED_DEVICE_ID. Эта константа объявлена в файле vmm.inc(h).
Порядок загрузки определяет, в какой последовательности система загружает драйвер при запуске. Это двойное слово, которое указывается, в случае если виртуальное устройство должно быть загружено до или после каких либо других виртуальных устройств. Например, если устройство использует контроллер ПДП и инициализирует при загрузке какие либо внутренние структуры, связанные с этим контроллером, его порядок загрузки должен быть численно больше аналогичного параметра виртуального устройства VDMAD. Устройства численно меньшим значением этого параметра загружаются в первую очередь. VMM имеет порядок загрузки равный 0, следовательно он загружается первым при запуске операционной системы. В следующей таблице приводятся порядки загрузки некоторых виртуальных устройств.
Менеджер виртуальных машин |
VMM |
00000000H |
106
Программируемый |
контроллер |
VPICD |
0C000000H |
прерываний |
|
|
|
Системный таймер |
|
VTD |
14000000H |
Загрузчик VxD |
|
VXDLDR |
16000000H |
Нумератор |
|
ENUMERATOR |
16800000H |
Клавиатура |
|
VKD |
38000000H |
Контроллер ПДП |
|
VDMAD |
90000000H |
Shell |
|
SHELL |
B0000000H |
Виртуальное устройство Shell загружается в последнюю очередь. Если порядок загрузки устройства не важен, он может быть пропущен в тексте директивы
Declare_Virual_Device. По умолчанию этот параметр равен UNDEFINED_INIT_ORDER = 80000000H. Эта константа объявлена в файле vmm.inc(h).
Порядок загрузки имеет смысл только для статически загружаемых виртуальных устройств.
Обработчик API V86 адрес точки входа для приложений V86. Эта процедура вызывается системой при обращении к виртуальному устройству из программ MS-DOS.
Обработчик API защищённого режима адрес точки входа для 16-ти разрядных приложений Windows. Эта процедура вызывается системой при обращении к виртуальному устройству из приложений Win16.
Пример объявления блока описания виртуального устройства:
MYVXD_ID EQU 7FEDH
MYVXD_INIT_ORDER EQU 78000000H
Declare_Virtual_Device MYVXD, 1, 0, ControlDispatch, \
MYVXD_ID, MYVXD_INIT_ORDER, \
V86Handler, PMHandler
В этом примере заданы все аргументы макроопределения. Обратная косая черта «\» используется для переноса макроопределения на следующую строку. Если некоторые свойства VxD не используются или задаются по умолчанию, они пропускаются в макроопределении.
Declare_Virtual_Device MYVXD, 1, 0, OFFSET32 ControlDispatch, , , ,
В этом примере блок устройства объявляется с UNDEFINED_DEVICE_ID и UNDEFINED_INIT_ORDER. Кроме того устройство не имеет обработчиков API функций для программ Win16 и MS-DOS.
Процедура обработки команд (Device control procedure).
Эта процедура является системной точкой входа виртуального устройства. Система взаимодействует с VxD, вызывая процедуру обработки команд. Процедура должна обязательно присутствовать в тексте виртуального устройства и её адрес должен быть указан в блоке описания. Система вызывает процедуру для передачи устройству сообщений о некоторых системных событиях. Процедура обработки команд имеет стандартный интерфейс. Этот интерфейс позволяет передать устройству код сообщения вместе с дополнительными параметрами и получить результаты обработки сообщения. Система всегда предаёт код сообщения в регистре Eax и ссылку на виртуальную машину, из которой происходит вызов процедуры в регистре Ebx. Обработчик сообщения, как правило, возвращает результат обработки, устанавливая флаг переноса (инструкция stc) в случае ошибки и сбрасывая его (инструкция clc) в случае нормального завершения. Как правило, процедура обработки команд состоит из оператора switch, в котором проверяется код сообщение и делаются вызовы процедур обработчиков сообщений. В файле vmm.inc(h) объявлены макроопределения
Begin_Control_Dispatch, End_Control_Dispatch и Control_Dispatch, которые могут быть использованы для этой операции:
Begin_Control_Dispatch |
VSAMPLED |
Control_Dispatch |
Sys_Critical_Init, VSAMPLED_Crit_Init |
Control_Dispatch |
Device_Init, VSAMPLED_Device_Init |
107