Программирование драйверов Windows

       

Отличия между версиями


Отличия версий Windows 2000 (NT 5.0), XP (NT 5.1) и Server 2003 (NT 5.2), разумеется, существуют. И касаются они не только пользовательского интерфейса и наполнения сервисными программами, но и наборов системных вызовов, предоставляемых в режиме ядра. Тем, кого интересует большее количество деталей, нежели будет представлено далее, можно порекомендовать три статьи, размещенные сегодня в Интернете:

  • статья Марка Руссиновича и Дэвида Соломона "Windows XP: Kernel Improvements Create a More Robust, Powerful, and Scalable OS", размещенная на сайте Microsoft по адресу msdn.microsoft.com/msdnmag/issues/01/12/XPKernel/default.aspx;
  • статья Марка Валла и Роберта Вильямса "Windows .NET Structure and Architecture", размещенной в Интернет-журнале "Network Windows & .NET Magazine" по адресу windowsitlibrary.com/Content/717/02/toc.html;
  • статья "Compare the Editions of Windows Server 2003" (Standard, Enterprise, Datacenter & Web Edition), размещенная на Интернет-сайте Microsoft по адресу microsoft.com/windowsserver2003/evaluation/features/compareeditions.mspx.
  • Не вдаваясь в подробности, отметим наиболее важные для разработчика драйверов отличия. Прежде всего, следует различать 32 и 64-разрядные клоны. Если 64 разрядная Windows 2000 была собрана лишь один раз в тестовом режиме, то Windows XP (и уж тем более, Server 2003) в 64-разрядной сборке представляет собой реальный коммерческий продукт. Организация адресного пространства памяти в 64 разрядной версии сильно отличается от организации виртуального пространства в 32-разрядном исполнении (таблица 7.1). Приложения, созданные как 32-разрядные программы, запускаются под управлением подсистемы Win32 в рамках модели WOW (Windows On Windows 64), аналогично тому, как 16-разрядные приложения работают в 32-разрядной среде.

    Драйвер в 64 разрядной версии компилируется как 64-разрядный код — в частности, с соответствующей длиной указателей. В данной ситуации драйверу актуально знать, от какого приложения он получил запрос — от нового 64-разрядного или старого 32-разрядного.
    Эта проблема не представляет большого затруднения, поскольку 64-разрядный драйвер может выяснить тип вызывающего процесса при помощи системной функции IoIs32bitProcess, доступной для применения в 64-разрядных сборках драйверов. Пример приводится ниже.

    if( IoIs32bitProcess(Irp) == TRUE ) { #if DBG DbgPrint("IRP request is made by 32 bit process."); #endif } else { #if DBG DbgPrint("IRP request is made NOT by 32 bit process."); #endif }

    В соответствии с ответом драйвер может скорректировать некоторые свои операции.

    С какой конкретно версией операционной системы драйвер имеет дело, можно легко определить по тому, какую версию модели WDM поддерживает система. Это можно узнать с помощью системного вызова IoIsWdmVersionAvailable, например:

    if (IoIsWdmVersionAvailable(l, 0x30)) { // Windows Server 2003 } else if (IoIsWdmVersionAvailable(l, 0x20)) { // Windows XP } else if (IoIsWdmVersionAvailable(l, 0x10)) { // Windows 2000 } else if (IoIsWdmVersionAvailable(l, 0x05)) { // Windows Me } else { // Windows 98 }

    Тем не менее, пока что широкое использование в России дорогих 64-разрядных конфигураций не предвидится, что можно с некоторой степенью уверенности констатировать на основании неширокого применения в прошлом и настоящем относительно "продвинутых" процессоров XEON.



    Сосредоточим внимание на 32-разрядных версиях. Среди них произошли следующие изменения.

    При переходе от Windows 2000 к Windows XP переписан загрузчик NTLDR (см. Приложение Б), в результате чего процесс загрузки ускорился в 4-5 раз.

    Модуль NTOSKRNL.EXE Windows 2000 экспортировал 1129 функций (большинство из которых &#8212 системные вызовы, доступные из драйверов режима ядра), Windows XP экспортирует 1464, a Windows Server 2003 &#8212 уже 1525.

    Модуль HAL.DLL экспортирует, соответственно, 95, 92 и 92 вызова. Причем, по косвенным признакам заметно, что от версии 2000 к XP его постигла значительная переработка, а от версии XP к Server 2003 &#8212 лишь процесс "шлифовки".



    Пополнение системных вызовов в Server 2003 произошло, в основном, за счет вызовов с суффиксом Ex, то есть функций в чем-то расширяющих существующие системные вызовы Windows XP. Например, IoCsqInitializeEx получился из вызова IoCsqInitialize.

    При переходе от Windows 2000 к Windows XP были смягчены многие ограничения на предельные размеры.

    Операционная система Windows 2000 ограничивала общий размер адресного пространства под драйверами 220 Мбайтами, в XP этот предел отодвинут до 960. Таким же он остался и в 32 разрядной версии Server 2003.

    Предельный общий размер файлов Системного Реестра Windows XP жестко не фиксирован, в то время как в Windows 2000 он не должен был превышать 376 Мбайт. Увеличен размер системных страничных таблиц, в результате чего системное виртуальное адресное пространство увеличилось до 1.3 Гбайт &#8212 против 660 Мбайт в Windows 2000. При этом 960 Мбайт в системном виртуальном адресном пространстве XP непрерывны, в других же его "местах" имеются разрывы. (Заметим, что 64 разрядная версия поддерживает размер виртуального системного адресного пространства равный 128 Гбайт.) Весьма вероятно, что такие же параметры остались и у Windows Server 2003 (точные сведения отсутствуют).

    Поскольку, страничные таблицы и большая часть Системного Реестра размещаются в физической памяти резидентно, очевидно, что цена такого "послабления" &#8212 новое повышение требований к минимальному размеру установленной на компьютере оперативной памяти &#8212 до 128 Мбайт.

    Увеличено число процессоров, которые может поддерживать операционная система в симметричной многопроцессорной конфигурации (SMP). В редакции Datacenter Windows Server 2003 может поддерживать до 64 процессоров (в 64 разрядной версии). 32-разрядная версия (как и Datacenter Windows 2000) поддерживает по-прежнему до 32 процессоров. Разумеется, такая архитектура обязана быть должным протестирована, и Microsoft анонсировала особый подход к продажам таких "тяжелых" серверов: операционная система будет поставляться только вместе с аппаратурой OEM поставщиками.



    И, наконец, самые интересный вопрос: что же означают громадные цифры поддерживаемой оперативной памяти в 32-разрядных версиях: от 2 Гбайт (редакция Web Windows Server 2003) до 64 Гбайт (редакция Datacenter Windows Server 2003)?

    Ответ кроется в двух аббревиатурах: AWE и РАЕ, Address Windowing Extension и Physical Address Extension, соответственно. Операционная система, подчиняясь параметру /РАЕ, заданному в файле boot.ini (см. Приложение Б), загружается в модифицированной конфигурации, поддерживающей режим работы РАЕ. В таком режиме возможна манипуляция физическими адресами оперативной памяти (тип PHYSICAL_ADDRESS) за пределами 4 Гбайтного пространства функциями категории MmAllocatePagesForMdl. Наиболее простое и находящееся "на поверхности" применение данного расширения &#8212 создание драйверов, реализующих RAM диск. Правда, осложняет дело высокая цена оборудования. На сегодня доля материнских плат, поддерживающих размер оперативной памяти более 8 Гбайт, не превышает 1,5% рынка.

    В заключение отметим еще два факта.

    Во-первых, по-прежнему все рассмотренные версии продолжают поддерживать все три файловых системы: FAT, FAT32, NTFS. Иными словами, Windows Server 2003 Datacenter Edition вполне устанавливается на логическом диске FAT32, занимая при этом чуть более 1,3 Гбайт.

    Во-вторых, Microsoft окончательно (в Windows Server 2003) отошла от поддержки подсистем POSIX и OS/2.

    Впрочем, осталось неизменным самое важное &#8212 драйверная модель, заложенная в Windows 2000, обеспечивает практически полную совместимость программного кода (а иногда &#8212 и бинарного, как можно было убедиться на примере главы 3) во всех рассматриваемых версиях.


    Содержание раздела