OS/2 1.x
Параллельно с развитием WIN 16, во второй половине 80-х Microsoft занималась разработкой еще одной операционной системы, в данном случае совместно с фирмой IBM. OS/2 создавалась как ОС для новой серии машин IBM Personal System/2, основанных на процессоре 80286. Архитектура системы представляет собой самое полное из известных автору воплощение идей, которые имел в виду Intel, разрабатывая этот процессор. Весьма ограниченный успех этой системы обусловлен, по-видимому, несостоятельностью идей Intel, а не качеством их воплощения.
Система использует сегментированную виртуальную память и сборку в момент загрузки. Формат загрузочных модулей и DLL тот же самый, что в WIN 16 – NE. Однако система имеет раздельные адресные пространства – задачи не имеют доступа к сегментам данных и приватным сегментам DLL других задач. Сегменты кода – разделяемые и защищены от записи. К сожалению, 80286 не обрабатывал сегментных отказов, поэтому виртуальная память использовалась лишь для защиты задач друг от друга, но не для сегментной подкачки [Коган/Роусон 1989, Лафо/Нортон 1991].
OS/2 реализует вытесняющую многозадачность, многопоточность в пределах одной задачи и богатый набор примитивов взаимоисключения (семафоры как двоичные, так и счетчики, очереди сообщений). Ядро – кооперативно многозадачное с управляемыми сообщениями асинхронными драйверами. Одной из отличительных особенностей системы является мощный механизм обработки исключений, аналогичный используемым в MVS-OS/390-z/OS и VMS.
Одной из главных задач при разработке системы было максимальное облегчение переноса программного обеспечения (как прикладного, так и системного, включая и драйверы устройств) из MS DOS. Эта цель была в основном достигнута: все системные вызовы DOS имели полные функциональные эквиваленты в OS/2, и достаточно аккуратно написанные программы для DOS могли быть перенесены в OS/2 1.x простой перекомпиляцией.
Впрочем, оказалась неразрешимой другая, более важная задача – обеспечение бинарной совместимости. Процессор 80286 в защищенном режиме не имел возможности исполнять программы для реального режима 8086. Для исполнения бинарных модулей DOS была нужна полноценная копия DOS и переключение режима процессора. Таким образом, в системе могла исполняться только одна сессия DOS, а во время ее работы вся активность приложений OS/2 полностью прекращалась.
Из-за этого недостатка OS/2 1.x имела успех лишь в качестве серверов файлов и печати в сетях NETBIOS (LAN Manager и серверов приложений: Lotus Notes, Sybase и др).
Бинарная несовместимость с DOS могла быть преодолена только с использованием возможностей процессора 80386. Существовали и другие показания к переходу на этот процессор: например, возможность страничной подкачки. Кроме того, используемая в х86 плоская модель памяти упрощает программирование, снимает ограничение в 64Кбайт на переменную и дает много других преимуществ.
В этот момент между партнерами возникли серьезные разногласия в вопросе о том, как следует переходить на новый процессор. Предложенная фирмой Microsoft архитектура новой 32-разрядной версии системы, (OS/2 New Technology) оказалась абсолютно неприемлемой для IBM.
Камнем преткновения стал вопрос о том, как следует организовывать взаимодействие между 16-разрядным кодом, использующим сегментированную память, и 32-разрядным, использующим линейное адресное пространство.
На самом деле, адреса в обеих моделях памяти имеют длину 32 бита, но в 16-разрядной модели адрес разбит на селектор сегмента и смещение в нем. Это разбиение накладывает серьезные ограничения на указательную арифметику. Задача преобразования 16-разрядного указателя 80286 в 32-разрядный достаточно проста; задача же обратного преобразования требует нетривиальных вычислений и в общем случае во время исполнения неразрешима.
Предложение Microsoft состояло в том, чтобы сохранить бинарную совместимость с программами для OS/2 1.x и дать им возможность обращаться к новым 32-разрядным DLL и системным модулям, но не предоставлять возможности для 32-разрядных приложений обращаться к старым 16-разрядным DLL. Это решение требовало полной переделки всех сервисных подсистем (включая графическую подсистему Presentation Manager), ядра ОС и подсистемы ввода-вывода (т. е. всех драйверов) в 32-разрядную модель памяти. Переделка драйверов требовала отказа от совместимости с существующими драйверами устройств, файловых систем и сетевых протоколов для OS/2 1.x.
IBM предложила более элегантное решение, требовавшее, однако, переделки компилятора: предлагалось научить компилятор при вызове из 32-разрядного кода 16-битной процедуры генерировать специальный код, осуществляющий преобразование "плоского" указателя в сегментированный для всех параметров-указателей (пример П.1). Компилятор должен был принимать решение о необходимости такого преобразования на основе прототипа вызываемой функции.
Пример П.1. Код, порождаемый компилятором IBM Visual Age C++ при вызове 16-разрядной функции.
104 /* 105 * открыть обработчик 106 *для мыши 107 */ 108 MouOpenfNULL,&hmou); sub esp,038h push Oh mov eax,offset FLAT:hmou call _DosFlatToSel push eax push 08h push eax mov eax,offset FLAT: MOU16OPEN call _DosFlatToSel xchg eax, dword ptr[esp] push Oh call __EDC3216 add esp,04ch
Сведений о ходе переговоров история не сохранила, однако по косвенным признакам они были весьма бурными. По причинам, изложенным в Главе 10, решение об отказе от поддержки существующих драйверов и DLL было абсолютно неприемлемо для IBM. Почему переделка компилятора не устраивала Microsoft, менее понятно. Автор не располагает достоверными сведениями на этот счет, но есть ряд косвенных оснований предполагать, что взаимодействие между подразделениями Microsoft оставляет желать много лучшего, так что создатели ОС попросту не имели возможности (или даже права) выдвигать столь сложное требование к разработчикам компилятора. Возможно, что на результат переговоров повлияли и какие-то другие, например, сугубо политические или даже психологические факторы.
Важно отметить, впрочем, что никаких реальных проблем реализация данного требования не представляла: практически все 32-разрядные компиляторы для OS/2 2.x – Zortech C++, Watcom C++, IBM C/Set (позднее IBM Visual Age for C++) – с успехом выполняют преобразование указателей.
Так или иначе, переговоры не только проходили бурно, но и закончились разводом. Дальнейшая судьба OS/2 – это совсем другая история, или, точнее сказать, две разные истории.