Как уже говорилось для обеспечения последовательного и безопасного доступа к различным внутренним службам, реализованным в исполняющей системе, в Windows реализуется объектная модель. Дальше будет рассматриваться диспетчер объектов Windows, компонент исполняющей системы, отвечающий за создание, удаление, защиту и отслеживание объектов.
Диспетчер объектов централизует операции управления, которые в противном случае были бы разбросаны по всей операционной системе. Он был разработан для достижения целей, перечисленных далее.
Исследование диспетчера объектов.
В данном разделе будут представлены эксперименты, показывающие способы изучения базы данных диспетчера объектов. В этих экспериментах используются следующие средства, с которыми вы познакомитесь, если они вам еще не известны:
- WinObj (доступно на сайте Sysinternals) показывает пространство имен диспетчера внутренних объектов и информацию об объектах (например, счетчик ссылок, количество открытых дескрипторов, дескрипторов безопасности и т. д.).
- ProcessExplorerи Handleот Sysinternals, а также Монитор ресурсов (Resource Monitor) выводят открытые дескрипторы процесса.
- Команда Openfiles/query показывает открытые для процесса файловые дескрипторы, но для ее работы требуется установка глобального флага.
- Команда отладчика ядра !handle показывает открытые для процесса дескрипторы.
Средство WinObj предоставляет способ проникновения в пространство имен, поддерживаемое диспетчером объектов. (Чуть позже будет объяснено, что имена имеются не у всех объектов.) Запустите WinObj и изучите показанную ниже схему.
Как уже упоминалось, Windows-команда Openfiles/query требует установки глобального флага Windows, который называется флагом обслуживания списка объектов — maintain objects list.
Если набрать команду Openfiles/Local, можно получить информацию о том, установлен этот флаг или нет. Этот флаг можно установить с помощью команды Openfiles/Local ON. В любом случае, чтобы установка возымела эффект, нужно перезапустить систему. Process Explorer, Handle и Монитор ресурсов (Resource Monitor) не требуют включения отслеживания объектов, поскольку они запрашивают все системные дескрипторы и создает список объектов, принадлежащих каждому объекту.
Диспетчер объектов был разработан для достижения следующих целей:
- обеспечение общего, унифицированного механизма для использования системных ресурсов;
- изоляция защиты объектов в одном месте операционной системы для обеспечения унификации и последовательности политики доступа к объектам;
- обеспечение механизма зарядки процессов на использование ими объектов, чтобы можно было наложить лимиты на использование системных ресурсов;
- учреждение схемы названия объектов, в которую могут быть легко включены существующие объекты, например, устройства, файлы и каталоги файловой системы или другие независимые коллекции объектов;
- поддержка требований различных окружений операционной системы, таких как возможность наследования процессом ресурсов от родительского процесса (необходимых Windowsи подсистеме Subsystem for UNIX Applications) и возможность создания имен файлов, чувствительных к регистру букв (необходимых для подсистемы Subsystem for UNIX Applications);
- учреждение унифицированных правил для сохранения объектов (object retention) (то есть для сохранения объектов доступными до тех пор, пока все процессы не завершат их использование);
- обеспечение возможности изоляции объектов для конкретного сеанса, чтобы учесть в пространстве имен как локальные, так и глобальные объекты.
Согласно своему внутреннему устройству у Windows есть три типа объектов: объекты исполняющей системы, объекты ядра и объекты GDI/User. Объекты исполняющей системы представлены объектами, реализованными различными компонентами исполняющей системы (такими как диспетчер процессов, диспетчер памяти, подсистема ввода-вывода и т. д.). Объекты ядра представлены более простым набором, реализованным ядром Windows.
Эти объекты не видимы коду пользовательского режима, создаются и используются только внутри исполняющей системы. Объекты ядра обеспечивают такие основные возможности, как синхронизация, на которых построены объекты исполняющей системы. Таким образом, как показано на рисунке, многие объекты исполняющей системы содержат (инкапсулируют) один или несколько объектов ядра.
ПРИМЕЧАНИЕ. С другой стороны, объекты GDI/User принадлежат подсистеме Windows (Win32k.sys) и не взаимодействуют с ядром. Получить дополнительную информацию о них можно из Windows SDK.
Подробности структуры объектов ядра и того, как они используются для реализации синхронизации, будут рассмотрены чуть позже. Вся оставшаяся часть этого раздела будет сфокусирована на том, как работает диспетчер объектов, и на структуре объектов исполняющей системы, дескрипторах и таблицах дескрипторов, в ней также будет дано краткое описание использования объектов в реализации в Windows проверки безопасности доступа.