[Перевод] Операционная система Microsoft OS/2 2.0 SDK: Будущее, которого не случилось

В 1990 году стратегической операционной системой Microsoft и IBM для ПК были не DOS и даже не Windows, а OS/2. Спустя 34 года после выпуска неожиданно нашлась коробка с предварительной версий Microsoft OS/2 2.0 SDK. Давайте посмотрим, что внутри и как она ведёт себя после установки.

Первая 16-битная OS/2 с крайне ограниченным функционалом была первоначально выпущена в 1987 году, но к концу 1989 года в OS/2 1.2 реализовали две основные функции: графический интерфейс Presentation Manager (впервые представленный в OS/2 1.1) и возможность установки новой файловой системы HPFS.

Рабочий стол ОС/2 

Рабочий стол ОС/2 

Ещё до первого выпуска Microsoft говорила о специальной версии OS/2 для 386 (Intel 80 386) с поддержкой 32-битного API плоской модели и улучшенной поддержкой DOS с использованием виртуального режима 8086 (V86) 386.

В 1987 году компьютеров на базе процессора 386 было мало. IBM хотела иметь операционную систему лучше DOS’а прямо сейчас, а не через несколько лет. В то же время Microsoft уже несколько лет работала над «Advanced DOS», всё ещё 16-битной, но использующей защищённый режим 286. Результатом этой работы стала OS/2 1.x.

К 1990 году количество систем 386 и совершенно новых 486 увеличилось. Специфичное для 386 ПО вроде менеджера памяти («LIMulators») и многозадачных программ DOS (включая собственную Windows/386 от Microsoft), становилось все более популярным.

Незадолго до конца 1989 года Microsoft выпустила первую предварительную версию давно обещанной 32-битной OS/2 2.0, которая должна была стать первой 32-битной операционной системой для ПК, предназначенной для массового рынка. 

Компания выпустила пресс-релиз с подробным описанием комплекта разработки программного обеспечения (SDK) OS/2 2.0 стоимостью 2600 долларов.

К сожалению, предварительная версия OS/2 2.0, выпущенная в декабре 1989 года не дожила до наших дней. Но в июне 1990 года Microsoft выпустила вторую предварительную версию OS/2 2.0 SDK. И эта версия нашлась после двадцати лет поисков и почти через 34 года после её выпуска!

Коробка предварительной версии OS/2 2.0 SDK 2

Коробка предварительной версии OS/2 2.0 SDK 2

Образец SDK находился в оригинальной невскрытой коробке с документацией и всем остальным.

Предварительная версия OS/2 2.0 SDK 2 на носителе 5,25 дюйма

Предварительная версия OS/2 2.0 SDK 2 на носителе 5,25 дюйма

Вот как выглядела после установки предварительная версия OS/2 2.0 (также известная как сборка 6.78), выпущенная в июне 1990 года:

ОС/2 2.0 сборка 6.78

ОС/2 2.0 сборка 6.78

Она была до ужаса похожа на свою 16-битную современницу — OS/2 1.2. Важным моментом было отсутствие иконки DOS в левом нижнем углу (единственное ограниченное окно DOS в OS/2 1.x, также известное как «гроб DOS») и, что более важно, появление иконок DOS Window (DOS в окошке) и DOS Full Screen (DOS полный экран) в основной группе.

Если рассматривать предварительную версию OS/2 2.0 в перспективе, то она вышла почти одновременно с Windows 3.0, за год до DOS 5.0, почти за два года до выпуска OS/2 2.0 и более чем на три года до Windows NT 3.1.

Гибридная ОС

Предварительная версия OS/2 2.0 середины 1990 года была во многом гибридной операционной системой. Драйверы устройств были 16-битными, графический интерфейс Presentation Manager — 16-битным, большинство служебных программ — 16-битными. Но ядро ​​включало новый 32-битный менеджер памяти с поддержкой подкачки, поддержкой 32-битных приложений и, в частности, подсистемой MVDM — поддержкой нескольких виртуальных DOS‑машин.

Гибридные системы, как правило, являются результатом разумной инженерной практики. Зачем писать новый 32-битный код, если существующий 16-битный код вполне подойдёт? Повторное использование больших фрагментов кода OS/2 1.2, несомненно, ускорило разработку OS/2 2.0.

Одной из основных целей OS/2 2.0 было выполнение существующих 16-разрядных приложений OS/2 1.x. Поэтому начать с 16-битного кода было логично. Поддержка 16-битных драйверов устройств также позволяла использовать существующие драйверы с минимальными изменениями, а не переписывать всё с нуля.

Тем не менее, разработчики OS/2 2.0 вряд ли предполагали, что столько 16-битного кода сохранится в OS/2 до конца.

Ошибки и несовместимости

После установки OS/2 сборки 6.78 (которая прошла гладко) я быстро обнаружил, что эмуляторы DOS просто не работают. Любая попытка запустить сеанс DOS приведёт к сбою или, в лучшем случае, к пустому экрану:

Эмуляторы DOS не работают

Эмуляторы DOS не работают

К чести OS/2 2.0, сбой и запись сеанса DOS не оказали заметного влияния на стабильность системы. Это прогресс по сравнению с OS/2 1.x.

Поизучав трассировки команд, я обнаружил весьма неожиданную причину. В файле DOSKRNL (ядро DOS 4.0, работающее внутри модулей DOS OS/2) Microsoft попыталась проявить хитрость и использовала недопустимую инструкцию в качестве быстрого пути для доступа к службам защищенного режима. Но возникла фатальная проблема: Microsoft использовала код операции 0F 7F, который не является неопределенным в Pentium MMX и более поздних версиях — это инструкция MOVQ. По этой причине запуск DOTS boxes в сборке 6.78 с треском проваливается на процессорах Pentium MMX и более поздних версиях Intel (за исключением, возможно, Pentium Pro).

Интересно, что предварительная версия OS/2 2.0 (сборка 6.123), которая появилась всего на несколько месяцев позже, не страдает от этой проблемы. Она использует инструкцию HLT, которая всегда вызывает ошибку #GP в режиме V86 и отлично работает на современных процессорах. Что побудило Microsoft изменить этот механизм, остаётся загадкой, ведь до процессоров MMX было ещё далеко.

Также я обнаружил, что не могу установить сетевые компоненты LAN Manager:

Что-то пошло не так. Попробуйте угадать, почему, будет весело!

Что-то пошло не так. Попробуйте угадать, почему, будет весело!

Сообщение об ошибке ужасно расплывчатое. Потратив некоторое время на дизассемблер, я нашел причину, опять же, весьма неожиданную. Установка LAN Manager завершается неудачей, поскольку обнаруживается, что загружается NETAPI.DLL.

По совершенно неясным причинам Microsoft поставила NETAPI.DLL на диски LAN Manager, но также поставила другую NETAPI.DLL как часть базовой ОС. Если диспетчер очереди печати находит NETAPI.DLL, то загружает именно её (и нет никаких очевидных способов выхода из диспетчера очереди печати). Это нарушает настройку сети, поскольку он считает, что LAN Manager (или какое‑либо другое сетевое программное обеспечение) уже установлен.

Обходной путь оказался простым: загрузите OS/2 6.78 с установочной дискеты (или с установочной дискеты OS/2 1.2/1.3), переименуйте NETAPI.DLL в каталоге \OS2\DLL, перезагрузитесь. Диспетчер очереди печати просто не использует NETAPI.DLL, если не находит её, и настройка LAN Manager работает. Как Microsoft удалось выпустить предварительную версию таким образом, остаётся загадкой — возможно, изменения внесли в последний момент.

Сеть

OS/2 2.0 SDK поставлялся с четырьмя дисками сетевой поддержки. Оказалось, что это предварительная версия LAN Manager 2.0 (SDK вышел в июне, LAN Manager 2.0 примерно в ноябре 1990 года). Согласно современным данным, сетевая поддержка была новинкой для ​​SDK, выпущенного в июне 1990 года. Первый SDK OS/2 2.0, выпущенный в декабре 1989 года, не включал сетевые возможности (может быть, потому что LAN Manager 2.0 был недостаточно развит).

Предварительная версия LAN Manager 2.0

Предварительная версия LAN Manager 2.0

Программа установки предлагает установить сервер LAN Manager либо рабочую станцию ​​с сервисом Peer (которая тоже является сервером). Но, насколько я могу судить, серверных компонентов на дисках нет. Также отсутствует пользовательский интерфейс на основе текстового режима, который обычно запускается с помощью команды NET.

Поскольку сетевой стек основан на LAN Manager 2.0, он поставляется только с NetBEUI (за исключением, возможно, некоторых экзотических транспортов XNS). Нет NetBIOS через TCP/IP и, следовательно, нет возможности общаться с современными серверами.

Но предварительная версия сетевого кода может взаимодействовать с сервером LAN Manager 2.0 и использовать общий доступ к файлам. Весёлые времена! Жаль, что IBM не включила сетевые возможности в версию OS/2 2.0.

Для тестирования я использовал эмуляцию 3Com EtherLink II в VirtualBox:

Время налаживать связи!

Время налаживать связи!

Предварительная версия OS/2 2.0 без проблем видит сервер LAN Manager 2.0 (работающий поверх OS/2 1.2), работающий на другой виртуальной машине:

Предварительная версия OS/2 2.0 общается с LAN Man 2.0

Предварительная версия OS/2 2.0 общается с LAN Man 2.0

Также можно легко использовать сетевой диск и получить доступ к удалённым файлам:

Использование сетевых ресурсов

Использование сетевых ресурсов

В целом, предварительная версия OS/2 2.0, что удивительно, включала хоть и урезанный, но функциональный сетевой клиент. Это значительно облегчило бы разработку программного обеспечения, поскольку файлы можно было легко копировать по сети.

Обратите внимание: невозможно установить выпущенный клиент LAN Manager 2.0 или 2.1 на OS/2 6.78. То есть установщик запускается, но после этого система просто выходит из строя, что неудивительно, учитывая, насколько тесно сетевой редиректор был интегрирован в операционную систему.

Разработка

Большую часть OS/2 2.0 SDK, очевидно, составлял комплект разработки. Сюда входила предварительная версия 32-битного компилятора C от Microsoft, Microsoft Macro Assembler (MASM) с поддержкой 32-бит, а также заголовки, библиотеки и пример кода. Плюс. конечно, электронная и печатная документация. Печатная документация была новой в SDK, выпущенном в июне 1990 года; первый выпуск поставлялся только с электронной документацией.

CL386 и MASM386 поставляются вместе с OS/2 2.0 SDK.

CL386 и MASM386 поставляются вместе с OS/2 2.0 SDK.

Комплект разработки был больше, чем сама ОС: 6 дисков компилятора и 5 дисков с инструментами против 10 дисков для самой операционной системы.

Компилятор CL386 — это, по сути, тот же компилятор, который использовался для разработки NT на базе x86. Примерно с 1986 года у Microsoft был компилятор, создающий 32-битный код для процессора 386, и он использовал его для разработки 386 XENIX; SCO поставляла указанный компилятор в течение ряда лет. Компилятор CL386 был вариантом компилятора для DOS‑подобных систем. В конечном итоге он превратился в 32-битный компилятор Microsoft Visual C++, но пользователям пришлось ждать до 1993 года, прежде чем они смогли его купить.

И только редкие счастливчики, купившие Microsoft OS/2 2.0 SDK, могли наслаждаться написанием 32-битных приложений несколькими годами ранее, в 1990 году! SDK поставляется с многочисленными примерами программ и довольно обширной документацией.

Электронная документация существовала в двух разных форматах. Информация о программировании OS/2 и особенно документация по программированию Presentation Manager поставлялись в родном формате справки OS/2:

Руководство по разработке приложений OS/2 2.0

Руководство по разработке приложений OS/2 2.0

Документация по компилятору и ассемблеру, а также API OS/2 была в формате QuickHelp:

Документация QuickHelp для CL386

Документация QuickHelp для CL386

Кое-где они совпадали, и большая часть документации была доступна в обоих форматах, однако другие части были доступны только в одном или другом формате. Похоже, что группа языков в Microsoft предпочла QuickHelp, но группа систем и IBM предпочли формат справки OS/2.

32-битная плоская модель

В OS/2 2.0 SDK была представлена 32-битная плоская модель программирования, которая стала стандартом в 1990-х годах. Больше никаких 64-килобайтных сегментов, никаких указателей ближнего и дальнего действия.

OS/2 2.0 полностью использовала возможности подкачки процессора 386. Виртуальную память, основанную на подкачке однородных страниц размером 4 КБ, было проще реализовать, чем подкачку сегментов переменного размера, как это было в случае с OS/2 1.x.

В комплект SDK входит отличный пример, демонстрирующий виртуальную память в OS/2 2.0:

Пример VMM в OS/2 2.0 SDK

Пример VMM в OS/2 2.0 SDK

Модель 32-битного программирования сильно отличалась от той, к которой привыкли программисты DOS и OS/2 1.x, но она была простой. По большей части подкачка была полностью прозрачной, и программистам не приходилось об этом беспокоиться.

Не менее важно и то, что модель плоской памяти значительно упростила портирование с других платформ, поскольку она была похожа на модель программирования, используемую 32-битными платформами UNIX.

Эмуляция DOS

Поддержка DOS в OS/2 6.78 кажется достаточно функциональной и полной. Пользовательский интерфейс для настройки свойств DOS сильно отличался от выпущенной OS/2 2.0, но фактические настройки выглядят знакомо:

Свойства эмулятора DOS

Свойства эмулятора DOS

Большой новостью, конечно же, стала возможность запускать DOS в окне:

Окно DOS в OS/2 6.78

Окно DOS в OS/2 6.78

Стоит ли говорить, что OS/2 6.78 была способна одновременно запускать несколько систем DOS, как в оконном, так и в полноэкранном режиме, в то время как OS/2 1.x могла только мечтать об этом.

Несколько сеансов DOS в OS/2 6.78

Несколько сеансов DOS в OS/2 6.78

Весьма вероятно, что при разработке подсистемы MVDM OS/2 Microsoft использовала опыт работы с Windows/386, хотя фактическая реализация была совершенно другой и, вероятно, не имела большого общего кода, если вообще имела какой-либо общий код.

Хотя, возможно, в этом и не было особого смысла, инструменты разработки, поставляемые с SDK, можно было запускать в системе DOS:

CL386 работает под управлением DOS

CL386 работает под управлением DOS

32-битный исполняемый файл, созданный SDK, конечно, не работал под DOS.

Судя по сообщениям прессы, поддержка DOS в OS/2 2.0 SDK работала достаточно хорошо даже в первом выпуске от декабря 1989 года. Выпуск от июня 1990 года, без сомнения, был ещё лучше.

Что, если…

Сборка OS/2 2.0 6.78 выглядит на удивление стабильной и завершённой. В сопроводительном письме, прилагаемом к SDK, подчёркивалось, что разработчики Microsoft использовали предварительную версию OS/2 для повседневной работы.

Минималистский гибридный подход позволил Microsoft и IBM использовать существующую функциональную и стабильную операционную систему (OS/2 1.2) и дополнить её новыми важными функциями (32-битные приложения, DOS-приложения).

Учитывая, как далеко продвинулась OS/2 2.0 в июне 1990 года, кажется очень правдоподобным, что раскол между Microsoft и IBM задержал выпуск OS/2 2.0 как минимум на год.

Если бы Microsoft и IBM выпустили 32-битную OS/2 с хорошей совместимостью с DOS где-то в конце 1990 или начале 1991 года, это, вполне вероятно, предотвратило бы появление Windows 9x, и вместо Windows NT мы бы использовали NT OS/2 по первоначальному плану. Но это будущего так никогда и не случилось.

Habrahabr.ru прочитано 5855 раз