Переносимость операционной системы

ОС называют переносимой (portable), или мобильной, если ее код может быть сравнительно легко перенесен с аппаратной платформы одного типа на аппаратную платформу другого типа.

Хотя ОС часто описываются либо как переносимые, либо как непереносимые, мобильность - это понятие степени. Вопрос не в том, может ли быть система перенесена, а в том, насколько легко можно это сделать. Для того чтобы обеспечить свойство мобильности ОС, разработчики должны следовать правилам.

1. Большая часть кода должна быть написана на языке, трансляторы которого имеются на всех аппаратных платформах, куда предполагается переносить систему. Такими языками являются стандартизованные языки высокого уровня (язык С). Программа, написанная на ассемблере, является переносимой только в тех случаях, когда перенос операционной системы планируется на компьютер, обладающий той же системой команд. В остальных случаях ассемблер используется только для тех непереносимых частей системы, которые должны непосредственно взаимодействовать с аппаратурой (например, обработчик прерываний), или для частей, которые требуют максимальной скорости (например, целочисленная арифметика повышенной точности).

2. Объем машинно-зависимых частей кода, непосредственно взаимодействующих с аппаратными средствами, должен быть по возможности минимизирован. Следует избегать прямого манипулирования регистрами и другими аппаратными средствами процессора.

3. Аппаратно-зависимый код должен быть надежно изолирован в нескольких модулях, а не быть распределен по всей системе. Изоляции подлежат все части ОС, которые отражают специфику процессора и аппаратной платформы в целом. Низкоуровневые компоненты ОС должны быть оформлены в виде компактных модулей, которые могут быть заменены аналогичными модулями для других аппаратных платформ.

В идеале слой машинно-зависимых компонентов ядра полностью экранирует остальную часть ОС от деталей аппаратной платформы, для того набора платформ, который поддерживает данная ОС.

В результате происходит подмена реальной аппаратуры некой унифицированной виртуальной машиной, одинаковой для всех вариантов аппаратной платформы. Все слои операционной системы, которые лежат выше слоя машинно-зависимых компонентов, могут быть написаны для управления именно этой виртуальной аппаратурой. Таким образом, у разработчиков появляется возможность создавать один вариант машинно-независимой части ОС (включая компоненты ядра, утилиты, системные обрабатывающие программы) для всего набора поддерживаемых платформ.

 

Монолитное ядро — классическая и наиболее распространённая архитектура ядер. Все части монолитного ядра работают в одном адресном пространстве.

Монолитные ядра имеют долгую историю развития и усовершенствования и являются наиболее архитектурно развитыми и пригодными к эксплуатации. Монолитность ядер усложняет их отладку, понимание кода ядра, добавление новых функций и возможностей, удаление ненужного кода от предыдущих версий. Увеличение кода монолитных ядер также повышает требования к объёму оперативной памяти, требуемому для функционирования ядра ОС. Это делает монолитные ядерные архитектуры мало пригодными к эксплуатации в системах, сильно ограниченных по объёму ОЗУ, например, встраиваемых системах, производственных микроконтроллерах и т. д.

Альтернатива монолитным ядрам – микроядерная архитектура.

Старые монолитные ядра требовали перекомпиляции при любом изменении состава оборудования. Большинство современных ядер позволяют динамически во время работы подгружать модули, выполняющие части функции ядра. Такие ядра - модульные ядра. Возможность динамической загрузки модулей не нарушает монолитности архитектуры ядра, так как динамически подгружаемые модули загружаются в адресное пространство ядра и работают как часть ядра. Не следует путать модульность ядра с гибридной или микроядерной архитектурой.

Достоинства: Скорость работы, упрощённая разработка модулей.

Недостатки: Поскольку всё ядро работает в одном адресном пространстве, сбой в одном из компонентов может нарушить работоспособность всей системы.

Примеры: Традиционные ядра UNIX, такие как BSD; Linux.

Модульное ядро - современная, усовершенствованная модификация архитектуры монолитных ядер.

В отличие от «классических» монолитных ядер, считающихся ныне устаревшими, модульные ядра обычно не требуют перекомпиляции ядра при изменении состава аппаратного обеспечения компьютера. Вместо этого модульные ядра предоставляют некоторый механизм загрузки модулей ядра, поддерживающих аппаратное обеспечение (например, драйверов). Подгрузка модулей может быть как динамической (выполняемой «на лету», без перезагрузки ОС, в работающей системе), так и статической (выполняемой при перезагрузке ОС после переконфигурирования системы на загрузку нужных модулей).

Все модули ядра работают в адресном пространстве ядра и могут пользоваться всеми функциями ядра. Поэтому модульные ядра продолжают оставаться монолитными.

Модульные ядра удобнее для разработки, чем традиционные монолитные ядра, не поддерживающие динамическую загрузку модулей, так как не требуется многократная полная перекомпиляция ядра при работе над какой-либо его подсистемой или драйвером. Выявление, локализация, отладка и устранение ошибок при тестировании также облегчаются. Модули позволяют легко расширить возможности ядра по мере необходимости.

Модульные ядра предоставляют особый программный интерфейс (API) для связывания модулей с ядром, для обеспечения динамической подгрузки и выгрузки модулей. Модули ядра обязаны экспортировать функции, нужные ядру для правильного подключения и распознавания модуля, для его корректной инициализации при загрузке и корректного завершения при выгрузке, для регистрации модуля в таблице модулей ядра и для обращения из ядра к сервисам, предоставляемым модулем.

Не все части ядра могут быть сделаны модулями. Некоторые части ядра всегда обязаны присутствовать в оперативной памяти и должны быть интегрированы в ядро. Не все модули допускают динамическую подгрузку (без перезагрузки ОС). Степень модульности ядер (количество и разнообразие кода, которое может быть вынесено в отдельные модули ядра и допускает динамическую подгрузку) различна в различных архитектурах модульных ядер. Ядра Linux в настоящее время имеют более модульную архитектуру, чем ядра *BSD (FreeBSD, NetBSD, OpenBSD).

Общей тенденцией развития современных модульных архитектур является всё большее повышение степени модульности ядер, улучшение механизмов динамической подгрузки и выгрузки, введение механизмов автоматического определения оборудования и автоматической подгрузки нужных модулей, введение в ядро абстрактных механизмов, предназначенных для совместного использования многими модулями (примером может служить VFS — Virtual File System, совместно используемая многими модулями файловых систем в ядре Linux).

Примеры: OpenVMS, Linux, FreeBSD, NetBSD, Solaris.

 

Микроядерная архитектура - альтернатива классическому способу построения операционной системы.

Суть микроядерной архитектуры в следующем. В привилегированном режиме остается работать только очень небольшая часть ОС, называемая микроядром.

Микроядро защищено от остальных частей ОС и приложений. В состав микроядра обычно входят машинно-зависимые модули, а также модули, выполняющие наиболее базовые (но не все!) функции ядра по управлению процессами, обработке прерываний, управлению виртуальной памятью, управлению устройствами ввода-вывода, связанные с загрузкой или чтением регистров устройств и средства межпроцессной коммуникации. Набор функций микроядра обычно соответствует функциям слоя базовых механизмов обычного ядра и эти функции операционной системы невозможно выполнить в пространстве пользователя.

Все остальные более высокоуровневые функции ядра оформляются в виде приложений (серверов ОС), работающих в пользовательском режиме. Однозначного решения о том, какие из системных функций нужно оставить в привилегированном режиме, а какие перенести в пользовательский, не существует. Вынести в пространство пользователя можно, например, сетевые сервисы и файловые системы.

Основным назначением сервера ОС является обслуживание запросов приложении и других модулей ОС, например создание процесса, выделение памяти, проверка прав доступа к ресурсу и т.д.

Микроядерная архитектура должна предоставлять удобный и эффективный способ вызова процедур одного процесса из другого. Поддержка такого механизма является одной из главных задач микроядра.

Схематично механизм обращения к функциям ОС, оформленным в виде серверов (рисунок 4).

Клиент (прикладная программа, или другой компонент ОС), запрашивает выполнение некоторой функции у сервера, посылая ему сообщение. Непосредственная передача сообщений между приложениями невозможна, так как их адресные пространства изолированы друг от друга. Микроядро, выполняющееся в привилегированном режиме, имеет доступ к адресным пространствам каждого из этих приложений и поэтому может работать в качестве посредника. Микроядро передает сообщение, содержащее имя и параметры вызываемой процедуры нужному серверу, сервер выполняет запрошенную операцию, ядро возвращает результаты клиенту. Работа микроядерной операционной системы соответствует модели клиент-сервер, в которой роль транспортных средств выполняет микроядро.

 

Рисунок 4 - Реализация системного вызова в микроядерной архитектуре

 

Примеры микроядерных ОС: QNX, Minix, L4Linux, Windows CE, Symbian, Mac OS X, GNU Hurd.

Классическим примером микроядерной системы является Symbian OS. Это пример распространенной и отработанной микроядерной (a начиная c версии Symbian OS v8.1, и наноядерной) операционной системы.

B отличие от Windows NT, создателям Symbian OS удалось совместить эффективность и концептуальную стройность, несмотря на то что современные версии этой системы предоставляют обширные возможности, в том числе средства для работы c потоковыми данными, стеками протоколов, критичными к латентности ядра, графикой и видео высокого разрешения).

В ОС Windows NT версий 3.х микроядерная архитектура использовалась для подсистемы графики и пользовательского интерфейса. В частности, драйвер графической аппаратуры загружался в контекст серверного процесса в пространстве пользователя. Начиная с версии 4, от этого отказались, а графическая подсистема вместе с драйвером аппаратуры (в том числе трехмерной графики) переместилась в специально обособленный регион ядра ОС.

ОС Windows CE (и созданные на ее основе сборки, такие, как Windows Mobile), будучи практически полностью совместимой (как подмножество) с Windows NT по вызовам и методам программирования приложений, тем не менее полностью отличается от Windows NT по внутренней архитектуре и является микроядерной ОС с выносом всех драйверов устройств, сетевых стеков и графической подсистемы в серверные процессы.