83
1.1.2 Переносимость
Требование переносимости кода тесно связано с расширяемостью.
Расширяемость позволяет улучшать операционную систему, в то время как переносимость
дает возможность перемещать всю систему на машину, базирующуюся на другом
процессоре или аппаратной платформе, делая при этом по возможности небольшие
изменения в коде.. Вопрос не в том, может ли быть система перенесена, а в том, насколько
легко можно это сделать.
Во-первых, большая часть кода должна быть написана на языке, который имеется
на всех машинах, куда вы хотите переносить систему. Обычно это означает, что код
должен быть написан на языке высокого уровня, предпочтительно стандартизованном,
например, на языке С. Программа, написанная на ассемблере, не является переносимой,
если только вы не собираетесь переносить ее на машину, обладающую командной
совместимостью с вашей.
Во-вторых, следует учесть, в какое физическое окружение программа должна
быть перенесена. Различная аппаратура требует различных решений при создании ОС.
Например, ОС, построенная на 32-битовых адресах, не может быть перенесена на машину
с 16-битовыми адресами.
В-третьих, важно минимизировать или, если возможно, исключить те части кода,
которые непосредственно взаимодействуют с аппаратными средствами.
В-четвертых, если аппаратно зависимый код не может быть полностью исключен,
то он должен быть изолирован в нескольких хорошо локализуемых модулях. Аппаратно-
зависимый код не должен быть распределен по всей системе
Для легкого переноса ОС при ее разработке должны быть соблюдены следующие
требования:
• Переносимый язык высокого уровня. Большинство переносимых ОС
написано на языке С (стандарт ANSI X3.159-1989). Разработчики выбирают С потому, что
он стандартизован, и потому, что С-компиляторы широко доступны. Ассемблер
используется только для тех частей системы, которые должны непосредственно
взаимодействовать с аппаратурой (например, обработчик прерываний) или для частей,
которые требуют максимальной скорости (например, целочисленная арифметика
повышенной точности). Однако непереносимый код должен быть тщательно изолирован
внутри тех компонентов, где он используется.
• Изоляция процессора. Некоторые низкоуровневые части ОС должны иметь
доступ к процессорно-зависимым структурам данных и регистрам. Однако код, который
делает это, должен содержаться в небольших модулях, которые могут быть заменены
аналогичными модулями для других процессоров.
• Изоляция платформы. Зависимость от платформы заключается в различиях
между рабочими станциями разных производителей, построенными на одном и том же
процессоре. Должен быть введен программный уровень, абстрагирующий аппаратуру
вместе со слоем низкоуровневых программ таким образом, чтобы высокоуровневый код
не нуждался в изменении при переносе с одной платформы на другую.
1.1.3 Совместимость
Одним из аспектов совместимости является способность ОС выполнять
программы, написанные для других ОС или для более ранних версий данной
операционной системы, а также для другой аппаратной платформы.
Необходимо разделять вопросы двоичной совместимости и совместимости на
уровне исходных текстов приложений.
Двоичная совместимость достигается в том случае, когда можно взять
исполняемую программу и запустить ее на выполнение на другой ОС. Для этого
необходимы: совместимость на уровне команд процессора и совместимость на уровне
системных вызовов.