Устройство Windows. Ключевые компоненты системы
Подсистемы Среды
Подсистема среды нужна, чтобы предоставлять прикладным программам функции исполнительной системы ядра. Пользовательские приложения не обращаются напрямую к исполнительной системе, а проходят некоторую подсистему среды. Основная подсистема это Windows. Также на сегодняшний момент существует подсистема WSL (Windows для Linux), для запуска Linux приложений на Windows, такие приложения проходят через эту подсистему.
Эти подсистемы запускаются диспетчером сеансов smss.exe. Информация для запуска подсистемы хранится в реестре — HKLM\SYSTEM\CurrentControlSet \Control\SessionManager\SubSystems.
Подсистема Windows
Теперь чуть подробнее разберем подсистему Windows. Она реализует весь код для работы с окнами и экранного ввода / вывода. Это основная подсистема операционной системы. Если эта подсистема завершается по какой-либо причине происходит фатальный сбой.
Подсистема Windows состоит из следующих компонентов:
- Client/Server Runtime Subsystem (csrss.exe) — загружает библиотеки для задач связанных с созданием и удалением процессов и потоков, завершением приложений и отправкой уведомлений ядром приложениям;
- драйвер режима ядра для поддержки графики;
- процесс conhost.exe для поддержки консольных приложений;
- диспетчер окон рабочего стола dwm.exe;
- dll подсистемы преобразующие функции Windows API в системные функции;
- драйверы графических устройств (экрана, принтеров, и т.д.).
Другие подсистемы
В системе кроме подсистемы Windows могут быть и другие подсистемы. Раньше Windows поддерживала подсистемы POSIX и OS2, но теперь не поддерживает. Зато поддерживает подсистему Windows для Linux (WSL).
В Windows 10 была определена концепция модели Pico. В этой модели существуют поставщики Pico — специальные драйвера режима ядра. Эти драйвера позволяют:
- создавать процессы для своей подсистемы;
- получать уведомления, когда созданные процессы стартуют, завершаются, приостанавливаются и т.п.
Пока в Windows 10 только 1 поставщик Pico — это компонент подсистемы Windows для Linux (WSL), реализован он драйверами Lxss.sys и Lxcore.sys. Оба драйвера работают в режиме ядра.
Это похоже на виртуальную машину, которую можно представить таким образом:
Исполнительная система
Пользовательские процессы из пользовательского режима обращаются через подсистему среды к исполнительной системе ядра. Ядро и драйвера тоже использует исполнительную систему. Разберем её подробнее.
Исполнительная система состоит из следующих компонентов:
- Диспетчер конфигураций. Отвечает за реализацию и управление системным реестром.
- Диспетчер процессов. Создает и завершает процессы и потоки.
- SRM. Обеспечивает соблюдение политик безопасности на локальном компьютере.
- Диспетчер ввода/вывода. Реализует аппаратно независимый ввод/вывод и отвечает за диспетчеризацию запросов к соответствующим драйверам устройств.
- Диспетчер PnP. Определяет, какие драйвера необходимы для поддержки конкретного устройства и загружает эти драйвера.
- Диспетчер питания. Управляет энергопотреблением процессора и остальных устройств. Например может переводить компьютер в спящий режим.
- Диспетчер памяти. Работает с виртуальной памятью.
- Диспетчер кэша. Повышает быстродействия файлового ввода/вывода за счет хранения часто используемых данных в оперативной памяти.
Ядро состоит из набора функций Ntoskrnl.exe, которые являются фундаментальными в операционной системе. Эти функции используют компоненты исполнительной системы. А также ядро поддерживает работу с оборудованием, это работа с прерываниями и процессором, а также синхронизация процессоров в многопроцессорной системе. С другим оборудованием ядро работает через HAL.
Слой абстрагирования оборудования представляет собой загружаемый модуль режима ядра hal.dll, и является прослойкой между ядром и оборудованием (системной платой).
Внутренние компоненты Windows и драйвера устройств не работают напрямую с оборудованием, а вызывают функции HAL.
Для Windows x86 включена пара библиотек HAL, загружается одна в зависимости от системной платы:
- halacpi.dll — платы с поддержкой acpi, но без поддержки apic;
- halmacpi.dll — платы с поддержкой acpi и apic.
Для Windows x64 существует только один образ hal:
- hal.dll — платы с поддержкой x64 всегда поддерживают acpi и apic.
Windows поддерживает расширения hal — это дополнительные библиотеки, которые могут загружаться при наличии конкретного оборудования, запрашивающего эти библиотеки. Например:
- HalExtPL080.dll — расширение для контроллера DMA PL080;
- HalExtIntcLpioDMA.dll — для некоторых платформ intel с пониженным энергопотреблением.
Создание расширений HAL требует сотрудничества с компанией MicroSoft и такие расширения снабжаются цифровой подписью.
Драйверы
Драйвера могут и не относится к физическому устройству, например существуют драйвера файловой системы. Драйвера представляют собой файлы .sys и обеспечивают интерфейс между вводом/выводом и соответствующим оборудованием.
Существуют несколько типов драйверов:
- драйвера физических устройств;
- драйвера файловой системы;
- драйвера фильтры файловой системы — необходимы, например, для создания программных RAID или шифрования дисков;
- сетевые перенаправители и серверы — драйвера файловой системы, которые передают запросы по сети на другую машину;
- драйвера потоков — необходимы для поддержки сетевых протоколов, например TCP/IP;
- потоковые драйвера-фильтры ядра — они могут объединятся в цепочки для обработки потоков данных, например для записи или воспроизведения аудио и видио;
- программные драйвера — модули ядра, работающие только в режиме ядра. Например многие программы из Sysinternals (Process Explorer, Process Monitor) устанавливают, а затем используют такие модули.
Чтобы посмотреть информацию о загруженных в систему драйверах можно воспользоваться программой «Сведения о системе» msinfo32.exe, которая является стандартной для Windows. В программе необходимо перейти в «Программная среда» / «Системные драйверы». В выводе вы увидите имя, описание, файл, состояние, тип запуска и другое:
Также можно посмотреть запущенные драйверы программой Process Explorer. Для этого нужно включить отображение всех пользователей в меню «View», далее выбрать процесс «System», а внизу включить отображение dll (View / Lower Pane View):
Системные процессы
Один из системных процессов idle процессом не является. Три других — system, secure system и memory compression — не являются полноценными процессами, поскольку для них нет исполняемого файла.
Вот список системных процессов:
- idle — содержит 1 поток для каждого ядра процессора, для учета времени бездействия процессора, всегда имеет идентификатор 0;
- system — содержит много потоков которые работают в режиме ядра;
- secure system — нужен, если включен режим VBS, так как присутствует уровень VTL1 для защищенного ядра — про защиту на основе виртуализации (VBS) в этом курсе рассказано не будет;
- memory compression — сжатая память процессов пользовательского режима;
- диспетчер сеансовsmss.exe — первый процесс пользовательского режима, создаваемый в системе. Работая на сервере служб удаленных рабочих столов он может создать несколько сеансов одновременно;
- подсистема windowscsrss.exe;
- инициализация сеанса winit.exe;
- процесс входаwinlogon.exe;
- диспетчер службservices.exe;
- локальная служба аутентификацииlsass.exe.
Чтобы увидеть дерево процессов можно воспользоваться программой Process Monitor. Этим приложением нужно выполнить загрузочную трассировку, это делается так:
- Откройте меню Options и выберите команду Enable Boot Logging;
- Перезапустите Process Monitor;
- Откройте меню Tools и выберите команду Process Tree.
Затемненные процессы, это те процессы, которые уже завершились, но выполнялись в процессе загрузки:
Дальше разберем некоторые процессы более подробно.
Процесс System и Secure System
Процесс System — объединяет системные потоки, выполняющиеся в режиме ядра. Их создают ядро и драйверы устройств при запуске системы.
Если процесс System загружает центральный процессор, или использует много оперативной памяти, нужно вначале разобраться какой именно поток потребляет слишком много ресурсов. Сделать это можно например используя Process Explorer.
Например, на файловом сервере под высокой нагрузкой, процесс System значительно нагрузит процессор, так как системные потоки обрабатывающие сетевые обращения к файловой системе будут работать в этом процессе.
Процесс Secure System — это защищенное адресное пространство для защищенного ядра, при работе в режиме VBS. На его потоки нельзя посмотреть утилитами. Но этот процесс будет отображаться в диспетчере задач или Process Explorer, чтобы хоть как-то дать понять что вы работаете в режиме VBS (Защита на основе виртуализации).
Процесс инициализации Windows
Wininit.exe — выполняет следующие действия:
- Инициализирует имя компьютера, домен и сетевые настройки.
- Задаёт значения переменных среды для профиля по умолчанию.
- Создает временный каталог (%SystemRoot%\Temp).
- Загружает шрифты и диспетчер окон рабочего стола для нулевого сеанса.
- Запускает диспетчер служб (Services.exe).
- Запускает службу локальной аутентификации (Lsass.exe).
- Начинает ожидать запрос на завершение работы.
Диспетчер служб
Службы могут запускаться автоматически во время загрузки системы и без необходимости интерактивного входа в систему. Или могут запускаться вручную. Большинство служб работают от имени специальной учетной записи.
Диспетчер служб — это системный процесс Services.exe, который отвечает за запуск, остановку, приостановку служб.
Для управлением службами можно запустить оснастку services.msc, где вы можете посмотреть какие службы запущены, запустить или остановить службу, включить или выключить автозапуск, или выключить службу полностью:
В cmd можно посмотреть список служб командой tasklist.exe /svc :
Разные службы могут работать в одном процессе, например в svhost.exe. Какие службы используют определенный процесс можно посмотреть в Process Explorer.
Откроем процесс svchost.exe отмеченный розовым цветом, что означает что это процесс службы и на вкладе Services посмотрим список служб:
Мы увидим список служб, также у выделенной службы увидим её описание.
Winlogon, LogonUI, Userinit
Процесс входа Winlogon.exe обеспечивает интерактивный вход и выход пользователей.
Пользовательский интерфейс (куда мы вводим логин и пароль) создаются процессом LogonUI.exe, который является дочернем от Winlogon.exe.
После ввода учетных данных процесс LogonUI.exe завершается, а данные передаются локальной службе аутентификации — Lsass.exe.
Если аутентификация удалась, дальше пользователю назначается маркер безопасности, который будет использоваться при запуске программ этим пользователем. А если пользователь является администратором, для него добавляются сразу два маркера безопасности, чтобы он мог выполнять программы от имени администратора.
Процесс Userinit.exe является дочерним от Winlogon.exe и выполняет частичную инициализацию окружения пользователя, а именно запускает сценарии входа и восстановление сетевых подключений. А также он запускает оболочку пользователя — Explorer.exe.
Затем Userinit.exe завершается и Explorer.exe отображается без родителя. Можно сказать что Explorer.exe является внуком Winlogon.exe.
Процесс входа пользователя в систему более подробно расписан в конце этого курса.
- Узнали что пользовательские процессы обращаются к ядру через специальные библиотеки, то есть проходят подсистему среды. Какие подсистемы будут запущены и их настройки хранятся в реестре.
- Главная подсистема это подсистема Windows.
- Windows в настоящее время поддерживает подсистему Windows для Linux (WSL). Реализована эта подсистема с помощью модели Pico. WSL реализована двумя драйверами режима ядра lxss.sys и lxcore.sys. В будущем модель Pico должна упростить внедрение других подсистем, если внедрение потребуется.
- Пользовательские процессы через подсистемы среды обращается опять же не напрямую к ядру, а к исполнительной системе ядра. Исполнительная система состоит из различных компонентов, каждый компонент отвечает за свои функции.
- Ядро состоит из набора функций Ntoskrnl.exe. Которые взаимодействуют с исполнительной системой и через HAL с оборудованием.
- HAL является прослойкой между ядром или драйверами и оборудованием. Для Windows x86 существуют пара библиотек, а для Windows x64 одна библиотека. Также существуют расширения hal, для поддержки дополнительного оборудования.
- Драйверы это файлы .sys, работают в режиме ядра. Бывают разных типов, например драйвера файловой системы, драйвера оборудования, драйвера потоков. Посмотреть на список установленных драйверов можно программой Сведения о системе» msinfo32.exe, а также с помощью Process Explorer используя процесс System.
- В системе присутствуют системные процессы: idle, system, secure system, memory compression, диспетчер сеансов smss.exe, подсистема windows csrss.exe, инициализация сеанса wininit.exe, процесс входа winlogon.exe, диспетчер служб services.exe, локальная служба аутентификации lsass.exe. Чтобы увидеть дерево процессов мы использовали Process Monitor.
- Посмотрели на оснастку services.msc. Посмотрели на список служб используя командную строку. Узнали что разные службы могут работать в одном процессе svhost.exe.
Оглавление курса доступно по ссылке.