Реализация объектов в Windows 2000. Подсистемы

окружения

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

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

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

Каждый заголовок объекта содержит поле цены квоты, представляющей собой плату, взимаемую с процесса за открытие объекта. Если файловый объект стоит один пункт, а процесс принадлежит к заданию, у которого есть 10 пунктов квоты, то суммарно все процессы этого задания могут открыть не более 10 файлов. Таким образом, для объектов каждого типа могут реализовываться ограничения на ресурсы.

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

Часто частям исполняющей системы бывает нужно динамически получать на время участки памяти. Для этого исполняющая система содержит два пула [7] в адресном пространстве ядра: для объектов и для динамических структур данных. Один пул является выгружаемым, другой – невыгружаемым (фиксированным в памяти). Объекты, к которым обращения частые, хранятся в невыгружаемом пуле; объекты, к которым обращения редкие (например, ключи реестра; информация, относящаяся к безопасности) хранятся в выгружаемом пуле.

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

Объекты подразделяются на типы. Тип объекта определяется указателем на объект типа (рис. 4.3). Информация о типе объекта включает: название типа; данные о том, может ли поток ждать изменения состояния этого объекта; должен ли объект этого типа храниться в выгружаемом или невыгружаемом пуле. Самой важной частью объекта являются указатели на программы для определенных стандартных операций (open, close, delete). Когда вызывается одна из этих операций, используется указатель на типовой объект, в котором выбирается и выполняется соответствующая процедура.

Имя объекта  
  Каталог, в котором живет объект  
  Информация о защите (кто может использовать объект)  
  Цена квоты (стоимость использования объекта)
Имя типа
Типы доступа
Права доступа
Стоимость квоты
Синхронизируемый
Выгружаемый
Метод Open Метод Close Метод Delete Метод Query name Метод Parse Метод Security

  Список процессов с манипуляторами
  Счетчик ссылок  
  Указатель на объект типа  
Данные, специфические для объекта  

 
 
Рис. 4.3. Структура объекта


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

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

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

Таблица 4.1.

Общие типы объектов исполняющей системы,
управляемые менеджером объектов

Тип объекта Описание типа объекта
Процесс Процесс пользователя
Поток Поток внутри процесса
Семафор Семафор со счетчиком, используемый для синхронизации процессов
Мьютекс Двоичный семафор, используемый для входа в критическую область
Событие Объект синхронизации с перманентным состоянием (сигнализирующий/нет)
Порт Механизм для передачи сообщений между процессами
Таймер Объект, позволяющий потоку спать в течение фиксированного интервала времени
Очередь Объект, используемый для уведомления о завершении асинхронного ввода-вывода
Открытый файл Объект, ассоциированный с открытым файлом
Маркер доступа Описатель защиты для некоторого объекта
Профиль Структура данных, используемая для анализа использования центрального процессора
Секция Структура, используемая для отображения файлов на виртуальное адресное пространство
Ключ Ключ реестра
Каталог объектов Каталог для группирования объектов в менеджере объектов
Символьная ссылка Указатель на другой объект по имени
Устройство Объект устройства ввода-вывода
Драйвер устройства У каждого загруженного драйвера устройства есть свой объект

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

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

Пользователи могут создавать новые объекты или открывать существующие при помощи вызовов Win32: CreateSemaphore и OpenSemaphore, которые являются библиотечными процедурами и в конечном итоге обращаются к настоящим системным вызовам. При успешном выполнении первый вызов создает, а второй открывает объект, создавая в результате 64-разрядную запись в таблице дескрипторов, хранящуюся в таблице дескрипторов процесса в памяти ядра. Пользователю для последующей работы возвращается 32-разрядный индекс, указывающий положение дескриптора в таблице.

64-разрядный элемент таблицы дескрипторов в ядре содержит два 32-разрядных слова. Одно слово содержит 29-разрядный указатель на заголовок объекта. Младшие три разряда используются как флаги (например, указывающие, наследуется ли дескриптор дочерним процессом). Когда указатель используется, эти разряды маскируются. Второе слово содержит 32-разрядную маску прав доступа. Она нужна, потому что проверка разрешений выполняется только в то время, когда объект создается или открывается. Если у процесса есть только разрешение для чтения объекта, тогда все остальные биты маски будут нулями, что дает системе возможность отвергать любую операцию, кроме операции чтения.

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

Поскольку объекты исполняющей системы являются временными (исчезают при выключении компьютера), в начале загрузки системы пространство имен объектов пусто. Во время загрузки различные части исполняющей системы создают каталоги и заполняют их объектами. Например, когда менеджер plug-and-play обнаруживает новые устройства, он создает по объекту для каждого устройства и помещает эти объекты в пространство имен. При загрузке каждого драйвера также создается объект, а его имя добавляется в пространство имен объектов. Обращение к драйверу осуществляется по указателю на его объект. Одним из инструментов просмотра имен объектов является программа winobj (www.sysinternals.com). При запуске она отображает пространство имен объектов, как правило, содержащее каталоги объектов, некоторые из них перечислены в табл. 4.2.

Таблица 4.2

Типичные каталоги пространства имен объектов

Имя каталога Содержание каталога
??[8] Начальное место для поиска устройств MS-DOS, например, С:
Device Все обнаруженные устройства ввода-вывода
Driver Объекты, соответствующие каждому загруженному драйверу устройства
ObjectTypes Объекты типов
Windows Объекты для отправки сообщений всем окнам
BaseNamedObjs Объекты, создаваемые пользователем, такие как семафоры, мьютексы и др.
Arcname Имена разделов, обнаруженные загрузчиком
NLS Объекты языковой поддержки
FileSystem Объекты драйверов файловой системы и объекты распознавателя файловой системы
Security Объекты системы безопасности
KnownDLLs Совместно используемые библиотеки, находящиеся в открытом состоянии

Операционная система Windows 2000 состоит из компонентов, работающих в режиме ядра, и компонентов, работающих в режиме пользователя: динамических библиотек DLL, подсистемы окружения и служебных процессов. Эти компоненты работают вместе, предоставляя каждому пользовательскому процессу интерфейс, отличный от интерфейса системных вызовов Windows 2000.

Операционной системой Windows 2000 поддерживаются три различных документированных интерфейса прикладного программирования API: Win32, POSIX и OS /2. У каждого из них имеется список библиотечных вызовов. Работа библиотек DLL (Dynamic Link Library, динамически подключаемая библиотека) и подсистем окружения заключается в том, чтобы реализовать функциональные возможности интерфейса и скрыть истинный интерфейс системных вызовов от прикладных программ.

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

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

Для реализации интерфейса Win32 в каталоге \ winnt \ system32 содержится более 800 отдельных файлов DLL общим объемом в 130 Мбайт. Количество содержащихся в них вызовов API превышает 13000. Некоторые наиболее важные файлы динамических библиотек перечислены в табл. 4.3.

Таблица 4.3

Ключевые файлы Windows 2000 и их режим работы

Файл Режим работы Количество функций Содержание
hal.dll ядра   Низкоуровневое управление аппаратурой, например, портами ввода-вывода
ntoskrnl.exe ядра   Операционная система Windows 2000 (ядро + исполняющая система)
win32k.sys ядра - Множество системных вызовов, включая большую часть графики
ntdll.dll ядра   Диспетчер перехода из режима пользователя в режим ядра
csrss.exe пользователя   Процесс подсистемы окружения Win32
kernel32.dll пользователя   Большая часть системных вызовов ядра (неграфических)
gdi32.dll пользователя   Шрифт, текст, цвет, кисть, перо, палитра, растровые изображения, рисование и т.д.
user32.dll пользователя   Окна, значки, меню, курсоры, диалоговые окна, буфер обмена и т.д.
advapi32.dll пользователя   Защита, шифрование, реестр

Для каждого файла приведено количество экспортируемых функций (видимых за пределами файла), этот параметр со временем изменяется. 1209 вызовов, экспортируемых из файла ntoskrnl.exe, являются функциями, доступными для драйверов устройств и других программ, связанных с ядром. Список экспортируемых функций в любом файле. ехе или. dll можно просмотреть программой depends входящей в пакет Platform SDK (Software Development Kit).

Интерфейс POSIX предоставляет минимальную поддержку для приложений UNIX. Он поддерживает практически только функции, описанные в стандарте Р1003.1. Этот интерфейс был включен только потому, что некоторые министерства правительства США требовали, чтобы операционные системы для правительственных компьютеров были совместимы со стандартом Р1003.1. Чтобы облегчить пользователям UNIX переход на Windows 2000, корпорация Microsoft разработала программный продукт Interix, предоставляющий более высокую степень совместимости с системой UNIX. Функциональность интерфейса OS/2 ограничена практически в той же степени, что и функциональность интерфейса POSIX.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: