Введение
Ядро Windows NT Обзор архитектуры линейки операционных систем Microsoft Windows NT
Overview of the architecture of the Microsoft Windows NT line of operating systems
Архитектура Windows NT, линейки операционных систем, разрабатываемых и продаваемых Microsoft, представляет собой многоуровневую структуру, состоящую из двух основных компонентов: пользовательского режима и режима ядра. Это прерывистая, многозадачная операционная система, разработанная для работы с однопроцессорными и симметричными многопроцессорными (SMP) компьютерами. Для обработки запросов ввода-вывода (I/O) используется пакетная обработка I/O, использующая пакеты запросов I/O (IRP) и асинхронный I/O. Начиная с Windows XP, Microsoft начала предлагать 64-разрядные версии Windows; ранее существовали только 32-разрядные версии этих операционных систем. Программы и подсистемы в пользовательском режиме ограничены в доступе к системным ресурсам, в то время как режим ядра имеет неограниченный доступ к системной памяти и внешним устройствам. Режим ядра в Windows NT имеет полный доступ к аппаратному обеспечению и системным ресурсам компьютера. Ядро Windows NT является гибридным ядром; архитектура включает в себя само ядро, аппаратный уровень абстракции (HAL), драйверы и набор служб (совместно называемых Executive), которые все существуют в режиме ядра. Пользовательский режим в Windows NT состоит из подсистем, способных передавать запросы I/O соответствующим драйверам устройств в режиме ядра с помощью менеджера I/O. Пользовательский режим Windows NT состоит из "средовых подсистем", которые запускают приложения, написанные для различных типов операционных систем, и "интегральной подсистемы", которая выполняет системные функции от имени средовых подсистем. Режим ядра предотвращает доступ служб и приложений пользовательского режима к критически важным областям операционной системы, к которым у них не должно быть доступа. Интерфейсы Executive, взаимодействуя со всеми подсистемами пользовательского режима, обрабатывают I/O, управление объектами, безопасность и управление процессами. Ядро располагается между аппаратным уровнем абстракции и Executive для обеспечения многопроцессорной синхронизации, планирования и диспетчеризации потоков и прерываний, а также обработки исключений и диспетчеризации прерываний. Ядро также отвечает за инициализацию драйверов устройств при загрузке. Драйверы режима ядра существуют на трех уровнях: драйверы верхнего уровня, промежуточные драйверы и драйверы нижнего уровня. Windows Driver Model (WDM) существует на промежуточном уровне и был разработан в основном для обеспечения двоичной и исходной совместимости между Windows 98 и Windows 2000. Драйверы самого нижнего уровня либо являются устаревшими драйверами устройств Windows NT, которые напрямую управляют устройством, либо могут представлять собой аппаратную шину Plug and Play (PnP).
Режим пользователя
Пользовательский режим состоит из различных системных процессов и DLL. Интерфейс между приложениями пользовательского режима и функциями ядра операционной системы называется "подсистема среды". Windows NT может иметь несколько таких подсистем, каждая из которых реализует свой собственный набор API. Этот механизм был разработан для поддержки приложений, написанных для различных типов операционных систем. Ни одна из подсистем среды не может напрямую обращаться к аппаратному обеспечению; доступ к аппаратным функциям осуществляется через вызов процедур в режиме ядра. Существует три основные подсистемы среды: подсистема Win32, подсистема OS/2 и подсистема POSIX.
Подсистема среды Win32
Подсистема среды 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"
Подсистема среды OS/2 поддерживает 16-битные текстовые приложения OS/2 и эмулирует OS/2 1.x, но не поддерживает 32-битные или графические приложения OS/2, используемые с OS/2 2.x и более поздними версиями, только на машинах x86. Для запуска графических программ OS/2 1.x необходимо установить подсистему Windows NT Add On для Presentation Manager.
Подсистема среды POSIX
Подсистема POSIX поддерживает приложения, разработанные строго в соответствии со стандартом POSIX.1 или соответствующими стандартами ISO/IEC. Эта подсистема была заменена Interix, являющейся частью Windows Services для UNIX. В то же время, серверная служба позволяет другим компьютерам в сети получать доступ к сетевым папкам и общим принтерам, предоставляемым локальной системой.
Режим ядра
Режим ядра Windows NT имеет полный доступ к аппаратному и системным ресурсам компьютера и выполняет код в защищенной области памяти. Он управляет доступом к планированию, приоритезации потоков, управлению памятью и взаимодействию с аппаратным обеспечением. Режим ядра предотвращает доступ службам и приложениям пользовательского режима к критически важным областям операционной системы, к которым у них не должно быть доступа; процессы пользовательского режима должны запрашивать режим ядра для выполнения таких операций от их имени. Архитектура x86 поддерживает четыре различных уровня привилегий (пронумерованных от 0 до 3), однако используются только два крайних уровня. Программы пользовательского режима выполняются с CPL 3, а ядро – с CPL 0. Эти два уровня часто называют "кольцом 3" и "кольцом 0" соответственно. Такое решение было принято для обеспечения переносимости кода на RISC-платформы, поддерживающие только два уровня привилегий, хотя это нарушает совместимость с приложениями OS/2, содержащими сегменты привилегий ввода-вывода, которые пытаются напрямую обращаться к аппаратному обеспечению.
Ядра
Ядро располагается между HAL и Executive и обеспечивает многопроцессорную синхронизацию, планирование и диспетчеризацию потоков и прерываний, а также обработку прерываний и диспетчеризацию исключений; оно также отвечает за инициализацию драйверов устройств при загрузке, необходимых для запуска операционной системы. Иными словами, ядро выполняет почти все задачи традиционного микроядра; чёткое различие между Executive и ядром является наиболее заметным наследием оригинальной архитектуры микроядра, и историческая проектная документация последовательно именует компонент ядра как "микроядро". Ядро часто взаимодействует с менеджером процессов. Уровень абстракции таков, что ядро никогда не обращается к менеджеру процессов, а только наоборот (за исключением небольшого числа особых случаев, которые, тем не менее, не приводят к функциональной зависимости).
Конструкция гибридного ядра
Дизайн Windows NT включает в себя многие из тех же целей, что и Mach, архетипическая система микроядра, одной из самых важных из которых является его структура как совокупность модулей, взаимодействующих через чётко определённые интерфейсы, с небольшим микроядром, ограниченным основными функциями, такими как обработка прерываний первого уровня, планирование потоков и примитивы синхронизации. Это позволяет использовать как прямые вызовы процедур, так и межпроцессное взаимодействие (IPC) для связи между модулями, и, следовательно, потенциально размещать модули в различных адресных пространствах (например, в пространстве ядра или в серверных процессах). Другие цели проектирования, общие с Mach, включали поддержку различных архитектур, ядро с абстракциями, достаточно общими для реализации нескольких операционных системных сред на его основе, и объектно-ориентированную организацию. Основной операционной системной средой в Windows является Windows API, который всегда присутствует. Подсистема эмуляции, реализующая операционную среду Windows, называется подсистемой времени выполнения клиент/сервер (csrss.exe). В версиях NT до 4.0 этот подсистемный процесс также содержал диспетчер окон, графический интерфейс устройства и драйверы графических устройств. Однако, начиная с версии 4.0 и более поздних, эти модули (которые часто реализуются в пользовательском режиме даже в монолитных системах, особенно в тех, которые разработаны без встроенной поддержки графики) работают как подсистема в режиме ядра.
Драйверы для ядра
Windows NT использует драйверы устройств в режиме ядра для взаимодействия с аппаратными устройствами. Каждый драйвер имеет четко определенные системные и внутренние подпрограммы, которые он экспортирует в остальную часть операционной системы. Весь код пользовательского режима видит все устройства как файловые объекты в менеджере ввода-вывода, хотя сам менеджер ввода-вывода рассматривает устройства как объекты устройств, которые он определяет как файловые, устройства или драйверные объекты. Драйверы режима ядра существуют на трех уровнях: драйверы высшего уровня, промежуточные драйверы и драйверы низшего уровня. Драйверы высшего уровня, такие как драйверы файловых систем для FAT и NTFS, зависят от промежуточных драйверов. Промежуточные драйверы состоят из функциональных драйверов – или основных драйверов для устройства – которые могут быть расположены между фильтрующими драйверами более низкого и более высокого уровня. Затем функциональный драйвер зависит от драйвера шины – или драйвера, обслуживающего контроллер шины, адаптер или мост – который может иметь дополнительный фильтрующий драйвер шины, расположенный между ним и функциональным драйвером. Промежуточные драйверы зависят от драйверов низшего уровня для функционирования. Модель драйверов Windows (WDM) существует на промежуточном уровне. Драйверы низшего уровня – это либо устаревшие драйверы устройств Windows NT, которые непосредственно управляют устройством, либо могут быть аппаратной шиной PnP. Эти драйверы низшего уровня непосредственно управляют оборудованием и не зависят от других драйверов.
Слой абстракции аппаратной части
Аппаратный слой абстракции Windows NT (HAL) — это слой между физическим оборудованием компьютера и остальной частью операционной системы. Он был разработан для сокрытия различий в аппаратном обеспечении и обеспечения единой платформы для работы ядра. HAL включает в себя код, специфичный для аппаратного обеспечения, который управляет интерфейсами ввода-вывода, контроллерами прерываний и многопроцессорными системами. Однако, несмотря на свою цель и место в архитектуре, HAL не является слоем, полностью расположенным ниже ядра, подобно тому, как ядро находится ниже Executive: все известные реализации HAL в той или иной степени зависят от ядра или даже от Executive. На практике это означает, что варианты ядра и HAL поставляются в согласованных наборах, специально разработанных для совместной работы. В частности, аппаратная абстракция не включает в себя абстрагирование набора инструкций, которое обычно относится к более широкому понятию переносимости. Абстрагирование набора инструкций, когда это необходимо (например, для обработки различных ревизий набора инструкций x86 или эмуляции отсутствующего математического сопроцессора), выполняется ядром или посредством аппаратной виртуализации.
Последовательность загрузки
Последовательность загрузки инициируется NTLDR в версиях до Vista и Windows Boot Manager в Vista и более поздних версиях. Загрузчик отвечает за доступ к файловой системе на загрузочном диске, запуск ntoskrnl.exe и загрузку драйверов устройств, необходимых для загрузки, в память. После загрузки всех загрузочных и системных драйверов ядро запускает подсистему управления сеансами. Менеджер сеансов запускает критически важные службы ядра и пользовательского режима подсистемы Win32, такие как подсистема выполнения клиент/сервер. В рамках сеанса также запускается процесс winlogon, позволяющий пользователям входить в систему и использовать свои учетные записи.