Билет №17. Машинно-зависимые компоненты ОС
Многие операционные системы успешно работают на различных аппаратных платформах без существенных изменений в своем составе. В ОС можно выделить достаточно компактный слой машинно-зависимых компонентов ядра и сделать остальные слои ОС общими для разных аппаратных платформ.
Одна и та же операционная система не может без каких-либо изменений устанав-ливаться на компьютерах, отличающихся типом процессора или/и способом организации всей аппаратуры. В модулях ядра ОС не могут не отразиться такие особенности аппаратной платформы, как количество типов прерываний и формат таблицы ссылок на процедуры обработки прерываний, состав регистров общего назначения и системных регистров, состояние которых нужно сохранять в контексте процесса, особенности подключения внешних устройств и многие другие.
Однако опыт разработки операционных систем показывает: ядро можно спроектировать таким образом, что только часть модулей будут машинно-зависимыми, а остальные не будут зависеть от особенностей аппаратной платформы. В хорошо структурированном ядре машинно-зависимые модули локализованы и образуют программный слой, естественно примыкающий к слою аппаратуры. Такая локализация машинно-зависимых модулей сущест-венно упрощает перенос операционной системы на другую аппаратную платформу.
Объем машинно-зависимых компонентов ОС зависит от того, насколько велики отличия в аппаратных платформах, для которых разрабатывается ОС.
Для уменьшения количества машинно-зависимых модулей производители операционных систем обычно ограничивают универсальность машинно-независимых модулей. Это означает, что их независимость носит условный характер и распространяется только на несколько типов процессоров и соз-данных на основе этих процессоров аппаратных платформ.
По ученику Олифера
Одна и та же операционная система не может без каких-либо изменений уста-навливаться на компьютерах, отличающихся типом процессора или/и способом организации всей аппаратуры. В модулях ядра ОС не могут не отразиться такие особенности аппаратной платформы, как количество типов прерываний и фор¬мат таблицы ссылок на процедуры обработки прерываний, состав регистров об¬щего назначения и системных регистров, состояние которых нужно сохранять в контексте процесса, особенности подключения внешних устройств и многие другие.
Однако опыт разработки операционных систем показывает: ядро можно спроек¬тировать таким образом, что только часть модулей будут машинно-зависимыми, а остальные не будут зависеть от особенностей аппаратной платформы. В хоро¬шо структурированном ядре машинно-зависимые модули локализованы и об-разуют программный слой, естественно примыкающий к слою аппаратуры, как это и показано на рис. 3.8. Такая локализация машинно-зависимых модулей существенно упрощает перенос операционной системы на другую аппаратную платформу.
Объем машинно-зависимых компонентов ОС зависит от того, насколько велики отличия в аппаратных платформах, для которых разрабатывается ОС. Напри¬мер, ОС, построенная на 32-битовых адресах, для переноса на машину с 16-бито¬выми адресами должна быть практически переписана заново. Одно из наиболее очевидных отличий — несовпадение системы команд процессоров — преодолева¬ется достаточно просто. Операционная система программируется на языке высо¬кого уровня, а затем соответствующим компилятором вырабатывается код для конкретного типа процессора. Однако во многих случаях различия в организа-ции аппаратуры компьютера лежат гораздо глубже и преодолеть их таким обра¬зом не удается. Например, однопроцессорный и двухпроцессорный компьютеры требуют применения в ОС совершенно разных алгоритмов распределения про¬цессорного времени. Аналогично отсутствие аппаратной поддержки виртуаль¬ной памяти приводит к принципиальному различию в реализации подсистемы управления памятью. В таких случаях не обойтись без внесения в код операци¬онной системы специфики аппаратной платформы, для которой эта ОС предна-значается.
Для уменьшения количества машинно-зависимых модулей производители опе-рационных систем обычно ограничивают универсальность машинно-независи¬мых модулей. Это означает, что их независимость носит условный характер и распространяется только на несколько типов процессоров и созданных на основе этих процессоров аппаратных платформ. По этому пути пошли, например, разра-ботчики ОС Windows NT, ограничив количество типов процессоров для своей системы четырьмя и поставляя различные варианты кодов ядра для однопроцес¬сорных и многопроцессорных компьютеров.
Особое место среди модулей ядра занимают низкоуровневые драйверы внешних устройств. С одной стороны эти драйверы, как и высокоуровневые драйверы, входят в состав менеджера ввода-вывода, то есть принадлежат слою ядра, зани¬мающему достаточно высокое место в иерархии слоев. С другой стороны, низ¬коуровневые драйверы отражают все особенности управляемых внешних уст¬ройств, поэтому их можно отнести и к слою машинно-зависимых модулей. Такая двойственность низкоуровневых драйверов еще раз подтверждает схематичность модели ядра со строгой иерархией слоев.
Для компьютеров на основе процессоров Intel x86/Pentium разработка экрани¬рующего машинно-зависимого слоя ОС несколько упрощается за счет встроен¬ной в постоянную память компьютера базовой системы ввода-вывода — BIOS. BIOS содержит драйверы для всех устройств, входящих в базовую конфигура¬цию компьютера: жестких и гибких дисков, клавиатуры, дисплея и т. д. Эти драйверы выполняют весьма примитивные операции с управляемыми устройст¬вами, например чтение группы секторов данных с определенной дорожки диска, но за счет этих операций экранируются различия аппаратных платформ персо¬нальных компьютеров и серверов на процессорах Intel разных производителей. Разработчики операционной системы могут пользоваться слоем драйверов BIOS как частью машинно-зависимого слоя ОС, а могут и заменить все или часть драйверов BIOS компонентами ОС.