Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MS Windows. Элементы архитектуры и системное программирование..pdf
Скачиваний:
273
Добавлен:
01.05.2014
Размер:
1.98 Mб
Скачать

Основы проектирования Виртуальных Устройств 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