Архитектура Windows NT , линейки операционных систем , производимых и продаваемых корпорацией Microsoft , представляет собой многоуровневую конструкцию, состоящую из двух основных компонентов: пользовательского режима и режима ядра . Это вытесняющая , реентерабельная многозадачная операционная система, разработанная для работы с однопроцессорными и симметричными многопроцессорными (SMP) компьютерами. Для обработки запросов ввода-вывода (I/O) она использует пакетный ввод-вывод, который использует пакеты запросов ввода-вывода (IRP) и асинхронный ввод-вывод . Начиная с Windows XP , Microsoft начала выпускать 64-разрядные версии Windows; до этого существовали только 32-разрядные версии этих операционных систем.
Программы и подсистемы в пользовательском режиме ограничены в плане того, к каким системным ресурсам они имеют доступ, в то время как режим ядра имеет неограниченный доступ к системной памяти и внешним устройствам. Режим ядра в Windows NT имеет полный доступ к аппаратным и системным ресурсам компьютера. Ядро Windows NT является гибридным ядром ; архитектура включает в себя простое ядро, уровень абстракции оборудования (HAL), драйверы и ряд служб (совместно именуемых Executive), которые все существуют в режиме ядра. [1]
Пользовательский режим в Windows NT состоит из подсистем, способных передавать запросы ввода-вывода соответствующим драйверам устройств режима ядра с помощью диспетчера ввода-вывода. Уровень пользовательского режима Windows NT состоит из "подсистем среды", которые запускают приложения, написанные для многих различных типов операционных систем, и "интегральной подсистемы", которая управляет системно-специфическими функциями от имени подсистем среды. Режим ядра не позволяет службам и приложениям пользовательского режима получать доступ к критическим областям операционной системы, к которым у них не должно быть доступа.
Интерфейсы Executive со всеми подсистемами пользовательского режима занимаются вводом-выводом, управлением объектами, безопасностью и управлением процессами. Ядро находится между уровнем абстракции оборудования и Executive, обеспечивая многопроцессорную синхронизацию , планирование и диспетчеризацию потоков и прерываний, а также обработку ловушек и диспетчеризацию исключений. Ядро также отвечает за инициализацию драйверов устройств при загрузке. Драйверы режима ядра существуют на трех уровнях: драйверы высшего уровня, промежуточные драйверы и драйверы низкого уровня. Модель драйверов 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. Существует определенная MS-DOS VDM, которая работает в своем собственном адресном пространстве и которая эмулирует Intel 80486, работающий под управлением MS-DOS 5.0. Однако программы Win16 запускаются в Win16 VDM. Каждая программа по умолчанию запускается в одном и том же процессе, таким образом используя одно и то же адресное пространство, а Win16 VDM дает каждой программе свой собственный поток для запуска. Однако Windows NT позволяет пользователям запускать программу Win16 в отдельном Win16 VDM, что позволяет программе быть многозадачной с упреждением, поскольку 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 Add-On Subsystem for Presentation Manager. [3] Последней версией Windows NT, в которой была подсистема OS/2, была Windows 2000; ее поддержка прекращена с выходом Windows XP. [4] [5]
Подсистема среды POSIX поддерживает приложения, которые строго написаны либо по стандарту POSIX.1, либо по связанным стандартам ISO / IEC . Эта подсистема была заменена Interix , которая является частью Windows Services for UNIX . [4] Она, в свою очередь, была заменена Windows Subsystem for 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 Executive составляют низкоуровневую часть режима ядра и содержатся в файле NTOSKRNL.EXE . [8] Он занимается вводом-выводом, управлением объектами, безопасностью и управлением процессами. Они разделены на несколько подсистем , среди которых Cache Manager , Configuration Manager , I/O Manager , Local Procedure Call (LPC) , Memory Manager , Object Manager , Process Structure и Security Reference Monitor (SRM) . Сгруппированные вместе, компоненты можно назвать Executive services (внутреннее имя Ex ). Системные службы (внутреннее имя Nt ), т. е. системные вызовы , также реализованы на этом уровне, за исключением очень немногих, которые вызываются непосредственно на уровне ядра для лучшей производительности. [ необходима цитата ]
Термин «служба» в этом контексте обычно относится к вызываемой процедуре или набору вызываемых процедур. Это отличается от концепции «процесса службы», который является компонентом пользовательского режима, в некоторой степени аналогичным демону в операционных системах типа Unix .
Ядро находится между HAL и Executive и обеспечивает многопроцессорную синхронизацию, планирование и диспетчеризацию потоков и прерываний, а также обработку ловушек и диспетчеризацию исключений; оно также отвечает за инициализацию драйверов устройств при загрузке, которые необходимы для запуска и работы операционной системы. То есть, ядро выполняет почти все задачи традиционного микроядра ; строгое различие между Executive и Kernel является наиболее заметным остатком оригинальной конструкции микроядра, и историческая проектная документация последовательно называет компонент ядра «микроядром».
Ядро часто взаимодействует с менеджером процессов. [24] Уровень абстракции таков, что ядро никогда не обращается к менеджеру процессов, только наоборот (за исключением нескольких особых случаев, но все равно никогда не доходит до точки функциональной зависимости).
Дизайн Windows NT включает в себя многие из тех же целей, что и Mach , архетипическая система микроядра, одной из самых важных является ее структура как набор модулей, которые взаимодействуют через хорошо известные интерфейсы, с небольшим микроядром, ограниченным основными функциями, такими как обработка прерываний первого уровня, планирование потоков и примитивы синхронизации. Это позволяет использовать либо прямые вызовы процедур, либо межпроцессное взаимодействие (IPC) для взаимодействия между модулями, и, следовательно, для потенциального расположения модулей в разных адресных пространствах (например, либо в пространстве ядра, либо в процессах сервера). Другие цели дизайна, общие с Mach, включали поддержку различных архитектур, ядро с абстракциями, достаточно общими, чтобы позволить реализовать несколько личностей операционной системы поверх него, и объектно-ориентированную организацию. [25] [26]
Основная личность операционной системы в Windows — это Windows API , который всегда присутствует. Подсистема эмуляции, которая реализует личность Windows, называется Client/Server Runtime Subsystem (csrss.exe). В версиях NT до 4.0 этот процесс подсистемы также содержал оконный менеджер, интерфейс графического устройства и драйверы графических устройств. Однако по соображениям производительности в версии 4.0 и более поздних эти модули (которые часто реализуются в пользовательском режиме даже в монолитных системах, особенно тех, которые разработаны без внутренней поддержки графики) работают как подсистема режима ядра. [25]
Приложения, работающие на NT, написаны для одной из личностей ОС (обычно Windows API), а не для собственного API NT, для которого документация не является общедоступной (за исключением процедур, используемых при разработке драйверов устройств). Личность ОС реализуется с помощью набора DLL пользовательского режима (см. Библиотека динамической компоновки ), которые отображаются в адресные пространства процессов приложений по мере необходимости, вместе с серверным процессом подсистемы эмуляции (как описано ранее). Приложения получают доступ к системным службам, вызывая DLL-файлы личностей ОС, отображенные в их адресные пространства, которые, в свою очередь, вызывают библиотеку времени выполнения NT (ntdll.dll), также отображенную в адресное пространство процесса. Библиотека времени выполнения NT обслуживает эти запросы, перехватывая режим ядра, чтобы либо вызвать процедуры ядра-режима Executive, либо выполнить локальные вызовы процедур (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 , позволяя пользователям входить в систему и использовать свои учетные записи.