Совместимость
Одним из аспектов совместимости является способность ОС выполнять программы, написанные для других операционных систем или для более ранней версии данной операционной системы. А также для другой аппаратной платформы. Необходимо разделять вопросы двоичной совместимости и совместимости на уровне исходных текстов приложений. Двоичная совместимость достигается в том случае, когда можно исполняемую программу и запустить её на выполнение на другой операционной системе. Для этого необходимо – совместимость на уровне команд процессора, совместимость на уровне системных вызовов и даже на уровне библиотечных вызовов, если они являются динамически связываемыми. Совместимость на уровне исходных текстов требует наличия специального компилятора в составе программного обеспечения, а также совместимости на уровне библиотек и системных вызовов. При этом необходима перекомпиляция имеющихся исходных текстов в новый выполняемый модуль. Совместимость на уровне исходных текстов важна в основном для разработчиков приложений. Но для конечных пользователей практическое значение имеет только двоичная совместимость, т.к. только в этом случае они могут использовать один и тот же коммерческий продукт, поставляемый в виде двоичного исполняемого кода, в различных операционных средах и на различных машинах. Обладает ли новая операционная система двоичной совместимостью или совместимостью исходных текстов с существующими системами зависит от многих факторов. Главный из них – архитектура процессора, на котором работает новая операционная система. Если процессор, на который переносится ОС использует тот же набор команд (а возможно с некоторыми дополнениями) и тот же диапазон адресов, тогда двоичная совместимость может быть достигнута достаточно просто. Сложнее достичь двоичной совместимости между процессорами, основанными на разных архитектурах. Для того, чтобы процессор выполнял команды другого он изначально должен работать с командами, которые ему не понятны. Например, процессор-1 должен исполнять двоичный код, предназначенный для процессора-2. Процессор-2 имеет свои собственные дешифратор команд, регистры и внутреннюю архитектуру. Процессор-1 не понимает двоичный код процессора-2. Поэтому он должен выбрать каждую команду, декодировать её, для определения её предназначения. А затем выполнить эквивалентную подпрограмму, написанную для процессора-1. Так как к тому же у процессора-1 нет в точности таких же регистров, флагов и внутреннего арифметико-логического устройства, как у процессора-2 он должен имитировать все эти элементы с использованием своих регистров или памяти. Он должен тщательно воспроизводить результаты каждой команды, что требует специально написанных подпрограмм для процессора-1, гарантирующих, что состояние эмулируемых регистров и флагов после выполнения каждой команды, будет таким же, как и на реальном процессоре-2. Это простая, но очень медленная работа, т.к. микропорт внутри процессора-2 исполняется на значительно более быстродействующем уровне, чем эмулирующие его внешние команды процессора-1 Если процессор, производящий эмуляцию не настолько быстр, чтобы компенсировать все потери при эмуляции, то программы, исполняемые под эмуляцией будут очень медленными. Выходом в таких случаях является использование так называемых прикладных сред. Учитывая, что основную часть программы, как правило, составляют вызовы библиотечных функций, прикладная среда имитирует библиотечные функции целиком, используя заранее написанную библиотеку функций аналогичного назначения, а остальные команды эмулируют каждую по отдельности.
|