Режим ядра и пользовательский режим
Микропроцессор Pentium имеет четыре уровня привилегий (privilege levels), известных также как кольца (rings), которые управляют, например, доступом к памяти, возможностью использовать некоторые критичные команды процессора (такие как команды, связанные с защитой) и т.д. Каждый поток выполняется на одном из этих уровней привилегий. Кольцо 0 - наиболее привилегированный уровень, с полным доступом ко всей памяти и ко всем командам процессора. Кольцо 3 - наименее привилегированный уровень.
Для обеспечения совместимости с системами на базе процессоров, отличных от тех, что выпускает компания Intel, Windows поддерживает только два уровня привилегий - кольца 0 и 3. Если поток работает в кольце 0, говорят, что он выполняется в режиме ядра (kernel mode). Если поток выполняется в кольце 3, говорят, что он работает в пользовательском режиме (user mode). Низкоуровневый код операционной системы действует в режиме ядра, тогда как пользовательские приложения выполняются в основном в пользовательском режиме.
Заметим, что прикладной поток может переключаться из пользовательского режима в режим ядра при вызове некоторых API-функций, которые требуют более высокого уровня привилегий, например, связанных с доступом к файлам или с выполнением функций, ориентированных на графические операции. В действительности некоторые пользовательские потоки могут работать в режиме ядра даже больше времени, чем в пользовательском режиме.
Но как только завершается выполнение той части кода, которая относится к режиму ядра, пользовательский поток автоматически переключается обратно в пользовательский режим. Такой подход лишает возможности писать код, предназначенный для работы в режиме ядра, программист может только вызывать выполняющиеся в режиме ядра системные функции (system functions). При работе с Windows NT можно определить, когда поток выполняется в пользователъском режиме, а когда - в режиме ядра. Для этого используется утилита Performance Monitor (Системный монитор) из пункта Administrative Tools (Администрирование) меню Start. (Пуск).
Интересно, что драйверы устройств работают в режиме ядра. Это обстоятельство имеет два следствия. Во-первых, в отличие от неправильно выполняющегося приложения неправильно работающий драйвер устройства может нарушить работу всей системы, так как он имеет доступ и ко всему системному коду, и ко всей памяти. Во-вторых, прикладной программист может получить доступ к защищенным ресурсам, написав драйвер псевдоустройства (fake device), хотя это и нелегкая задача.
Термин сервис (service) имеет в среде Windows множество значений. Ниже представлены некоторые из них, имеющие отношение к рассматриваемой теме:
Сервис АРI - функция или подпрограмма API, которая реализует некоторое действие (сервис) операционной системы, такое как создание файла или работа с графикой (рисование линий или окружностей). Например, функция API Crea t eProcess используется в Windows для создания нового процесса; системный сервис - недокументированная (undocumented) функция, которая может вызываться из пользовательского режима. Эти функции часто используются функциями Win32 API для предоставления низкоуровневых сервисов; внутренний (internal) сервис - функция или подпрограмма, которая может вызываться только из кода, выполняемого в режиме ядра. Эти функции относятся к низкоуровневой части кода Windows: к исполнительной системе Windows NT, к ядру или к слою абстрагирования от аппаратуры (HAL).
Системные процессы (system processes) - это особые процессы, обслуживающие операционную систему. В системе Windows постоянно задействованы следующие системные процессы (учтите, что все они, кроме процесса system, выполняются в пользовательском режиме):
- процесс idle, который состоит из одного потока, управляющего временем простоя процессора;
- процесс system - специальный процесс, выполняющийся только в режиме ядра. Его потоки называются системными потоками (system threads);
- процесс Session Manager (диспетчер сеансов) - SMSS.EXE;
- подсистема Win32 - CSRSS.EXE;
- процесс регистрации в системе — WinLogon (WINLOGON.EXE).
Вы можете убедиться в том, что эти системные процессы действительно выполняются в системе, посмотрев на вкладку Processes (Процессы) программы Task Manager (Диспетчер
Давайте рассмотрим вкратце некоторые из этих системных процессов.
Процесс Session Manager (менеджер сеансов)
Процесс Session Manager (SMSS.EXE) - один из первых процессов, создаваемых операционной системой в процессе загрузки. Он выполняет важные функции инициализации, такие как создание переменных окружения системы; задание имен устройств MS DOS, например, LPT1 и СОМ1; загрузка той части подсистемы Win32, которая относится к режиму ядра; запуск процесса регистрации в системе WinLogon.
Процесс WinLogon
Этот системный процесс управляет входом пользователей в систему и выходом из нее. Вызывается специальной комбинацией клавиш Windows Ctrl+Alt+Delete. WinLogon отвечает за загрузку оболочки Windows (обычно это Windows Explorer).
Процесс system состоит из системных потоков (system threads), являющихся потоками режима ядра. Windows и многие драйверы устройств создают потоки прoцecca system для различных целей. Например, диспетчер памяти формирует системные потоки для решения задач управления виртуальной памятью, диспетчер кэша использует системные потоки для управления кэш-памятью, а драйвер гибкого диска - для контроля над гибкими дисками.
Csrss.exe Данный процесс является частью подсистемы Win32, выполняющейся в непривилегированном режиме (Win32.sys является модулем привилегированного режима). Процесс Csrss представляет клиент-серверную подсистему времени выполнения. Данный процесс должен быть запущен все время. Процесс Csrss отвечает за консольные окна, создание и удаление потоков и за некоторые части 16-разрядной виртуальной среды MS-DOS.
Подсистема Win32 является разновидностью подсистемы среды (environment subsystem). Другие подсистемы среды Windows (не показаны на рисунке) включают POSIX и OS/2. POSIX является сокращением термина «переносимая операционная система па базе UNIX» (portable operating system based on UNIX) и реализует ограниченную поддержку операционной системы UNIX.
Назначение подсистемы среды - служить интерфейсом между пользовательскими приложениями и соответствующей частью исполнительной системы Windows. Каждая подсистема имеет свои функциональные возможности на базе единой исполнительной системы Windows. Любой выполняемый файл неразрывно связан с одной из этих подсистем. Подсистема Win32 содержит Win32 API в виде набора DLL, таких как KERNEL32.DLL, GDI32.DLL и USER32.DLL.
В Windows NT Microsoft перенесла часть подсистемы Win32 из пользовательского режима в режим ядра. В частности, драйвер устройства режима ядра WIN32K.SYS, который управляет отображением окон, выводом на экран, вводом данных с клавиатуры или при помощи мыши и передачей сообщений. Он включает также библиотеку интерфейсов графических устройств (Graphical Device Interface library – GDL.DLL), используемую для создания графических объектов и текста.
Сервисы исполнительной системы Windows составляют низкоуровневую часть Windows NT режима ядра, включенную в файл NTOSKRNL.EXE.
Cервисы исполнительной системы делят на две группы: исполнительную систему (executive), относящуюся к верхнему уровню, и ядро (kernel).
Ядро - это самый нижний уровень операционной системы, реализующий наиболее фундаментальные сервисы, такие как:
- планирование потоков;
- обработку исключений;
- обработку прерываний;
- синхронизацию процессоров в многопроцессорной системе;
- создание объектов ядра.
Ниже приведены некоторые наиболее важные составляющие исполнительной системы:
- диспетчер процессов и потоков создает и завершает и процессы, и потоки, используя сервисы низкоуровневого ядра;
- диспетчер виртуальной памяти реализует механизм виртуальной памяти;
- диспетчер ввода/вывода реализует аппаратно-независимый ввод/вывод и взаимодействует с драйверами устройств;
- диспетчер КЭШа управляет кэшированием диска;
- диспетчер объектов создает объекты исполнительной системы Windows и управляет ими. Windows использует объекты для представления разнообразных ресурсов, таких как процессы и потоки;
- библиотеки времени выполнения содержат такие функции, как обработки строк и арифметическиефункции.
Уровень абстрагирования от аппаратуры (HAL) - это библиотека режима ядра (HAL.DLL), которая реализует низкоуровневый интерфейс с аппаратурой. Компоненты Windows и драйверы устройств от других компаний взаимодействуют с аппаратурой посредством HAL. Существует много версий HAL под различные аппаратные платформы. Подходящий уровень выбирается в процессе установки Windows.
Процесс - это исполняемый экземпляр приложения инабор ресурсов, которые выделяются данному исполняемому приложению. Ресурсы включают в себя следующее:
- виртуальное адресное пространство;
- системные ресурсы, такие как растровые изображения, файлы, области памяти и т.д.;
- модули процесса, то есть исполняемые модули, которые отображены (загружены) в его адресное пространство. Это могут быть динамические библиотеки (DLL), драйверы (DRV) и управляющие элементы (OCX), основной загрузочный модуль (ЕХЕ) процесса, который иногда и называют собственно модулем. Модуль данных (или программный модуль) может или находиться на диске, или быть загруженным в физическую память (RAM) Правда, термин «загружен» (loaded) имеет иное значение, относящееся к виртуальному адресному пространству процесса. Здесь больше подходит термин «отображен» (mapped), так как само отображение - это просто назначение виртуальным адресам физических адресов. После того как модуль загружен в физическую память, его физические адреса могут отображаться в различные виртуальные адресные пространств, при этом возможно использование в каждом процессе разных виртуальных адресов. Отображение не обязательно требует физического перемещения реальных данных или программ (хотя, как вы увидите позже, бывает и так); уникальный идентификационный номер, называемый идентификатором процесса; один или несколько потоков управления.
Поток - это внутренняя составляющая процесса, которой операционная система выделяет процессорное время. Каждый процесс должен иметь, по крайней мере, один поток. Поток включает:
· текущее состояние регистров процессора;
· два стека, один из которых используется при выполнении в режиме ядра, второй - при выполнении в пользовательском режиме;
· участок памяти для работы подсистем, библиотеки времени выполнения,
· динамические библиотеки;
· уникальный идентификатор, называемый идентификатором потока.
Состояние регистров, содержимое стека и области памяти называют контекстом потока (thread's context).
Основное назначение потоков - дать процессу возможность поддерживать несколько ветвей управления, то есть выполнять больше «дел» одновременно. В многопроцессорной конфигурации (компьютер с двумя и более процессорами) Windows NT может назначать разные потоки разным процессорам в различные моменты времени, обеспечивая действительно параллельную обработку. В однопроцессорной конфигурации процессор должен выделять кванты времени каждому исполняемому в данный момент потоку.