Автор: Марка Майнази
[li] Архитектура
Разработка любой ОС предполагает компромиссные решения, поэтому ни одна из операционных систем не удовлетворяет всем требованиям каждого отдельного пользователя. Знакомство с компромиссами Windows XP Professional поможет лучше понять эту ОС.
Почти все современные процессоры позволяют установить режим работы приложения - Kernel (ядро) или User (пользователь). В режиме ядра приложению кроме прочего разрешено выделение памяти всем другим приложениям. Изменить важные данные в памяти компьютера может только приложение, работающее в режиме ядра. К этим данным относятся таблицы, содержащие сведения о границах областей памяти, выделенных всем остальным приложениям и сведения о запросах приложений на дополнительные области памяти. Вполне понятно, что такие таблицы служат основой защиты памяти.
После установки границ, ОС проверяет любые запросы приложения на доступ к памяти по таблице границ. ОС либо разрешает операцию модификации ячейки памяти, либо декларирует ошибку доступа к памяти - memory access fault.
Таблицу границ областей памяти может изменять только приложение, работающее в режиме ядра. Главное отличие режима ядра от пользовательского режима состоит в том, что в первом случае приложение устанавливает границы памяти, а во втором случае - работает в этих границах.
Windows XP Professional на процессоре Intel пользуется двумя режимами: уровень 0 (Kernel) и уровень 3 (User). Уровни 1 и 2 не используются, поскольку процессоры RISC поддерживают только два уровня привилегий, а ОС обязана работать (хотя бы теоретически) и на других процессорах, в том числе и на 32-х или 64-разрядных процессорах Intel.
Концепция уровней защиты памяти проста, но служит фундаментом архитектуры Windows XP Professional, поскольку определяет принципы защиты приложения от действий всех остальных программ.
В Windows XP Professional реализовано жесткое правило: ни под каким видом не позволять прикладным программ работать на уровне 0 (то есть в режиме ядра). Как только приложение пытается обратиться в чужую область, ОС тут же выявляет ошибку доступа к памяти и прекращает работу приложения.
ОС не может защитить приложение от самого себя. Если приложение случайно перезаписывает собственный блок памяти, то Windows XP Professional, скорее всего, никак не отреагирует на это нарушение. Однако программисты могут использовать встроенные в ОС средства защиты памяти и применять их для разработки более стабильного приложения.
Мы еще не раз вернемся в этой главе к сравнению режимов Kernel и User, но уже сейчас можно отметить основные принципы использования этих режимов в Windows XP Professional:
* Приложение в пользовательском режиме способно обращаться только к памяти, предоставленной операционной системой. По сути, приложение "ограничено" в вопросах выделения памяти, поэтому крах приложения действует только на само приложение.
* Приложение в режиме ядра способно выделять и обращаться к любой области памяти компьютера. Если оно сойдет с ума, то способно повредить любую исполняемую компьютером программу.
Независимость от архитектуры
Когда Дейв Калтер (Dave Cutler) и еще несколько бывших сотрудников компании Digital Equipment Corporation начали работу над системой NT (а было это в 1989 году), основным требованием к новой ОС стала работа практически на любом известном в то время микропроцессоре. Система должна была стать очень гибкой, но реализовать такое требование оказалось не так просто. Создать "обобщенную" ОС гораздо сложнее, чем разработать "специализированную" ОС для вполне определенного процессора. Однако было решено реализовать "независимость от архитектуры" процессора, что существенно повлияло на архитектуру всех систем NT, в том числе и на архитектуру Windows XP Professional.
Минимальные требования к процессору
Итак, насколько независимой от архитектуры стала Windows XP Professional? Не все процессоры способны исполнять эту ОС, но достойный этой системы кандидат должен быть таким:
* регистры данных - 32-разряда или больше
* регистры адресов памяти - не менее 32-разрядов
* реализация модели защиты памяти
* не менее двух уровней привилегий для процессора (режимы Kernel и User)
* способность управления доступом к любому блоку памяти любого процесса
и реализация следующих операций:
* запрет/разрешение любому процессу читать любой блок памяти
* запрет/разрешение любому процессу записывать в любой блок памяти
* запрет/разрешение любому процессу работать в любом блоке памяти.
* страничная организация памяти (то есть, поддержка процессором виртуальной памяти).
Всем этим требованиям удовлетворяют все современные процессоры.
Основы архитектуры Windows XP Professional: HAL, ядро и драйверы
Чтобы сделать Windows XP Professional как можно меньше зависимой от архитектуры процессора, корпорация Microsoft сократила объем кода ОС, привязанного к специфике оборудования. При переносе на другую платформу меняются только три части ОС:
* уровень абстрагирования от оборудования (HAL, hal.dll)
* ядро ОС (ntoskrnl.exe)
* драйверы специфичных для данной платформы устройств (видеоплата, сетевой адаптер и мышь).
Рассмотрим подробнее каждый из этих компонентов ОС.
HAL
Уровень HAL (hardware abstraction layer, уровень абстрагирования от оборудования) обязан сгладить различия между разными моделями определенного семейства микропроцессоров. Все компьютеры имеют ОС с графическим интерфейсом, но на этом сходство заканчивается. Одни ОС в основном полагаются на векторы прерывания, другие на программируемый ввод/вывод и DMA. Другими словами, существуют огромные отличия даже между ПК на одном и том же процессоре.
Предназначение HAL состоит в сглаживании различий, чтобы ОС получила стандартный набор компьютерного оборудования. Реализован уровень HAL библиотекой hal.dll. Например, для компьютеров Apple Macintosh, Amiga и Atari 520 ST должны быть одинаковые ядра ОС, но разные уровни HAL.
Поставляемый с Windows XP Professional уровень HAL поддерживает два процессора. Теоретически NT обеспечивает 32 процессора, однако для этого потребуется другой HAL. Когда появится новое оборудование, например 256-разрядная версия шины PCI, в Windows XP Professional потребуется только новый уровень HAL для этого оборудования.
Ядро - не самое главное
Системы Unix построены по модульному принципу, так же как и Windows XP Professional, поэтому необходим "главный менеджер" операционной системы, который называется ядром (kernel). Этот термин используется в любой ОС, в том числе и в Windows XP Professional.
Основная задача ядра - планирование запуска задач на компьютере. Если одновременно работают несколько программ, то ядро выявляет программу с наибольшим приоритетом и запускает ее в первую очередь. Именно ядро несет ответственность за своевременную загрузку процессора.
Ядро управляет всеми подсистемами Windows XP Professional. Управление подсистемами приводит нас к концепции микроядра и модели клиент/сервер.
Драйверы
В ОС необходима поддержка отдельных частей оборудования компьютера. Компания Microsoft могла бы включить поддержку мыши Microsoft в ядро ОС, но это не слишком удачная идея. Если на компьютере будет мышь другой модели, то выделенная в ядре память окажется неиспользованной.
Поэтому в Windows XP Professional, как и во всех остальных ОС, поддержка оборудования распределена по программным модулям, называемым драйверами устройств (device driver). Многие руководства по Windows XP Professional не относят драйверы к аппаратно-зависимой части ОС.
Обычно драйверы пишут программисты из компаний-производителей оборудования, которые хуже знают ОС, чем ее создатели, и поэтому мы получаем некачественные драйверы.
Часто драйверы работают в режиме ядра, поэтому приводят к краху ОС. Система стабильна, но не настолько, чтобы исправлять чужие ошибки.
Базовые уровни ОС
Большинство ОС для ПК построено по принципу деления на уровни, то есть программное обеспечение состоит из независимых частей, каждая из которых служит надстройкой над другой частью. Модули работы с оборудованием располагаются в самой нижней части структуры. Получается бутерброд между приложениями, которые хочет запускать пользователь, и оборудованием, которое должно исполнять приложения. Между этими частями ОС располагаются промежуточные уровни (слои). Основные уровни ОС: Приложения, Интерфейс API, Ядро, Драйверы устройств и Оборудование.
На самом нижнем уровне располагаются драйверы устройств, управляющие оборудованием компьютера. Интерфейс прикладного программирования (API) служит воротами в ОС для приложений. Когда приложению нужно создать файл, прочитать клавиатурный буфер или окрасить часть экрана в голубой цвет, необходимо обратиться к ОС через одну из функций API. Современные ОС поддерживают несколько наборов API, чтобы обеспечить обратную совместимость.
API - это опубликованный набор разрешенных задач, которые ОС может выполнять по запросам приложений (например, открытие файла, чтение с клавиатуры или завершение программы). Общаясь с компьютером необходимо явно указывать только разрешенные действия. Предположим, в одной ОС открытие файла производится командой DOSOPENFILE, в другой ОС такой командой может быть makefile. Обе команды инициируют одну и ту же операцию, но они различны в разных ОС, точно так же как приветствие HELLO по-разному звучит на разных языках.
Клиент/серверная ОС
Единственный недостаток предложенной выше модели связан с тем, что практически все приложения должны работать в режиме ядра. Это существенно усложняет создание защищенной ОС, особенно в сравнении с клиент/серверной моделью, которую называют еще архитектурой микроядра (название клиент/сервер показывает, что отдельные части ОС взаимодействуют между собой, так же как серверы и клиенты в сети).
В рассмотренной выше модели уровней ОС все приложения выполняются в режиме ядра, а в клиент/серверной модели в режиме ядра исполняется минимально возможная часть ОС (отсюда происходит приставка "микро" в названии микроядро). Все это предназначено для повышения надежности и стабильности.
Естественно, стабильности и надежности можно достичь простыми способами, например создать ОС без программных ошибок (это вряд ли выполнимо, поэтому есть второй путь). Другим методом будет использование встроенных в современные процессоры средств защиты памяти. Программам режима ядра разрешается захватывать любые области системной памяти, а программы пользовательского режима сидят в своих областях как в клетках, причем любая попытка нарушения границы автоматически диагностируется процессором.
Причина использования клиент/серверной модели состоит в минимизации объема кода, работающего в режиме ядра. Обратной стороной модели становится снижение производительности.
Цена перехода на модель клиент/сервер
Для переключения между режимом ядра и пользовательским режимом процессору требуется несколько десятков микросекунд. Может показаться, что это немного, но процессор 1000 МГц успевает выполнить за 10 микросекунд 10 000 инструкций. Поэтому постоянное переключение режимов существенно снижает производительность системы.
Модули пользовательского режима не видят друг друга и не могут напрямую взаимодействовать между собой. Для обмена данными потребуется смена режима. Предположим, приложение хочет прочитать клавиатурный буфер. Для этого оно вызывает функцию API, поскольку это единственный разрешенный метод запроса к ОС. В обычной системе с базовыми уровнями на этом бы все и закончилось, но в системе с микроядром взаимодействие реализовано сложнее.
Вместо прямого вызова API приложение обращается к модулю микроядра, который обслуживает пересылку сообщений (в Windows XP Professional он называется LPC - Local Procedure Call, запрос локальной процедуры). В API запрос поступает из вспомогательного модуля, а не от приложения.
Сообщение отправляется из приложения, пересекает границу User/Kernel и попадает в модуль LPC. Откуда через границу User/Kernel возвращается в API. Функция API запрашивает у ОС выполнение операции, что еще раз приведет к переключению режима. Таким образом, доступ к сети, файловой системе, экрану или пользовательскому интерфейсу предполагает многократное переключение режимов работы процессора.
Компромиссное решение в системах NT
Строгое соответствие модели микроядра - весьма неэффективное решение, приводящее к многочисленному переключению режима работы процессора. В Windows XP Professional использована модифицированная модель микроядра, в котором в режиме ядра над модулями HAL и Ядро появляется дополнительный уровень - Службы исполнения, связанный с подсистемой безопасности и виртуальными машинами, реализующими выполнение программ, написанных для определенной вычислительной среды (MS DOS, Win3.x, Win32 и еще несколько экзотических вариантов).
Термином "службы исполнения Windows XP Professional" обозначают все новые модули, которые работают в режиме ядра. Иногда вместо слова "служба" используют слово "функция".
В пользовательском режиме работают подсистемы OS/2, POSIX, DOS/Windows 3.1 и клиент/серверная Win32 (ее обычно называют CSRSS). Это важные части ОС, но по многих причинам они помещены в режим User.
В любой ОС необходимо отделить приложения от кода системы, поскольку в общем случае нельзя доверять любому запущенному в ОС приложению. Однако чтобы упростить доступ из приложения к функциям нижнего уровня ОС придется иметь маленькие приложения и очень быструю операционную систему. Исполнение приложений OS/2 или Windows 3.1 обязывает ОС концентрировать эти приложения в рамках специальных подсистем. ОС делает все, чтобы приложения считали, что они выполняются в "родной" ОС, а не в подсистеме, эмулирующей эту ОС внутри Windows XP Professional.
Разумеется, любое приложение в Windows XP Professional пользуется и ограничено в рамках программного интерфейса ОС. Подсистемы других программных сред преобразуют запросы к системам OS/2, MS DOS, Windows 3.1 или POSIX в эквивалентные запросы к Windows XP Professional и передают эти запросы системе исполнения. Границей действия запроса становится подсистема Win32 (CSRSS).
Еще раз хочется подчеркнуть, что за гибридную клиент/серверную модель Windows 2000 приходится расплачиваться производительностью.
Насколько хорош компромисс микроядра?
Причиной перехода к модели микроядра (клиент/серверной структуре) является увеличение стабильности ОС за счет перемещения драйверов и подсистем в пользовательским режим (уровень 3 в процессорах Intel). Крах этих программных модулей, нарушит только их собственную работу.
Естественно, это спорное решение. Предположим, что закончилась крахом работа драйвера клавиатуры, исполнявшегося в режиме User. Это крах не затрагивает модули ОС, работающие в режиме Kernel. Операционная система проложит функционирование, но что с ней делать без клавиатуры?
На эту критику есть свои возражения. Иногда имеет смысл работа ОС и без клавиатуры. В Windows серверный процесс продолжает функционирование, пока ему не понадобиться ввод с клавиатуры. Однако можно завершить работу процесса (не завершая работы всей ОС ) и перезагрузить этот процесс, и не перезапускать всю ОС из-за одного некорректного драйвера.
Наибольший уровень стабильности достигается тогда, когда все приложения работают в режиме User, а все модули ОС - в режиме Kernel, однако это справедливо только для хорошо отлаженных и безошибочно работающих ОС.
Все вышеизложенное относится в равной степени и к системам NT от версии 4. Начиная с этой версии "родная" программная среда (Win32 API) была перенесена из режима User в режим Kernel.
Корпорация Microsoft объясняла это решение увеличением производительности NT в качестве ОС для рабочей станции. Анимационные программы для Windows 3.1 очень медленно работали в Windows NT 3.51, но их скорость в NT Workstation 4 стала такой же, как в Windows 95. Заметим, что быстродействия Windows XP Professional вполне хватает для компьютерных игр.
В режим ядра были перемещены три части ОС:
* USER (менеджер пользовательского интерфейса)
* GDI (менеджер графики)
* Драйвер видеоплаты.
Модуль USER запускается в ответ на щелчок или перетаскивание управляющего элемента (окно, кнопка, бегунок, переключатель, флажок, список, раскрывающийся список или панель инструментов). Модуль GDI обеспечивает низкоуровневые функции графического пользовательского интерфейса. В этом модуле обрабатываются растры, цвета, виды курсора, значки и шрифты. Когда текстовому процессору нужно вывести строку шрифтом Times Roman, то символы на экран помещает GDI.
USER и GDI являются важными и неотъемлемыми, а также хорошо отлаженными частями ОС, поэтому оправдано перемещение этих модулей в режим ядра. Однако с драйверами совсем другая история.
В предыдущих версиях NT драйвер видеоплаты не мог "убить" NT, однако в NT 4 (и в Windows XP Professional) он перенесен в режим ядра и ситуация изменилась. В случае краха драйвера возникает вопрос: "Как использовать ОС, не видя ничего на экране компьютера?". Ответ тот же, что и раньше - система редко обращается к драйверу дисплея, поэтому сервер может продолжить работу даже с неверным изображением на мониторе. Мы уже выполнили вход в систему, поэтому дополнительной работы для драйвера не предвидится, особенно на файловом сервере.
Причины появления неудачных драйверов понятны, но что должен предпринять обычный пользователь компьютера? Решение корпорации Microsoft о переносе подсистемы Win32 в режим ядра подкреплено единственным средством поддержания стабильности NT 4 - списком совместимого оборудования (HCL). Перечисленные в нем видео платы должны вызвать у пользователя больше доверия.
Перенос драйверов графических плат и принтеров в режим ядра - неудачная затея, но Microsoft обеспечила для Windows XP Professional несколько программных инструментов, помогающих во время разработки драйверов. Поэтому в Windows XP Professional компоненты режима ядра стали стабильнее и сократилось число причин для появления "голубого экрана", однако модули пользовательского режима остались на прежнем уровне надежности (ведь их крах не сказывается на работе Windows XP Professional в целом).
[li] Архитектура
Разработка любой ОС предполагает компромиссные решения, поэтому ни одна из операционных систем не удовлетворяет всем требованиям каждого отдельного пользователя. Знакомство с компромиссами Windows XP Professional поможет лучше понять эту ОС.
Почти все современные процессоры позволяют установить режим работы приложения - Kernel (ядро) или User (пользователь). В режиме ядра приложению кроме прочего разрешено выделение памяти всем другим приложениям. Изменить важные данные в памяти компьютера может только приложение, работающее в режиме ядра. К этим данным относятся таблицы, содержащие сведения о границах областей памяти, выделенных всем остальным приложениям и сведения о запросах приложений на дополнительные области памяти. Вполне понятно, что такие таблицы служат основой защиты памяти.
После установки границ, ОС проверяет любые запросы приложения на доступ к памяти по таблице границ. ОС либо разрешает операцию модификации ячейки памяти, либо декларирует ошибку доступа к памяти - memory access fault.
Таблицу границ областей памяти может изменять только приложение, работающее в режиме ядра. Главное отличие режима ядра от пользовательского режима состоит в том, что в первом случае приложение устанавливает границы памяти, а во втором случае - работает в этих границах.
Windows XP Professional на процессоре Intel пользуется двумя режимами: уровень 0 (Kernel) и уровень 3 (User). Уровни 1 и 2 не используются, поскольку процессоры RISC поддерживают только два уровня привилегий, а ОС обязана работать (хотя бы теоретически) и на других процессорах, в том числе и на 32-х или 64-разрядных процессорах Intel.
Концепция уровней защиты памяти проста, но служит фундаментом архитектуры Windows XP Professional, поскольку определяет принципы защиты приложения от действий всех остальных программ.
В Windows XP Professional реализовано жесткое правило: ни под каким видом не позволять прикладным программ работать на уровне 0 (то есть в режиме ядра). Как только приложение пытается обратиться в чужую область, ОС тут же выявляет ошибку доступа к памяти и прекращает работу приложения.
ОС не может защитить приложение от самого себя. Если приложение случайно перезаписывает собственный блок памяти, то Windows XP Professional, скорее всего, никак не отреагирует на это нарушение. Однако программисты могут использовать встроенные в ОС средства защиты памяти и применять их для разработки более стабильного приложения.
Мы еще не раз вернемся в этой главе к сравнению режимов Kernel и User, но уже сейчас можно отметить основные принципы использования этих режимов в Windows XP Professional:
* Приложение в пользовательском режиме способно обращаться только к памяти, предоставленной операционной системой. По сути, приложение "ограничено" в вопросах выделения памяти, поэтому крах приложения действует только на само приложение.
* Приложение в режиме ядра способно выделять и обращаться к любой области памяти компьютера. Если оно сойдет с ума, то способно повредить любую исполняемую компьютером программу.
Независимость от архитектуры
Когда Дейв Калтер (Dave Cutler) и еще несколько бывших сотрудников компании Digital Equipment Corporation начали работу над системой NT (а было это в 1989 году), основным требованием к новой ОС стала работа практически на любом известном в то время микропроцессоре. Система должна была стать очень гибкой, но реализовать такое требование оказалось не так просто. Создать "обобщенную" ОС гораздо сложнее, чем разработать "специализированную" ОС для вполне определенного процессора. Однако было решено реализовать "независимость от архитектуры" процессора, что существенно повлияло на архитектуру всех систем NT, в том числе и на архитектуру Windows XP Professional.
Минимальные требования к процессору
Итак, насколько независимой от архитектуры стала Windows XP Professional? Не все процессоры способны исполнять эту ОС, но достойный этой системы кандидат должен быть таким:
* регистры данных - 32-разряда или больше
* регистры адресов памяти - не менее 32-разрядов
* реализация модели защиты памяти
* не менее двух уровней привилегий для процессора (режимы Kernel и User)
* способность управления доступом к любому блоку памяти любого процесса
и реализация следующих операций:
* запрет/разрешение любому процессу читать любой блок памяти
* запрет/разрешение любому процессу записывать в любой блок памяти
* запрет/разрешение любому процессу работать в любом блоке памяти.
* страничная организация памяти (то есть, поддержка процессором виртуальной памяти).
Всем этим требованиям удовлетворяют все современные процессоры.
Основы архитектуры Windows XP Professional: HAL, ядро и драйверы
Чтобы сделать Windows XP Professional как можно меньше зависимой от архитектуры процессора, корпорация Microsoft сократила объем кода ОС, привязанного к специфике оборудования. При переносе на другую платформу меняются только три части ОС:
* уровень абстрагирования от оборудования (HAL, hal.dll)
* ядро ОС (ntoskrnl.exe)
* драйверы специфичных для данной платформы устройств (видеоплата, сетевой адаптер и мышь).
Рассмотрим подробнее каждый из этих компонентов ОС.
HAL
Уровень HAL (hardware abstraction layer, уровень абстрагирования от оборудования) обязан сгладить различия между разными моделями определенного семейства микропроцессоров. Все компьютеры имеют ОС с графическим интерфейсом, но на этом сходство заканчивается. Одни ОС в основном полагаются на векторы прерывания, другие на программируемый ввод/вывод и DMA. Другими словами, существуют огромные отличия даже между ПК на одном и том же процессоре.
Предназначение HAL состоит в сглаживании различий, чтобы ОС получила стандартный набор компьютерного оборудования. Реализован уровень HAL библиотекой hal.dll. Например, для компьютеров Apple Macintosh, Amiga и Atari 520 ST должны быть одинаковые ядра ОС, но разные уровни HAL.
Поставляемый с Windows XP Professional уровень HAL поддерживает два процессора. Теоретически NT обеспечивает 32 процессора, однако для этого потребуется другой HAL. Когда появится новое оборудование, например 256-разрядная версия шины PCI, в Windows XP Professional потребуется только новый уровень HAL для этого оборудования.
Ядро - не самое главное
Системы Unix построены по модульному принципу, так же как и Windows XP Professional, поэтому необходим "главный менеджер" операционной системы, который называется ядром (kernel). Этот термин используется в любой ОС, в том числе и в Windows XP Professional.
Основная задача ядра - планирование запуска задач на компьютере. Если одновременно работают несколько программ, то ядро выявляет программу с наибольшим приоритетом и запускает ее в первую очередь. Именно ядро несет ответственность за своевременную загрузку процессора.
Ядро управляет всеми подсистемами Windows XP Professional. Управление подсистемами приводит нас к концепции микроядра и модели клиент/сервер.
Драйверы
В ОС необходима поддержка отдельных частей оборудования компьютера. Компания Microsoft могла бы включить поддержку мыши Microsoft в ядро ОС, но это не слишком удачная идея. Если на компьютере будет мышь другой модели, то выделенная в ядре память окажется неиспользованной.
Поэтому в Windows XP Professional, как и во всех остальных ОС, поддержка оборудования распределена по программным модулям, называемым драйверами устройств (device driver). Многие руководства по Windows XP Professional не относят драйверы к аппаратно-зависимой части ОС.
Обычно драйверы пишут программисты из компаний-производителей оборудования, которые хуже знают ОС, чем ее создатели, и поэтому мы получаем некачественные драйверы.
Часто драйверы работают в режиме ядра, поэтому приводят к краху ОС. Система стабильна, но не настолько, чтобы исправлять чужие ошибки.
Базовые уровни ОС
Большинство ОС для ПК построено по принципу деления на уровни, то есть программное обеспечение состоит из независимых частей, каждая из которых служит надстройкой над другой частью. Модули работы с оборудованием располагаются в самой нижней части структуры. Получается бутерброд между приложениями, которые хочет запускать пользователь, и оборудованием, которое должно исполнять приложения. Между этими частями ОС располагаются промежуточные уровни (слои). Основные уровни ОС: Приложения, Интерфейс API, Ядро, Драйверы устройств и Оборудование.
На самом нижнем уровне располагаются драйверы устройств, управляющие оборудованием компьютера. Интерфейс прикладного программирования (API) служит воротами в ОС для приложений. Когда приложению нужно создать файл, прочитать клавиатурный буфер или окрасить часть экрана в голубой цвет, необходимо обратиться к ОС через одну из функций API. Современные ОС поддерживают несколько наборов API, чтобы обеспечить обратную совместимость.
API - это опубликованный набор разрешенных задач, которые ОС может выполнять по запросам приложений (например, открытие файла, чтение с клавиатуры или завершение программы). Общаясь с компьютером необходимо явно указывать только разрешенные действия. Предположим, в одной ОС открытие файла производится командой DOSOPENFILE, в другой ОС такой командой может быть makefile. Обе команды инициируют одну и ту же операцию, но они различны в разных ОС, точно так же как приветствие HELLO по-разному звучит на разных языках.
Клиент/серверная ОС
Единственный недостаток предложенной выше модели связан с тем, что практически все приложения должны работать в режиме ядра. Это существенно усложняет создание защищенной ОС, особенно в сравнении с клиент/серверной моделью, которую называют еще архитектурой микроядра (название клиент/сервер показывает, что отдельные части ОС взаимодействуют между собой, так же как серверы и клиенты в сети).
В рассмотренной выше модели уровней ОС все приложения выполняются в режиме ядра, а в клиент/серверной модели в режиме ядра исполняется минимально возможная часть ОС (отсюда происходит приставка "микро" в названии микроядро). Все это предназначено для повышения надежности и стабильности.
Естественно, стабильности и надежности можно достичь простыми способами, например создать ОС без программных ошибок (это вряд ли выполнимо, поэтому есть второй путь). Другим методом будет использование встроенных в современные процессоры средств защиты памяти. Программам режима ядра разрешается захватывать любые области системной памяти, а программы пользовательского режима сидят в своих областях как в клетках, причем любая попытка нарушения границы автоматически диагностируется процессором.
Причина использования клиент/серверной модели состоит в минимизации объема кода, работающего в режиме ядра. Обратной стороной модели становится снижение производительности.
Цена перехода на модель клиент/сервер
Для переключения между режимом ядра и пользовательским режимом процессору требуется несколько десятков микросекунд. Может показаться, что это немного, но процессор 1000 МГц успевает выполнить за 10 микросекунд 10 000 инструкций. Поэтому постоянное переключение режимов существенно снижает производительность системы.
Модули пользовательского режима не видят друг друга и не могут напрямую взаимодействовать между собой. Для обмена данными потребуется смена режима. Предположим, приложение хочет прочитать клавиатурный буфер. Для этого оно вызывает функцию API, поскольку это единственный разрешенный метод запроса к ОС. В обычной системе с базовыми уровнями на этом бы все и закончилось, но в системе с микроядром взаимодействие реализовано сложнее.
Вместо прямого вызова API приложение обращается к модулю микроядра, который обслуживает пересылку сообщений (в Windows XP Professional он называется LPC - Local Procedure Call, запрос локальной процедуры). В API запрос поступает из вспомогательного модуля, а не от приложения.
Сообщение отправляется из приложения, пересекает границу User/Kernel и попадает в модуль LPC. Откуда через границу User/Kernel возвращается в API. Функция API запрашивает у ОС выполнение операции, что еще раз приведет к переключению режима. Таким образом, доступ к сети, файловой системе, экрану или пользовательскому интерфейсу предполагает многократное переключение режимов работы процессора.
Компромиссное решение в системах NT
Строгое соответствие модели микроядра - весьма неэффективное решение, приводящее к многочисленному переключению режима работы процессора. В Windows XP Professional использована модифицированная модель микроядра, в котором в режиме ядра над модулями HAL и Ядро появляется дополнительный уровень - Службы исполнения, связанный с подсистемой безопасности и виртуальными машинами, реализующими выполнение программ, написанных для определенной вычислительной среды (MS DOS, Win3.x, Win32 и еще несколько экзотических вариантов).
Термином "службы исполнения Windows XP Professional" обозначают все новые модули, которые работают в режиме ядра. Иногда вместо слова "служба" используют слово "функция".
В пользовательском режиме работают подсистемы OS/2, POSIX, DOS/Windows 3.1 и клиент/серверная Win32 (ее обычно называют CSRSS). Это важные части ОС, но по многих причинам они помещены в режим User.
В любой ОС необходимо отделить приложения от кода системы, поскольку в общем случае нельзя доверять любому запущенному в ОС приложению. Однако чтобы упростить доступ из приложения к функциям нижнего уровня ОС придется иметь маленькие приложения и очень быструю операционную систему. Исполнение приложений OS/2 или Windows 3.1 обязывает ОС концентрировать эти приложения в рамках специальных подсистем. ОС делает все, чтобы приложения считали, что они выполняются в "родной" ОС, а не в подсистеме, эмулирующей эту ОС внутри Windows XP Professional.
Разумеется, любое приложение в Windows XP Professional пользуется и ограничено в рамках программного интерфейса ОС. Подсистемы других программных сред преобразуют запросы к системам OS/2, MS DOS, Windows 3.1 или POSIX в эквивалентные запросы к Windows XP Professional и передают эти запросы системе исполнения. Границей действия запроса становится подсистема Win32 (CSRSS).
Еще раз хочется подчеркнуть, что за гибридную клиент/серверную модель Windows 2000 приходится расплачиваться производительностью.
Насколько хорош компромисс микроядра?
Причиной перехода к модели микроядра (клиент/серверной структуре) является увеличение стабильности ОС за счет перемещения драйверов и подсистем в пользовательским режим (уровень 3 в процессорах Intel). Крах этих программных модулей, нарушит только их собственную работу.
Естественно, это спорное решение. Предположим, что закончилась крахом работа драйвера клавиатуры, исполнявшегося в режиме User. Это крах не затрагивает модули ОС, работающие в режиме Kernel. Операционная система проложит функционирование, но что с ней делать без клавиатуры?
На эту критику есть свои возражения. Иногда имеет смысл работа ОС и без клавиатуры. В Windows серверный процесс продолжает функционирование, пока ему не понадобиться ввод с клавиатуры. Однако можно завершить работу процесса (не завершая работы всей ОС ) и перезагрузить этот процесс, и не перезапускать всю ОС из-за одного некорректного драйвера.
Наибольший уровень стабильности достигается тогда, когда все приложения работают в режиме User, а все модули ОС - в режиме Kernel, однако это справедливо только для хорошо отлаженных и безошибочно работающих ОС.
Все вышеизложенное относится в равной степени и к системам NT от версии 4. Начиная с этой версии "родная" программная среда (Win32 API) была перенесена из режима User в режим Kernel.
Корпорация Microsoft объясняла это решение увеличением производительности NT в качестве ОС для рабочей станции. Анимационные программы для Windows 3.1 очень медленно работали в Windows NT 3.51, но их скорость в NT Workstation 4 стала такой же, как в Windows 95. Заметим, что быстродействия Windows XP Professional вполне хватает для компьютерных игр.
В режим ядра были перемещены три части ОС:
* USER (менеджер пользовательского интерфейса)
* GDI (менеджер графики)
* Драйвер видеоплаты.
Модуль USER запускается в ответ на щелчок или перетаскивание управляющего элемента (окно, кнопка, бегунок, переключатель, флажок, список, раскрывающийся список или панель инструментов). Модуль GDI обеспечивает низкоуровневые функции графического пользовательского интерфейса. В этом модуле обрабатываются растры, цвета, виды курсора, значки и шрифты. Когда текстовому процессору нужно вывести строку шрифтом Times Roman, то символы на экран помещает GDI.
USER и GDI являются важными и неотъемлемыми, а также хорошо отлаженными частями ОС, поэтому оправдано перемещение этих модулей в режим ядра. Однако с драйверами совсем другая история.
В предыдущих версиях NT драйвер видеоплаты не мог "убить" NT, однако в NT 4 (и в Windows XP Professional) он перенесен в режим ядра и ситуация изменилась. В случае краха драйвера возникает вопрос: "Как использовать ОС, не видя ничего на экране компьютера?". Ответ тот же, что и раньше - система редко обращается к драйверу дисплея, поэтому сервер может продолжить работу даже с неверным изображением на мониторе. Мы уже выполнили вход в систему, поэтому дополнительной работы для драйвера не предвидится, особенно на файловом сервере.
Причины появления неудачных драйверов понятны, но что должен предпринять обычный пользователь компьютера? Решение корпорации Microsoft о переносе подсистемы Win32 в режим ядра подкреплено единственным средством поддержания стабильности NT 4 - списком совместимого оборудования (HCL). Перечисленные в нем видео платы должны вызвать у пользователя больше доверия.
Перенос драйверов графических плат и принтеров в режим ядра - неудачная затея, но Microsoft обеспечила для Windows XP Professional несколько программных инструментов, помогающих во время разработки драйверов. Поэтому в Windows XP Professional компоненты режима ядра стали стабильнее и сократилось число причин для появления "голубого экрана", однако модули пользовательского режима остались на прежнем уровне надежности (ведь их крах не сказывается на работе Windows XP Professional в целом).