Архитектура Windows NT , линейки операционных систем, производимых и продаваемых Microsoft , представляет собой многоуровневую конструкцию, состоящую из двух основных компонентов: пользовательского режима и режима ядра . Это вытесняющая , реентерабельная многозадачная операционная система, разработанная для работы с однопроцессорными и симметричными многопроцессорными компьютерами (SMP). Для обработки запросов ввода-вывода (I/O) он использует пакетный ввод-вывод, который использует пакеты запросов ввода-вывода (IRP) и асинхронный ввод-вывод . Начиная с Windows XP , Microsoft начала делать доступными 64-битные версии Windows; до этого существовали только 32-битные версии этих операционных систем.
Программы и подсистемы в пользовательском режиме ограничены в том, к каким системным ресурсам они имеют доступ, тогда как в режиме ядра имеется неограниченный доступ к системной памяти и внешним устройствам. Режим ядра в Windows NT имеет полный доступ к аппаратным и системным ресурсам компьютера. Ядро Windows NT является гибридным ядром ; архитектура включает простое ядро, уровень аппаратной абстракции (HAL), драйверы и ряд служб (совместно называемых Executive), которые существуют в режиме ядра. [1]
Пользовательский режим в Windows NT состоит из подсистем, способных передавать запросы ввода-вывода соответствующим драйверам устройств режима ядра с помощью диспетчера ввода-вывода. Уровень пользовательского режима Windows NT состоит из «подсистем среды», которые запускают приложения, написанные для множества различных типов операционных систем, и «интегральной подсистемы», которая выполняет функции, специфичные для системы, от имени подсистем среды. Режим ядра запрещает службам и приложениям пользовательского режима получать доступ к критическим областям операционной системы, к которым у них не должно быть доступа.
Исполнительные интерфейсы со всеми подсистемами пользовательского режима занимаются вводом-выводом, управлением объектами, безопасностью и управлением процессами. Ядро находится между уровнем аппаратной абстракции и исполнительной системой и обеспечивает многопроцессорную синхронизацию , планирование и диспетчеризацию потоков и прерываний, а также обработку ловушек и диспетчеризацию исключений. Ядро также отвечает за инициализацию драйверов устройств при загрузке. Драйверы режима ядра существуют на трех уровнях: драйверы самого высокого уровня, драйверы промежуточного уровня и драйверы низкого уровня. Модель драйверов Windows (WDM) существует на промежуточном уровне и в основном была разработана для обеспечения совместимости в двоичном формате и исходном коде между Windows 98 и Windows 2000 . Драйверы самого низкого уровня — это либо устаревшие драйверы устройств Windows NT, которые напрямую управляют устройством, либо могут представлять собой аппаратную шину Plug and Play (PnP).
Пользовательский режим состоит из различных системных процессов и DLL.
Интерфейс между приложениями пользовательского режима и функциями ядра операционной системы называется «подсистемой среды». Windows NT может иметь более одного из них, каждый из которых реализует свой набор API. Этот механизм был разработан для поддержки приложений, написанных для множества различных типов операционных систем. Ни одна из подсистем среды не имеет прямого доступа к оборудованию; доступ к аппаратным функциям осуществляется путем вызова подпрограмм режима ядра. [ нужна цитата ]
Существует три основные подсистемы среды: подсистема Win32 , подсистема OS/2 и подсистема POSIX . [2]
Подсистема среды Win32 может запускать 32-разрядные приложения Windows. Он содержит консоль, а также поддержку текстовых окон, завершение работы и обработку серьезных ошибок для всех других подсистем среды. Он также поддерживает виртуальные машины DOS (VDM), которые позволяют запускать приложения MS-DOS и 16-битной Windows ( Win16 ) в Windows NT. Существует специальный VDM MS-DOS, который работает в собственном адресном пространстве и эмулирует Intel 80486 под управлением MS-DOS 5.0. Однако программы Win16 работают в VDM Win16. Каждая программа по умолчанию выполняется в одном и том же процессе, используя одно и то же адресное пространство, а VDM Win16 предоставляет каждой программе собственный поток для запуска. Однако Windows NT позволяет пользователям запускать программу Win16 в отдельном VDM Win16, что позволяет программе выполнять упреждающую многозадачность, поскольку Windows NT вытесняет весь процесс VDM, который содержит только одно работающее приложение. Процесс подсистемы среды Win32 ( csrss.exe ) также включает в себя функции управления окнами, иногда называемые « оконным менеджером ». Он обрабатывает события ввода (например, с клавиатуры и мыши), а затем передает сообщения приложениям, которым необходимо получить этот ввод. Каждое приложение отвечает за отображение или обновление своих окон и меню в ответ на эти сообщения.
Подсистема среды OS/2 поддерживает 16-битные символьные приложения OS/2 и эмулирует OS/2 1.x, но не 32-битные или графические приложения OS/2, используемые в OS/2 2.x или более поздних версиях. Только машины x86. [3] Для запуска графических программ OS/2 1.x необходимо установить дополнительную подсистему Windows NT для Presentation Manager. [3] Последней версией Windows NT, имевшей подсистему OS/2, была Windows 2000; его поддержка прекращена начиная с Windows XP. [4] [5]
Подсистема среды POSIX поддерживает приложения, написанные строго в соответствии со стандартом POSIX.1 или соответствующими стандартами ISO / IEC . Эта подсистема была заменена Interix , которая является частью служб Windows для UNIX . [4] Это, в свою очередь, было заменено подсистемой Windows для Linux .
Подсистема безопасности работает с токенами безопасности, предоставляет или запрещает доступ к учетным записям пользователей на основе разрешений ресурсов, обрабатывает запросы на вход в систему и инициирует аутентификацию входа в систему, а также определяет, какие системные ресурсы необходимо проверять Windows NT. [ необходима цитация ] Он также заботится об Active Directory . [ нужна цитация ] Служба рабочей станции реализует сетевой перенаправитель , который является клиентской частью Windows для совместного использования файлов и принтеров; он реализует локальные запросы к удаленным файлам и принтерам, «перенаправляя» их на соответствующие серверы в сети. [6] И наоборот, служба сервера позволяет другим компьютерам в сети получать доступ к общим файлам и общим принтерам, предлагаемым локальной системой. [7]
Режим ядра Windows NT имеет полный доступ к аппаратным и системным ресурсам компьютера и запускает код в защищенной области памяти. [8] Он контролирует доступ к планированию, приоритезации потоков, управлению памятью и взаимодействию с оборудованием. Режим ядра запрещает службам и приложениям пользовательского режима получать доступ к критическим областям операционной системы, к которым у них не должно быть доступа; Процессы пользовательского режима должны попросить режим ядра выполнить такие операции от их имени.
Хотя архитектура x86 поддерживает четыре различных уровня привилегий (с номерами от 0 до 3), используются только два крайних уровня привилегий. Программы пользовательского режима запускаются с CPL 3, а ядро — с CPL 0. Эти два уровня часто называют «кольцом 3» и «кольцом 0» соответственно. Такое проектное решение было принято для достижения переносимости кода на RISC- платформы, поддерживающие только два уровня привилегий, [9] , хотя это нарушает совместимость с приложениями OS/2 , которые содержат сегменты привилегий ввода-вывода, которые пытаются получить прямой доступ к оборудованию. [3]
Код, работающий в режиме ядра, включает в себя: исполнительную часть, которая сама состоит из множества модулей, выполняющих конкретные задачи; ядро , которое предоставляет низкоуровневые сервисы, используемые исполнителем; уровень аппаратной абстракции (HAL); и драйверы ядра . [8] [10]
Исполнительные службы Windows составляют низкоуровневую часть режима ядра и содержатся в файле NTOSKRNL.EXE . [8] Он касается ввода-вывода, управления объектами, безопасности и управления процессами. Они разделены на несколько подсистем , среди которых Диспетчер кэша , Диспетчер конфигурации , Диспетчер ввода-вывода , Вызов локальных процедур (LPC) , Диспетчер памяти , Диспетчер объектов , Структура процесса и Монитор ссылок на безопасность (SRM) . Сгруппированные вместе компоненты можно назвать исполнительными службами (внутреннее имя Ex ). Системные службы (внутреннее имя Nt ), т. е. системные вызовы , также реализуются на этом уровне, за исключением очень немногих, которые вызываются непосредственно на уровень ядра для повышения производительности. [ нужна цитата ]
Термин «сервис» в этом контексте обычно относится к вызываемой подпрограмме или набору вызываемых подпрограмм. Это отличается от концепции «сервисного процесса», который представляет собой компонент пользовательского режима, несколько аналогичный демону в Unix -подобных операционных системах.
Ядро находится между HAL и исполнительной системой и обеспечивает многопроцессорную синхронизацию, планирование и диспетчеризацию потоков и прерываний, а также обработку ловушек и диспетчеризацию исключений; он также отвечает за инициализацию драйверов устройств при загрузке, которые необходимы для запуска и работы операционной системы. То есть ядро выполняет практически все задачи традиционного микроядра ; Строгое различие между Executive и Kernel является наиболее заметным остатком исходной конструкции микроядра, а в исторической проектной документации компонент ядра постоянно упоминается как «микроядро».
Ядро часто взаимодействует с диспетчером процессов. [24] Уровень абстракции таков, что ядро никогда не обращается к диспетчеру процессов, а только наоборот (за исключением нескольких крайних случаев, но никогда не доходящих до функциональной зависимости).
Дизайн Windows NT включает в себя многие из тех же целей, что и Mach , архетипическую систему микроядра, одной из наиболее важных из которых является ее структура как набора модулей, которые взаимодействуют через хорошо известные интерфейсы, с небольшим микроядром, ограниченным основными функциями, такими как первая Обработка прерываний на уровне, планирование потоков и примитивы синхронизации. Это позволяет использовать либо прямые вызовы процедур, либо межпроцессное взаимодействие (IPC) для связи между модулями и, следовательно, для потенциального расположения модулей в разных адресных пространствах (например, в пространстве ядра или в серверных процессах). Другие цели проектирования, общие с Махом, включали поддержку различных архитектур, ядро с достаточно общими абстракциями, чтобы можно было реализовать поверх него несколько вариантов операционной системы, и объектно-ориентированную организацию. [25] [26]
Основной особенностью операционной системы Windows является Windows API , который всегда присутствует. Подсистема эмуляции, реализующая особенности Windows, называется подсистемой выполнения клиент/сервер (csrss.exe). В версиях NT до 4.0 этот процесс подсистемы также содержал оконный менеджер, интерфейс графического устройства и драйверы графического устройства. Однако из соображений производительности в версии 4.0 и более поздних версиях эти модули (которые часто реализуются в пользовательском режиме даже в монолитных системах, особенно в тех, которые разработаны без внутренней графической поддержки) работают как подсистема режима ядра. [25]
Приложения, работающие в NT, записываются на одну из особенностей ОС (обычно Windows API), а не на собственный NT API, документация по которому не является общедоступной (за исключением подпрограмм, используемых при разработке драйверов устройств). Личность ОС реализуется через набор библиотек DLL пользовательского режима (см. Библиотеку динамической компоновки ), которые по мере необходимости отображаются в адресные пространства процессов приложений вместе с серверным процессом подсистемы эмуляции (как описано ранее). Приложения получают доступ к системным службам, вызывая библиотеки DLL ОС, сопоставленные с их адресными пространствами, которые, в свою очередь, вызывают библиотеку времени выполнения NT (ntdll.dll), также отображаемую в адресном пространстве процесса. Библиотека времени выполнения NT обслуживает эти запросы, перехватывая их в режим ядра, чтобы либо вызвать исполнительные процедуры режима ядра, либо выполнить вызовы локальных процедур (LPC) соответствующим серверным процессам подсистемы пользовательского режима, которые, в свою очередь, используют API NT для связи с процессы приложений, подсистемы режима ядра и друг друга. [27]
Windows NT использует драйверы устройств режима ядра , чтобы обеспечить взаимодействие с аппаратными устройствами . Каждый из драйверов имеет четко определенные системные и внутренние процедуры, которые он экспортирует в остальную часть операционной системы. Все устройства рассматриваются кодом пользовательского режима как файловый объект в диспетчере ввода-вывода, хотя для самого диспетчера ввода-вывода устройства рассматриваются как объекты устройств, которые он определяет как объекты файла, устройства или драйвера. Драйверы режима ядра существуют на трех уровнях: драйверы самого высокого уровня, драйверы промежуточного уровня и драйверы низкого уровня. Драйверы самого высокого уровня, такие как драйверы файловой системы для FAT и NTFS , полагаются на промежуточные драйверы. Промежуточные драйверы состоят из функциональных драйверов (или основного драйвера устройства), которые при необходимости размещаются между драйверами фильтров более низкого и более высокого уровня. Тогда функциональный драйвер полагается на драйвер шины — или драйвер, который обслуживает контроллер шины , адаптер или мост, — который может иметь дополнительный драйвер фильтра шины, который находится между ним и функциональным драйвером. Драйверы среднего уровня полагаются на работу драйверов самого низкого уровня. Модель драйверов Windows (WDM) существует на промежуточном уровне. Драйверы самого низкого уровня — это либо устаревшие драйверы устройств Windows NT, которые напрямую управляют устройством, либо аппаратная шина PnP. Эти драйверы нижнего уровня напрямую управляют оборудованием и не зависят от других драйверов.
Уровень абстракции оборудования Windows NT (HAL) — это уровень между физическим оборудованием компьютера и остальной частью операционной системы. Он был разработан, чтобы скрыть различия в оборудовании и обеспечить согласованную платформу, на которой работает ядро. HAL включает в себя код, специфичный для аппаратного обеспечения, который управляет интерфейсами ввода-вывода, контроллерами прерываний и несколькими процессорами.
Однако, несмотря на свое предназначение и назначенное место в архитектуре, HAL не является уровнем, который находится полностью под ядром, как ядро находится ниже исполнительной системы: все известные реализации HAL в некоторой степени зависят от ядра или даже от Исполнительный. На практике это означает, что варианты ядра и HAL входят в соответствующие наборы, специально созданные для совместной работы.
В частности, аппаратная абстракция не предполагает абстракции набора команд, который обычно подпадает под более широкую концепцию переносимости . Абстрагирование набора команд, когда это необходимо (например, для обработки нескольких версий набора команд x86 или эмуляции отсутствующего математического сопроцессора), выполняется ядром или посредством аппаратной виртуализации .
Последовательность загрузки инициируется NTLDR в версиях до Vista и диспетчером загрузки Windows в Vista и более поздних версиях. [28] Загрузчик отвечает за доступ к файловой системе на загрузочном диске, запуск ntoskrnl.exe и загрузку драйверов устройств во время загрузки в память. После загрузки всех загрузочных и системных драйверов ядро запускает подсистему диспетчера сеансов . Менеджер сеансов запускает важные службы ядра и пользовательского режима подсистемы Win32, такие как подсистема выполнения клиент/сервер . Сеанс также запускает процесс winlogon , позволяющий пользователям входить в систему и использовать свои учетные записи.