Запускаем IBM OS/2 1.0 в виртуальной машине: почему это сложно сделать

в 12:31, , рубрики: Без рубрики

Почему OS/2 сложно запустить в виртуальной среде?

Из-за определённых причин OS/2 очень сложно заставить работать в виртуальной машине; гораздо сложнее, чем DOS, Windows 3.x, Windows NT, Windows 95 или множество UNIX-подобных операционных систем. Проблемы кроются в архитектуре Полуоси и её истории.

Сначала разговор пойдёт об особенностях реализации ядра и драйверов старых (очень старых) версий OS/2, затем немного про виртуалки, а после этого автор, выполнив ряд манипуляций, запустит IBM OS/2 1.0 в виртуальной машине VirtualBox 4.3.8 на своём Маке — КДПВ. — прим. пер.

IBM Operating System/2 Installation. Version 1.00


Ну, во-первых, старые версии OS/2 (имея в виду Warp 3 и ниже) сложно запустить даже на железном Pentium III и подобных, казалось бы, древних машинах. В коде операционной системы содержится множество разных циклов, используемых для установки временных задержек (ориг. timing loops — прим. пер.), которые сбоят на быстрых прооцессорах, вызывая ошибки переполнения при делении и всякие другие. Такому подвержены почти все 1.x версии. Поддержка больших IDE дисков тоже с проблемами, но уж в этом точно не следует винить OS/2; в то время стандарт IDE бурно развивался, и мы говорим о тех временах, когда дисков больше, ну, 300 мегабайт и не существовало вовсе, и в этом плане виртуализация даже помогает — куда легче сдвинуть бегунок в настройках виртуальной машины влево и создать виртуальный накопитель на, пусть, 120 мегабайт, чем бегать и искать настоящий, рабочий жёсткий диск настолько маленьких объёмов.

Потом, существует ряд проблем, специфичных исключительно для виртуальных сред. Давайте начнём со старейших версий Оси. IBM OS/2 1.0 и 1.1 используют 286-style переключение между защищённым и реальным режимом центрального процессора. Это такой способ, который использует код BIOS для того, чтобы возобновить работу машины в другом режиме на определённом этапе, ведь для переключения между режимами используется аппаратный сброс процессора; большинством виртуальных машин подобная экзекуция не нравится, и воспринимается как фатальная ошибка. Интересно, что редакция OS/2 1.x от Microsoft всё-таки детектирует 386-й процессор, и если такой был найден, то используется другой, гораздо более эффективный способ переключения между режимами через изменение регистра CR0.

Ещё в версиях 1.x использовался весьма необычный драйвер дисковода, который определяет тип накопителя, то есть его размер, основываясь на скорости передачи данных контроллером. 3.5-дюймовые диски объёмом 720 килобайт читаются на скорости 250 K/s, а объёмом 1.44 мегабайта — на скорости 500 K/s. Но это железным флопаком. А виртуальные машины не заморачиваются эмуляцией настолько тонких деталий и позволяют гостевой операционной системе, в нашей случае — Оси, в отличие от настоящего дисковода, читать 1.44-меговую дискету, даже если контроллер дисковода запрограммирован на скорость 250 K/s. В результате, драйвер думает, что в дисковод вставлен 720-килобайтный диск, что приводит к забавным ошибкам, и в общем — к невозможности загрузиться с дискеты.

С веткой 2.x всё немного по-другому: драйвер дисковода уже не настолько хитрый и работает нормально, переключение между режимами центрального процессора использует специфичный для 386-го процессора код (в 2.x была дропнута поддержка 80286 — прим. пер.), но ситуация-то в общем не лучше. OS/2 2.x всё ещё испытывает проблемы с таймингом, и на быстрых процессорах может зависнуть в любой момент, особенно на ранней стадии загрузки. А из-за того, как в Полуоси смешивается 16-битный реальный и 32-битный код защищённого режима, чрезвычайно важно правильно реализовывать все аспекты работы процессоров архитектуры x86, и с этим у виртуальных машин проблемы. Довольно часто встречаются плавающие, сложноуловимые баги, из-за которых OS/2 (имеются в виду в основном версии до Warp 4 — прим. пер.) не может загрузиться и работать в виртуальной машине без ошибок.

Другая проблема — старый (DOS-совместимый) стиль обработки ошибок FPU (Floating Point Unit — математический сопроцессор для операций с плавающей точкой — прим. пер.). OS/2 non-SMP версий (a. k. a. UNI — системы, не использующие симметричную мультипроцессорность — Symmetric MultiProcessor system; термин применяется как к software, так и к hardware — прим. пер.) используют 8086-совместимый метод генерации сигнала FERR# и конвертирования его в IRQ 19, вместо использования #MF-исключений, как делают все современные операционные системы в наши дни. Такой механизм должен быть корректно эмулирован для работы Оси в виртуальной машине.

Только самые последние версии Оси (так называемые Convenience Pack'и — MCP1, MCP2 для клиента и ACP1, ACP2 — для сервера) поддерживаются в качестве гостя в некоторых виртуальных машинах (известно, что в Virtual PC и VirtualBox). К тому времени IBM (МДМ — МежДелМаш — Международные Деловые Машины ;) — прим. пер.) уже разгребли проблемы с зависимостью от скорости процессора в некоторых местах, и поддержка аппаратного обеспечения уже вышла на уровень, подходящий для работы с сегодняшними виртуальными устройствами, эмулируемыми виртуальными машинами.

Полуось работает особенно хорошо, если включить (включайте всегда — прим. пер.) аппаратное ускорение (VT-x и AMD-V) — MCP и ACP устанавливаются и работают без каких либо проблем, и к тому же и Virtual PC, и VirtualBox к этому времени выпустили дополнения гостевой ОС, добавляющие свои аппаратно ускоренные видеодрайверы, поддержку интеграции мыши, общие папки, и подобные вещи, сильно улучшающие юзабельность Оси в виртуалке.

Всё, как и всегда — вопрос денег и усилий, потраченных на решение проблемы. Почти всё, что угодно может быть решено, если в этом есть реальная потребность.

Запускаем IBM OS/2 1.0 в виртуальной машине

Как я уже говорил, соврешенно непонятно, почему ядра ревизии IBM даже при наличии 80386-совместимого центрального процессора, используют старый, 286-style способ переключения режимов, при котором происходит аппаратный сброс ЦПУ, а затем выполнение продолжается из BIOS, которому было перед этим сказано, с какого места выполнение необходимо продолжить. Майкрософтовский релиз OS/2 1.0 содержал ядро, использующее, когда возможно, новый (более быстрый) 386-only код переключения режимов аж с самой первой версии OS/2 SDK beta — апрель 1987 года.

А чтобы стало вообще интересно, ядро OS/2 также знаменито из-за использования недокументированной инструкции LOADALL, если оно запущенно на 80286. И всё равно IBM-версия OS/2 1.0 запускалась на 386 AT-клонах того времени! Как это возможно?

Ключевое слово — BIOS. BIOS машин на процессоре 80386 обязан поддерживать 286-style переключение режимов, и это стандартная функциональность. И код перключения режимов, написанный для 286 также работает и на системах с 80386.

Как на 80386 работает LOADALL же — менее очевидно. Разработчики BIOS вскоре осознали, что на 386-совместимых процессорах можно сравнительно просто эмулировать подмножество LOADALL, переключившись на время в реальный режим. Интелу потребовалось несколько лет, чтобы просто хотя бы догадаться о существовании такой техники в BIOS'ах, и потому подобное поведение едва ли можно назвать хорошо документированным, но оно работает на любой системе с 80386-совместимым процессором.

IBM OS/2 1.0 в VirtualBox 4.3

VirtualBox версии 4.3 наконец-то научилась запускать древние IBM-версии OS/2 1.0 и 1.1. Далее используется VirtualBox 4.3.8, хост — Mac OS X.

Создайте новую машину, тип гостевой операционки должен быть выставлен в “Other OS/2”. Оперативки поставьте восемь мегабайт (OS/2 1.0 сносит крышу от больших размеров). Виртуальный накопитель поставьте размером 30 мегабайт — эта версия OS/2 всё равно не умеет разделы больше 32 мегабайт (но OS/2 1.1 уже научили). Можно и больше, но определённо не следует ставить больше 500 мегабайт — возникнут проблемы с несовпадением геометрий.

Но это не всё. Чтобы заработало переключение между режимами центрального процессора, который, как я уже не один раз упомянул, производится через сброс процессора, необходимо твикнуть настройки виртуальной машины, чтобы VirtualBox не завершал её работу с ошибкой при трёхкратном фолте ЦПУ. Обычно, трёхкратная ошибка ЦП означает, что гостевая ОС уже не в состоянии сама разрешить проблему и продолжить работу, но для IBM OS/2 1.0/1.1 это — часть нормальной работы. Чтобы изменить настройки виртуальной машины, необходимо перейти в каталог VirtualBox и воспользоваться утилитой VBoxManage:

VBoxManage modifyvm <имя_виртуальной_машины> --triplefaultreset on

И ещё нужно пропатчить установочные дискеты.
Иначе Ось трапнется с ошибкой деления на ноль. Скрипт-патчер на Питоне.

Готово. Пробуйте. Если всё прошло нормально, перед вами вспорхнёт титульный экран установщика:
IBM Operating System/2 Installation. Version 1.00

Однако, есть вероятность, что у вас возникнет проблема с форматированием раздела в FAT, хотя разбивка должна пройти гладко.
FORMAT unsuccessful

Если не повезло, просто возьмите любую дискету с DOS'ом, загрузите её в виртуалке, и отформатируйте уже созданный раздел в FAT16. Потом снова грузитесь в установщик, и выбирайте использование существующего тома, не форматируйте его заново. Неочевидно, это баг в установщике OS/2 или в VirtualBox.

Затем всё должно идти гладко, и от вас будет требоваться разве что менять виртуальные дискетки в виртуальном дисководе по мере установки, да соглашаться с настройками по умолчанию, которые весьма разумны. После завершения процесса установки OS/2 запустит TSHELL — Text Shell — текстовую оболочку защищённого режима, выполняющую функцию запускалки программ и сессий, и переключалки между OS/2 и DOS сессиями, работающими в многозадачном режиме.
TSHELL Program Selector

И да, это действительно IBM OS/2 1.0:
IBM Operating System/2 Command Interpreter Version 1.00

Обратите внимание, что если у вас хост без поддержки аппаратого ускорения виртуализации (технологии VT-x или AMD-V), VirtualBox будет ругаться, что для запуска OS/2 таковая необходима, и откажется запускать виртуальную машину. Аппаратная виртуализация желательна, но OS/2 1.0 заработает и без неё (а вот для 2.0, Warp 3 и 4 она обязательна). Обойти ошибки можно поставив тип гостевой операционной системы либо DOS, либо Unknown.

Было бы интересно узнать, какие ещё современные виртуальные машины (нормальные, то есть которые спокойно запускают современные 32-битные и 64-битные операционные системы, а не специализированные эмуляторы 80286) способны запускать самые ранние релизы IBM OS/2 — 1.0 и 1.1. Известно, что Microsoft Virtual PC 2007, хоть и рекомендуется для запуска более современных версий OS/2, так как железо эмулируется весьма близко к реальному, не способен запускать IBM OS/2 1.0 и 1.1.


От переводчика:

Замечания по орфографии, пунктуации и грамматике, о багах перевода и неточностях (я зачастую “плаваю” в тех темах, на которые с лёгкостью говорит Michal Necasek; оттого мне, кстати, и интересно читать и переводить его статьи. Если мне что-то неочевидно (а мне было что-то неочевидно, особенно когда переводил предыдущую статью), я всегда гуглю и пытаюсь разобраться, задаю вопросы) прошу репортить в личку. Пожалуйста.

Сделал опрос о том, хотите ли вы видеть статьи про Ось и смежные темы. Сообществу есть, что сказать, правда. Большей проблемой оказывается то, что соответствующего хаба не предусмотрено, а для подачи заявки постов пока маловато; посмотрим, что можно с этим сделать — есть действительно довольно неплохие статьи.

Ответивших “да” я также прошу прокомментировать статью и указать, какого именно рода статьи вы хотите видеть, что вам интересно узнать.

P. S. Это комбинированный перевод двух статей, а столько в поле “источник” не лезет, поэтому указал там просто адрес сайта.

Автор: dbanet

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js