NT club. Часть 6. Архитектура NT
19.05.03
Автор: Creator
— Дядя Вова, цапу надо крутить, цапу.
— На! Сам делай!
— Нельзя. Я чатланин.
— Уйди отсюда! Как советовать, так все чатлане, как работать, так...
(с) “Кин-Дза-Дза”
Пролог
Следующим этапом изучения ОС семейства NT я решил сделать обзор их
архитектуры. Она со временем, конечно, изменялась, но базовые принципы
остались непоколебимы. Вообще архитектура Windows 2000 от XP ничем серьезно
не отличается (да и от NT 4.0 тоже). Как упоминалось ранее (“NT club. Часть
5. Как это было”), серьезные изменения произошли только в NT 4.0, когда
графическая подсистема была перенесена в режим ядра. В процессе своих рассуждений
я не буду углубляться в дебри устройства ОС — это совершенно неинтересно
той аудитории читателей, на которую рассчитана данная статья. Однако читателю
придется-таки столкнуться с рядом терминов, значение которых он может не
знать. Тут лучше включить свою “соображалку”, так как ничего особо сложного
они собой не представляют. В конце данного материала я объясню, зачем все-таки
нужно пользователю в целом представлять устройство своей ОС (имеется в
виду домашний пользователь: у корпоративных есть свой бог и учитель — Системный
Администратор, который и решает все их проблемы). И последнее. В подготовке
статьи широко использовались материалы из книги Д. Соломона и М. Руссиновича
“Внутреннее устройство Microsoft Windows 2000”.

Ядерная реакция
Сначала я приведу очень упрощенную (рис.1), однако вполне достаточную
для понимания основных принципов функционирования ОС схему архитектуры
Windows NT (начиная с NT 4.0). Обратите внимание на линию, разделяющую
части кода, выполняющиеся в разных режимах процессора. Прямоугольники над
этой линией соответствуют процессам пользовательского режима, компоненты
под ней — сервисам режима ядра. Главное отличие этих режимов состоит в
том, что код, работающий в режиме ядра, получает доступ ко всем ресурсам
ОС и оборудованию, а код пользовательского режима способен лишь вызывать
сервисы ОС для манипуляции с оборудованием или внутренними структурами
системы. Причем как ядро, так и каждый процесс (задача, приложение) имеет
собственное виртуальное адресное пространство. Из всего этого делаем важный
вывод: нарушить работу системы может только код режима ядра, пользовательский
же код при всем своем желании не может повредить не только систему, но
и другие работающие приложения (за исключением разделяемой памяти). Еще
один важный момент: ядро ОС (точнее, исполнительная система и микроядро)
и драйверы работают в одном адресном пространстве, причем в целях повышения
быстродействия в режиме ядра не проводится никаких проверок на правильность
передачи параметров процедурам и т.д., что в случае некорректно работающего
драйвера может привести к катастрофе — сбою в режиме ядра (ошибка STOP,
пользователи обычно называют это Синим Экраном Смерти — BSOD, хотя машина
еще вполне работоспособна, и с помощью второго компьютера и отладчика можно
найти и устранить проблему). Таким образом, добавление драйвера устройства
— единственный способ добавить в систему код режима ядра и в то же время
единственный способ “грохнуть” по-настоящему вашу NT, так как при таких
сбоях, во-первых, восстановление почти невозможно, а во-вторых, дальнейшая
работа может привести к еще большим повреждениям, в том числе и пользовательских
данных, что недопустимо. Для предотвращения таких ситуаций Microsoft придумала
систему верификации и подписывания драйверов. Сначала компоненты драйвера
проходят тест в лабораториях WHQL (Windows Hardware Quality Laboratory)
и в случае его успешной сдачи подписываются этой лабораторией как совместимые
с данной версией Windows. При установке драйвера в систему ОС проверяет
его подпись. Если она есть и является верной и действительной, драйвер
устанавливается без вопросов, если есть какие-то проблемы с этим — все
зависит от принятой политики подписывания драйверов (отказ от установки,
запрос пользователю на установку, установка без запроса). Следует отметить,
что данное нововведение появилось в Windows 2000. Ну, а сейчас мы быстро
пробежимся по основным компонентам системы.
Пользовательские процессы
Фиксированные процессы поддержки системы, например, диспетчер сеансов.
Необходимы для нормальной работы системы. Имеют доступ напрямую к некоторым
сервисам ОС, т.е. являются привилегированными процессами.
Процессы сервисов (сервисы Win32). Иначе называются службами. Пример
— Планировщик задач. Работают в фоновом режиме, без интерактивного взаимодействия
с пользователем.
Пользовательские приложения. Бывают пяти видов: Win32, Windows 3.1,
MS-DOS, POSIX и OS/2.
Подсистемы окружения. Образуют окружение операционной среды, предоставляя
сервисы ОС. Существует 3 подсистемы: Win32, POSIX и OS/2.
Обратите внимание на прямоугольник с DLL-подсистем. Дело в том, что
процессы пользовательского режима не могут вызывать сервисы ядра ОС напрямую,
вместо этого они используют DLL (Dynamically Loadable Library — динамически
загружаемая библиотека) соответствующих подсистем окружения.
Компоненты режима ядра
Исполнительная система. Содержит базовые сервисы ОС (управление памятью,
процессами и потоками, защиту, ввод/вывод и взаимодействие между процессами).
Ядро — низкоуровневые функции ОС (планирование потоков, диспетчеризация
прерываний и исключений и т.д.). Предоставляет набор процедур и базовых
объектов исполнительной системе для реализации более сложных структур.
Драйверы устройств. Драйверы как аппаратных устройств, транслирующих
стандартные запросы программ в специфичные запросы ввода/вывода к конкретному
оборудованию, так и сетевые драйверы и драйверы файловых систем.
Уровень абстрагирования от оборудования. Изолирует другие компоненты
режима ядра от специфики оборудования данной платформы.
Подсистема поддержки окон и графики. Реализует функции графического
интерфейса пользователя (GUI). Обеспечивает поддержку окон, элементов управления
пользовательского интерфейса и отрисовку графики.
Тяжело в учении, легко в бою
К чему я все это вам рассказываю? Важно, чтобы пользователь понимал,
где произошел сбой, чтобы потом его устранить. Если вы знаете источник
ошибки, установить причину и ликвидировать ее не составит особого труда.
Для примера приведу случай, произошедший со мной полгода назад. У одного
моего знакомого на довольно мощной машине стояла Windows XP Home Edition.
ОС я устанавливал сам, так что за ее работоспособность отвечал тоже я.
Сам знакомый и вся его семья в компьютерах разбирается довольно слабо,
но знаний для набора текста и работы с Интернетом хватает. Однажды мне
позвонил этот товарищ и рассказал грустную историю примерно такого содержания.
Установил он себе WarCraft III, начал играться, но, как только к нему приближалось
вражеское войско, машина перезагружалась. Как будет рассуждать неосведомленный
в архитектуре ОС пользователь: ага, машина перезагружается — значит, глючит
либо игрушка (что скорее всего), либо Windows (как надоело это глюкало!).
Методы решения проблемы: переустанавливаем игру, не помогло — переустанавливаем
Windows, снова не помогло — удаляем либо игру, либо Windows (и наслаждаемся
жизнью;)). А вот логическая цепочка знающего пользователя (моя в данном
случае): компьютер перезагружается — значит, возникает серьезная ошибка
класса STOP, что приводит к появлению BSOD (Синего Экрана Смерти), но так
как в опциях системы по умолчанию стоит перезагрузка при таких ошибках,
то синего экрана мы не видим. Эту версию подтверждает сообщение после сброса
и запись в системном журнале. Далее: ошибки подобного рода могут возникать
только в коде, работающем в режиме ядра, т.е. либо в исполнительной системе
ОС (что маловероятно), либо в драйверах устройств. Информацию о сбойном
драйвере можно получить в системном журнале. Я же просто просмотрел в шестнадцатеричном
вьювере (Lister в Total Commander) файл дампа сбойного участка памяти (он
(файл) находится в папке %SystemRoot%\Minidump), где после ключевого слова
STOP и параметров ошибки были перечислены загруженные драйверы, а перед
ними шел наш виновник. Им оказался драйвер интегрированной звуковой карты.
Покопавшись в настройках игрушки, я обнаружил опцию Использовать 3D звук
(вроде так, а может, Использовать EAX). Тут мне стала ясна вся картина
происшедшего. Игра при появлении новых юнитов на горизонте пыталась сыграть
их звук, используя 3D-возможности аудиокарты, но либо сама плата такими
возможностями не обладает, либо они криво реализованы в плате или в драйвере
— в любом случае это приводило к плачевным последствиям. Варианты решения
данной проблемы: сменить драйвер или аудиокарту либо отключить 3D-звук
в игре. Я как ленивый человек выбрал последний вариант. В итоге все заработало
без проблем. Думаю, этот поучительный случай заставит вас логически думать
при возникновении подобных проблем.
В Сибирь...
А вот и обещанные ссылки:
http://support.microsoft.com/support
— техническая поддержка продуктов фирмы Microsoft. Microsoft Know-ledge
Base — база данных проблем и их решений, FAQ, бесплатные программы, обновления
и исправления, on-line-поддержка, телефоны.
http://www.microsoft.com/hcl
— MS Win-dows 2000 Hardware Compatibility List.
http://www.ntfaq.com или http://www.windows2000faq.com
— обширный FAQ по NT/2000. Множество хорошо структурированных вопросов
различной тематики.
http://www.ntcompatible.com
— FAQ по NT/2000, XP. Списки совместимых с NT/2000 приложений, игр и оборудования.
Советы по устранению неполадок, если таковые имеются. Ссылки, новости,
обзоры.
http://www.swynk.com/windows
— статьи о специфике работы в Win-dows NT/2000. Обсуждение наиболее распространенных
вариантов применения этих ОС и решение возникающих при этом проблем. Скрипты,
ссылки на форумы и другие ресурсы.
http://www.kellys-korner-xp.com
— Windows XP from A to Z. Очень много полезных советов.
Best regards!
|