netlib.narod.ru< Назад | Оглавление | Далее >

Базовые концепции и термины

В книге будут часто встречаться ссылки на концепции и структуры, с которыми некоторые читатели, возможно, не знакомы. Здесь мы приведем определения терминов, которые будем использовать в дальнейшем. Вы должны ознакомиться с ними, перед тем, как переходить к чтению остальной части книги.

Win32 API

Интерфейс программмирования приложений (API) Win32 — это основной интерфейс программирования в семействе операционных систем Microsoft Windows, включая Windows 2000, Windows 95, Windows 98, Windows Millennium Edition и Windows CE. Хотя в этой книге и нет описания Win32 API, мы исследуем внутреннее поведение и реализацию его ключевых функций. Исчерпывающее руководство по программированию с использованием Win32 API, можно найти в книге Джеффри Рихтера «Программирование приложений для Microsoft Windows» (четвертое издание, Microsoft Press, 1999).

Каждая из операционных систем реализует собственное подмножество Win32. Windows 2000 по большей части представляет собой надмножество всех реализаций Win32. Специфика реализации Win32 API на конкретной платформе описывается в справочной документации. Эта документация доступна для просмотра на сайте msdn.microsoft.com и на компакт-дисках MSDN Library. Та же информация содержится в файле \Program Files\Microsoft Platform SDK\Lib\Win32api.csv, который копируется при установке Platform SDK. Последний можно плоучить как часть MSDN Professional или бесплатно загрузить с сайта msdn.microsoft.com. (См. раздел «Platform Software Development Kit (SDK)» далее в этой главе.)

ПРИМЕЧАНИЕ
MSDN — это аббревиатура от Microsoft Developer Network. Так называется программа технической поддержки разработчиков Microsoft. MSDN предусматривает три уровня подписки: MSDN Library, Professional и Universal. Содержимое MSDN Library также свободно доступно на Web-сайте MSDN. За дополнительной информацией обращайтесь на msdn.microsoft.com.

В этой книге под Win32 API подразумевается базовый набор функций, предназначенных для поддержки процессов, потоков, управления памятью, безопасности, ввода/вывода, работы с окнами и графикой. Win32 API является частью Platform SDK. Внутреннее устройство других важных частей Platform SDK, таких как транзакции, работа с базами данных, коммуникации, мультимедиа и сетевые сервисы, в этой книге не рассматривается.

Хотя Windows 2000 рассчитана на поддержку множества разнообразных интерфейсов программирования, Win32 является для этой операционной системы основным и предпочтительным. Он занимает эту позицию потому, что из трех подсистем окружения (Win32, POSIX и OS/2), именно Win32 предоставляет наиболее полный доступ к нижележащим системным сервисам Windows 2000. Как мы узнаем в главе 2, прикладные программы в Windows 2000 не вызывают внутренние системные сервисы напрямую, а должны использовать для этой цели один из предоставляемых подсистемами окружения API.

Сервисы, функции и процедуры

Несколько терминов в предназначенной для пользователей и программистов документации Windows 2000 имеют различный смысл в разных контекстах. Например, слово сервис (service) может относиться к вызываемой функции операционной системы, драйверу устройства или серверному процессу (в последнем случае часто используется термин «служба»). Ниже показано, какой смысл вкладывается в подобные термины в этой книге:

Процессы, потоки и задания

Хотя на первый взгляд кажется, что программа и процесс — понятия практически одинаковые, они фундаментально отличаются друг от друга. Программа представляет собой статический набор команд, а процесс — это контейнер для набора ресурсов, используемых потоками, которые выполняют экземпляр программы. На верхнем уровне абстракции процесс в Windows 2000 включает в себя следующее:

Поток (thread) — это сущность внутри процесса, которой в Windows 2000 выделяется процессорное время для работы. Без этого программа процесса не может выполняться. Поток включает следующие основные элементы:

Изменяемые регистры, стеки и закрытые области памяти называются контекстом потока. Поскольку эта информация различна на каждой аппаратной платформе, на которой может работать Windows 2000, соответствующая структура данных зависит от архитектуры системы. Фактически, структура CONTEXT возвращаемая функцией Win32 GetThreadContext, является единственной открытой структурой данных в Win32 API, зависящей от аппаратной платформы.

Хотя потоки обладают собственным контекстом выполнения, все потоки одного процесса совместно используют его виртуальное адресное пространство (а также остальные принадлежащие процессу ресурсы). Это означает, что все потоки в процессе могут записывать и считывать содержимое памяти любого из потоков того же процесса. Потоки не могут ссылаться на адресное пространство другого процесса, пока другой процесс не сделает доступной часть своего закрытого адресного пространства в виде области разделяемой памяти (shared memory section), называемой в Win32 API объектом проекции файла (file mapping object), или пока один процесс не откроет другой и воспользуется функциями ReadProcessMemory и WriteProcessMemory.

Кроме закрытого адресного пространства и одного или нескольких потоков у каждого процесса имеется идентификация защиты и список отккрытых дескрипторов таких объектов, как файлы, области разделяемой памяти, или объектов синхронизации, таких как мьютексы, события и семафоры (рис. 1.1).


Рис. 1.1. Процесс и его ресурсы

Рис. 1.1. Процесс и его ресурсы


Каждый процесс обладает контекстом защиты, который хранится в объекте, называемом маркер доступа (access token). Маркер доступа процесса содержит идентификатор системы безопасности и полномочия данного процесса. По умолчанию потоки не имеют собственных маркеров доступа, но они могут получить его, что позволит отдельному потоку подменять контекст защиты другого процесса (в том числе процесса, выполняемого в удаленной системе Windows 2000) не оказывая влияния на другие потоки процесса. (Дополнительные сведения о защите процессов и потоков приведены в главе 8.)

Дескрипторы виртуальных адресов (virtual address descriptors, VAD) — это структуры данных, используемые диспетчером памяти для учета виртуальных адресов, задействованных процессом. Эта структура данных подробно описана в главе 7.

В Windows 2000 введено новое расширение модели процессов, называемое задания (job). Они предназначены в основном для того, чтобы группами процессов можно было оперировать и управлять как единым целым. Объект-задание позволяет устанавливать определенные атрибуты и накладывать ограничения на процесс или процессы, сопоставленные с заданием. В этом объекте также хранится информация обо всех процессах, которые были сопоставлены с заданием, но к настоящему времени уже завершены. В каких-то отношениях объект-задание компенсирует отсутствие иерархического дерева процессов в Windows 2000, а в каких-то — даже превосходит по своим возможностям дерево процессов UNIX.

Более детальное описание внутренней структуры заданий, процессов и потоков, механизмов создания потоков и процессов, а также алгоритмов планирования потоков вы найдете в главе 6.

Виртуальная память

В Windows 2000 реализована система виртуальной памяти, основанная на плоском (линейном) 32-разрядном адресном пространстве, что позволяет манипулировать с 4 Гб виртуальной памяти. На большинстве аппаратных платформ Windows 2000 выделяет нижнюю половину этого пространства (с адресами от 0x00000000 до 0x7FFFFFFF) процессам, а вторую половину (с адресами от 0x80000000 до 0xFFFFFFFF) использует для собственных целей. Проецирование нижней половины изменяется, чтобы отразить виртуальное адресное пространство выполняемого в данный момент процесса, а проецирование верхней половины всегда состоит из виртуальной памяти операционной системы. Windows 2000 Advanced Server и Datacenter Server поддерживают загрузочный параметр /3GB, указываемый в файле Boot.ini. Если такой параметр задан, процессы, выполняющие программы со специальным флагом в заголовке исполняемого образа, получают 3 Гб закрытого адресного пространства, а на долю операционной системы остается только 1 Гб. Этот параметр позволяет приложениям, таким как серверы баз данных, хранить в адресном пространстве своего процесса большие порции базы данных и тем самым уменьшить частоту проецирования отдельных представлений этой базы. Две структуры виртуальных адресных пространств, поддерживаемые Windows 2000, показаны на рис. 1.2.


Рис. 1.2. Структуры адресных пространств

Рис. 1.2. Структуры адресных пространств, поддерживаемые Windows 2000


Хотя три гигабайта лучше двух, этого все равно недостаточно для проецирования очень больших баз данных. В связи с этим в Windows 2000 появился новый механизм, называемый Address Windowing Extensions (AWE), который позволяет 32-разрядному приложению выделять до 64 Гб физической памяти, а затем проецировать представления (views), или окна (windows), на свое 2-гигабайтное виртуальное адресное пространство. Хотя применение AWE возлагает бремя управления проекциями виртуальной памяти на физическую на программиста, оно снимает проблемы, возникающие при необходимости прямого доступа к объему физической памяти, превышающему лимиты 32-разрядного адресного пространства процесса. Более эффективное решение этой проблемы — переход на 64-разрядную версию Windows.

Помните, что виртуальное адресное пространство процесса является набором адресов, доступных потокам этого процесса. Виртуальная память обеспечивает логическое предствавление, которое может не соответствовать физическому распределению памяти. Во время выполнения диспетчер памяти, используя аппаратную поддержку, транслирует, или проецирует (maps), виртуальные адреса в физические, по которым реально хранятся данные. Управляя проецированием и защитой страниц памяти, операционная система гарантирует, что ни один процесс не помешает другому и не сможет повредить данные самой операционной системы. На рис. 1.3 показано, как три смежные страницы виртуальной памяти проецируются на три разрозненные страницы физической памяти.


Рис. 1.3. Проецирование виртуальной памяти на физическую

Рис. 1.3. Проецирование виртуальной памяти на физическую


Поскольку на большинстве компьютеров объем физической памяти намного меньше общего объема виртуальной памяти, задействованной выполняемыми процессами (2 или 3 Гб на каждый процесс), диспетчер памяти перемещает, или подкачивает (pages), часть содержимого памяти на диск. Подкачка данных на диск освобождает физическую память для ее использования другими процессами или операционной системой. Когда поток обращается к странице виртуальной памяти, которая была сброшена на диск, диспетчер виртуальной памяти загружает информацию с диска обратно в память. Для использования преимуществ подкачки в приложениях никакого дополнительного кода не требуется, поскольку аппаратная поддержка позволяет диспетчеру памяти осуществлять подкачку без уведомлений или помощи со стороны процессов или потоков.

Подробнее о реализации диспетчера памяти, в том числе о трансляции адресов и управлении физической памятью в Windows 2000 рассказывается в главе 7.

Режим ядра и пользовательский режим

Для предотвращения доступа приложений к критически важным данным операционной системы и устранения риска их модификации Windows 2000 использует два режима доступа к процессору (даже если сам процессор поддерживает более двух режимов): пользовательский режим и режим ядра. Код приложений работает в пользовательском режиме, тогда как код операционной системы (например, системные сервисы и драйверы устройств) работает в режиме ядра. В режиме ядра предоставляется доступ ко всей системной памяти и разрешается выполнять любые машинные команды процессора. Предоставляя операционной системе более высокий уровень привилегий, чем прикладным программам, процессор позволяет разработчикам операционных систем реализовать такие архитектуры, которые не дают возможность неправильно работающим приложениям нарушить стабильность работы всей системы.

ПРИМЕЧАНИЕ
В архитектуре процессора Intel x86 определено четыре уровня привилегий или колец (rings), предназначенных для защиты кода и данных системы от случайной или умышленной перезаписи кодом с меньшим уровнем привилегий. Windows 2000 использует уровень привилегий 0 (или кольцо 0) для режима ядра и уровень привилегий 3 (или кольцо 3) для пользовательского режима. Почему Windows 2000 использует только два уровня? Дело в том, что на некоторых из ранее поддерживавшихся аппаратных платформ (например, Compaq Alpha и Silicon Graphics MIPS) реализовано лишь два уровня привилегий.

Хотя каждый Win32-процесс имеет собственное закрытое адресное пространство, код операционной системы и драйверы устройств, работающие в режиме ядра, делят единое виртуальное адресное пространство. Каждая страница в виртуальной памяти помечается тегом, определяющим, в каком режиме должен работать процессор для чтения и/или записи данной страницы. Страницы в системном пространстве доступны лишь в режиме ядра, а все страницы в пользовательском адресном пространстве — в пользовательском режиме. Страницы только для чтения (например, содержащие лишь исполняемый код) недоступны для записи независимо от режима.

Windows 2000 не предусматривает никакой защиты системной памяти от компонентов, работающих в режиме ядра. Другими словами, код операционной системы и драйверов устройств в режиме ядра получает полный доступ к системной памяти и может обходить средства защиты Windows 2000 для обращения к любым объектам. Поскольку основная часть кода Windows 2000 выполняется в режиме ядра, крайне важно, чтобы компоненты, работающие в этом режиме, были тщательно спроектированы и протестированы, чтобы гарантировать, что они не нарушат безопасность системы.

Это также подчеркивает, насколько надо быть осторожным при загрузке драйвера от стороннего поставщика: перейдя в режим ядра, он получит полный доступ ко всем данным операционной системы. Такая уязвимость стала одной из причин, по которым в Windows 2000 введен механизм проверки цифровых подписей драйверов, предупреждающий пользователя о попытке установки неавторизованного (неподписанного) драйвера (более подробно эта тема обсуждается в главе 9). Кроме того, механизм названный Driver Verifier помогает разработчикам находить ошибки в драйверах (например, утечки памяти). Driver Verifier исследуется в главе 7.

Как вы увидите в главе 2, прикладные программы могут переключаться из пользовательского режима в режим ядра путем вызова системных сервисов. Например, функции Win32 ReadFile в процеесе своего выполнения приходится вызывать внутреннюю подпрограмму Windows 2000, которая и выполняет действительное чтение данных из файла. Так как эта процедура обращается к внутрисистемным структурам данных, она должна выполняться в режиме ядра. Переключение из пользовательского режима в режим ядра выполняется специальной командой процессора. Операционная система перехватывает эту команду, обнаруживает запрос системного сервиса, проверяет аргументы, которые поток передал системной функции, и выполняет внутреннюю подпрограмму. Перед возвратом управления пользовательскому потоку процессор переключается обратно в пользовательский режим. Благодаря этому операционная система защищает себя и свои данные от возможной модификации пользовательскими процессами.

ПРИМЕЧАНИЕ
Переключение из пользовательского режима в режим ядра (и обратно) не влияет на планирование потока, так как контекст в этом случае не переключается. Дополнительные сведения о диспетчеризации системных сервисов содержатся в главе 3.

Так что ситуация, когда пользовательский поток часть своего времени работает в пользовательском режиме, а часть — в режиме ядра, совершенно нормальна. А поскольку подсистема, отвечающая за поддержку графики и окон, функционирует в режиме ядра, то приложения, интенсивно работающие с графикой, большую часть времени действуют в режиме ядра, а не в пользовательском режиме. Самый простой способ проверить это — запустить приложение вроде Microsoft Paint или Microsoft Pinball и с помощью одного из счетчиков оснастки Performance (Производительность), перечисленных в таблице 1.1, понаблюдать за показателями времени работы в пользовательском режиме и в режиме ядра.


Таблица 1.1. Счетчики, позволяющие контролировать время работы в различных режимах


Объект: счетчик Описание

Processor: % Privileged Time
(Процессор: % работы в привилегированном режиме)
Процентная доля времени, в течение которого отдельный процессор (или все процессоры) работал в режиме ядра
Processor: % User Time
(Процессор: % работы в пользовательском режиме)
Процентная доля времени, в течение которого отдельный процессор (или все процессоры) работал в пользовательском режиме
Process: % Privileged Time
(Процесс: % работы в привилегированном режиме)
Процентная доля времени, в течение которого потоки данного процесса выполнялись в режиме ядра
Process: % User Time
(Процесс: % работы в пользовательском режиме)
Процентная доля времени, в течение которого потоки данного процесса выполнялись в пользовательском режиме
Thread: % Privileged Time
(Поток: % работы в привилегированном режиме)
Процентная доля времени, в течение которого данный поток выполнялся в режиме ядра
Thread: % User Time
(Поток: % работы в пользовательском режиме)
Процентная доля времени, в течение которого данный поток выполнялся в пользовательском режиме


ЭКСПЕРИМЕНТ
Режим ядра и пользовательский режим

С помощью оснастки Performance вы можете выяснить, сколько времени ваша система работает в режиме ядра и в пользовательском режиме.

  1. Запустите оснастку Performance (Производительность), открыв меню Start (Пуск) и последовательно выбрав команды Programs (Программы), Administrative Tools (Администрирование), Performance (Системный монитор).
  2. Щелкните по расположенной на панели инструментов кнопке Add (Добавить) (на этой кнопке изображен большой знак плюс).
  3. Выберите в списке объект Processor (Процессор), щелкните по счетчику % Privileged Time (% работы в привилегированном режиме) и, удерживая клавишу Ctrl в нажатом состоянии, щелкните по счетчику % User Time (% работы в пользовательском режиме).
  4. Щелкните по кнопке Add (Добавить), а затем — Close (Закрыть).
  5. Быстро подвигайте мышью. При этом вы должны заметить всплеск на линии % Privileged Time (рис. 1.4), который отражает время, затраченное на обслуживание прерываний от мыши, и время, понадобившееся подсистеме поддержки окон на отрисовку графики (эта подсистема, как поясняется в главе 2, работает преимущественно как драйвер устройства в режиме ядра).
  6. Закончив, щелкните по расположенной на панели инструментов кнопке New Counter Set (Новый набор счетчиков) (или просто закройте оснастку).

За той же активностью можно понаблюдать через Task Manager (Диспетчер задач). Просто перейдите в нем на вкладку Performance (Быстродействие), а затем выберите из меню View (Вид) команду Show Kernel Times (Вывод времени ядра). Процент времени работы процессора в пользовательском режиме отражается зеленым цветом, а в режиме ядра — красным.


Рис. 1.4. Оснастка Performance

Рис. 1.4. Оснастка Performance, показывающая как распределяется время работы процессора между пользовательским режимом и режимом ядра


Чтобы увидеть, как сама оснастка Performance использует время в двух режимах, запустите ее снова, но добавьте те же счетчики для объекта Process (Процесс).

  1. Если вы закрыли оснастку Performance, снова запустите ее. (Если она уже работает, откройте новый экран, щелкнув по расположенной на панели инструментов кнопке New Counter Set.)
  2. Щелкните по расположенной на панели инструментов кнопке Add.
  3. Выберите в списке объект Process.
  4. Выберите счетчики % Privileged Time и % User Time.
  5. В списке экземпляров объекта выберите все процессы (кроме процесса _Total).
  6. Щелкните по кнопке Add, а затем — Close.
  7. Быстро подвигайте мышью.
  8. Нажмите комбинацию клавиш Ctrl+H для активизации режима выделения — текущий выбранный счетчик будет выделен белым цветом.
  9. Прокрутите список всех счетчиков в нижней части окна оснастки, чтобы определить процессы, потоки которых выполнялись при перемещении мыши, и обратите внимание на то, в каком режиме они выполнялись — пользовательском или ядра.

Вы должны заметить, как значения счетчиков для процесса оснастки Performance (ищите mmc в колонке Instance (Экземпляр)) резко увеличиваются при перемещении мыши, поскольку код приложения выполняется в пользовательском режиме, а вызываемые им функции Win32 — в режиме ядра. Вы также заметите, что при перемещении мыши увеличивается активность работы в режиме ядра потока процесса csrss. Это поток необработанного ввода (raw input thread) подсистемы Win32, принимающий ввод от клавиатуры и мыши и передающий его процессу, к которому он подключен. (Подробнее о системных потоках рассказано в главе 2.) Наконец, процесс с именем Idle, потоки которого, как вы убедитесь, тратят почти 100% своего времени в режиме ядра, на самом деле не является процессом. Это лжепроцесс, используемый для учета тактов процессора в состоянии простоя. Таким образом, когда Windows 2000 нечего делать, она предается этому занятию в режиме ядра.

Объекты и дескрипторы

В операционной системе Windows 2000 объект — это единственный экземпляр периода выполнения (run-time instance) статически определенного типа объекта. Тип объекта состоит из общесистемного типа данных, функций, оперирующих экземплярами этого типа данных, и набора атрибутов. Если вы пишете Win32-пpилoжeния, вам наверняка знакомы такие объекты, как процесс, поток, файл и событие, — продолжать можно еще долго. Эти объекты базируются на объектах более низкого уровня, создаваемых и управляемых Windows 2000. В Windows 2000 процесс является экземпляром объекта типа «процесс», файл — экземпляром объекта типа «файл» и т.д.

Атрибут объекта (object attribute) — это поле данных в объекте, частично определяющее состояние этого объекта. Например, объект типа «процесс», имеет атрибуты, в число которых входят идентификатор процесса, базовый приоритет и указатель на объект маркера доступа. Методы объекта (средства манипулирования объектами) обычно считывают или изменяют какие-либо атрибуты. Так, метод open процесса мог бы получать идентификатор процесса и возвращать указатель на этот объект.

ПРИМЕЧАНИЕ
Не путайте параметр ObjectAttributes, предоставляемый вызывающей программой при создании объекта через Win32 API или его родные сервисы, с термином «атрибуты объекта», имеющим более общий смысл.

Самое главное различие между объектом и обычной структурой данных заключается в том, что внутренняя структура объекта скрыта. Чтобы получить данные из объекта или записать в него какую-то информацию, вы должны вызвать его сервис. Прямое чтение или изменение данных внутри объекта невозможно. Тем самым реализация объекта отделяется от кода, который просто использует его, а это позволяет менять реализацию объекта, не модифицируя остальной код.

Объекты очень удобны для поддержки четырех важных функций операционной системы:

Не все структуры данных в Windows 2000 являются объектами. В объекты помещаются лишь те данные, которые нужно разделять, защищать, именовать или сделать доступными программам пользовательского режима (через системные сервисы). Структуры, используемые только одним из компонентов операционной системы для поддержки каких-то внутренних функций, к объектам не относятся. Подробнее объекты и их дескрипторы (ссылки на экземпляр объекта) рассматриваются в главе 3.

Безопасность

Windows 2000 поддерживает защиту уровня С2 в соответствии с критериями Trusted Computer System Evaluation Criteria (DoD 5200.28-STD, декабрь 1985 г.) Министерства обороны США. Этот стандарт предусматривает избирательную защиту любых разделяемых системных объектов (файлов, каталогов, процессов, потоков и т.д.), аудит (для учета пользователей и инициируемых ими операций), аутентификацию паролей при регистрации и предотвращение доступа одного из пользователей к неинициализированным ресурсам (например, к свободной памяти или дисковому пространству), освобожденным другим пользователем.

Для Windows NT 4 было официально подтверждено соответствие защите уровня C2, и она включена в список Evaluated Products List правительства США. (Windows 2000 еще проверяется.) Кроме того, Windows NT 4 удовлетворяла критериям Европейской организации ITSEC (IT Security Evaluation Criteria) на уровне защиты FC2/E3 (функциональный уровень C2 и гарантированный уровень Е3, которому обычно соответствуют системы уровня В). Подтверждение правительством рейтинга безопасности операционной системы позволяет ей конкурировать в сферах, требующих повышенной защиты. Разумеется, многим из этих требований должна удовлетворять любая многопользовательская система.

Windows 2000 поддерживает два вида контроля доступа к объектам. Первый из них — управление избирательным доступом (discretionary access control) — является механизмом, который как раз и связывается большинством пользователей Windows 2000 с защитой. Это метод, при котором владельцы объектов (например, файлов или принтеров) разрешают или запрещают доступ к ним для других пользователей. При регистрации пользователь получает набор удостоверений защиты (security credentials), или контекст защиты (security context). Когда он пытается обратиться к объекту, его контекст защиты сверяется со списком управления доступом (access control list, ACL) для данного объекта, чтобы определить, имеет ли он разрешение на выполнение запрошенной операции.

Второй метод — управление привилегированным доступом (privileged access control) — необходим в тех случаях, когда управления избирательным доступом недостаточно. Данный метод гарантирует, что пользователь сможет обратиться к защищенным объектам, даже если их владелец недоступен. Например, если какой-то сотрудник увольняется из компании, администратору нужно получить доступ к файлам, которые могли быть доступны только бывшему сотруднику. В таких случаях Windows 2000 позволяет администратору стать владельцем этих файлов и при необходимости управлять правами доступа к ним.

Защита пронизывает весь интерфейс Win32 API. Подсистема Win32 реализует защиту на основе объектов точно так же, как и сама операционная система. При первой попытке доступа приложения к общему (разделяемому) объекту Win32 проверяет, имеет ли это приложение соответствующие права. Если проверка завершается успешно, подсистема Win32 разрешает приложению доступ.

Win32 реализует защиту для общих объектов, часть из которых построена на основе объектов Windows 2000. К объектам Win32 относятся объекты рабочего стола, меню, окна, файлы, процессы, потоки и ряд синхронизирующих объектов.

Детальное описание защиты в Windows 2000 содержится в главе 8.

Реестр

Если вы работали хоть с какой-нибудь операционной системой Windows, то, вероятно, слышали о реестре или даже просматривали его. Рассказать о внутреннем устройстве Windows 2000, не упоминая реестр, вряд ли возможно, так как это системная база данных с информацией, необходимой для загрузки и конфигурирования системы; в ней содержатся общесистемные параметры, контролирующие работу Windows 2000, база данных системы безопасности и конфигурационные настройки, индивидуальные для каждого пользователя (например, тема оформления рабочего стола).

Кроме того, реестр — это окно, через которое можно заглянуть в динамически собираемые системные данные, чтобы, например, выяснить текущее состояние аппаратной части системы (какие драйверы устройств загружены, какие ресурсы они используют и т.д.) или значения счетчиков производительности Windows 2000. Счетчики производительности, которые на самом деле в реестре не хранятся, доступны через функции реестра. Дополнительную информацию о том, как получить доступ через реестр к данным счетчиков производительности вы найдете в главе 5.

Хотя у многих пользователей и администраторов Windows 2000 никогда не возникает необходимости работать непосредственно с реестром (большую часть параметров можно просматривать или модифицировать с помощью стандартных административных утилит), он все же является источником полезной информации о внутренних структурах данных Windows 2000, так как содержит множество параметров, влияющих на быстродействие и поведение системы. (Будьте крайне осторожны, напрямую изменяя параметры реестра: любые изменения могут отрицательно сказаться на быстродействии или, что гораздо хуже, привести к краху системы.) Ссылки на различные разделы реестра, относящиеся к описываемым компонентам, будут встречаться на протяжении всей книги. Большинство таких разделов находится в ветви HKEY_LOCAL_MACHINE, которую мы сокращенно называем HKLM.

Подробнее о реестре и его внутренней структуре рассказывается в главе 5.

Unicode

Windows 2000 отличается от большинства других операционных систем тем, что в качестве внутреннего формата для хранения и обработки текстовых строк использует Unicode. Unicode — это стандартная кодировка, которая поддерживает многие известные в мире наборы символов и в которой каждый символ представляется 16-битным (двухбайтовым) кодом. (Дополнительные сведения об Unicode вы найдете на сайте www.unicode.org и в документации на компакт-дисках MSDN Library.)

Поскольку многие приложения имеют дело с 8-битными (однобайтовыми) ANSI-символами, функции Win32, принимающие строковые параметры, существуют в двух версиях: для Unicode и для ANSI. Win32 в Windows 95, Windows 98 и Windows Millennium Edition реализует лишь часть Unicode-версий функций Win32, поэтому приложения, рассчитанные на выполнение как в одной из этих операционных систем, так и в Windows 2000, обычно используют ANSI-версии функций. В Windows 2000, если вы вызываете ANSI-версию функции Win32, входные строковые параметры перед обработкой системой преобразуются в Unicode, а выходные — из Unicode в ANSI (перед возвратом приложению). Таким образом при использовании в Windows 2000 устаревшего сервиса или фрагмента кода, написанного в расчете на ANSI-строки, эта операционная система будет вынуждена преобразовывать ANSI-символы в Unicode. Однако Windows 2000 никогда не преобразует данные внутри файлов — решения о том, в какой кодировке хранить текстовую информацию в файлах, принимают лишь сами приложения.

В предыдущих версиях Windows NT ее азиатский и ближневосточный выпуски представляли собой надмножество базовых американского и европейского выпусков, в которые включались дополнительные функции Win32 для обработки более сложных раскладок клавиатур и принципов ввода текста (например, набора текста справа налево). В Windows 2000 все языковые выпуски содержат одинаковые функции Win32. Единая для всех стран двоичная кодовая база Windows 2000 способна поддерживать множество языков за счет простого добавления нужных компонентов языковой поддержки. Используя эти функции Win32, разработчики могут создавать универсальные приложения, способные работать со множеством языков.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz