Содержание
В первую очередь, из-за игр. Игроки среднего (12-25 лет) возраста его не заметят. Но на одном возрастном фланге находятся старые небритые дядьки, готовые рыдать слезами умиления, запуская ParaTroopers или Accolade Grand Prix Rally, а на другом фланге расположились визжащие от восторга дети, с азартом играющие в PacMan и UGH!. Благодаря DOSBox Линукс становится для этих двух категорий такой же полноценной игровой платформой, как Windows.
Рисунок 1. Accolade GrandPrix Rally. Самая первая игра, в которую мы играли на нашей первой IBM PC AT286/12/40/EGA/5'25 в 1989 году.
Если вас не интересует пространное описание прочих способов запуска DOS-приложений, пропустите его и переходите к заключительной части, посвящённой непосредственно DOSBox.
Способов запускать на современных ПК программы, написанные для процессоров Intel 8086 и операционной системы DOS, существует два: аппаратный, основанный на V86, и программная эмуляция.
V86 (Virtual 86) - это специальный режим работы процессора 80386+. Одновременно может быть запущено несколько нормальных и V86-процессов. Основным и почти единственным типом V86-процесса является т.н. VDM, виртуальная DOS-машина:
Поскольку бОльшая часть работы выполняется аппаратно, V86 (а) предоставляет максимальную скорость выполнения; (б) позволяет упростить и уменьшить программную часть, то есть VDM.
Чем дальше, тем меньше 80x86 в V86-режиме совместим с настоящим 8086. В первую очередь это обусловлено ростом быстродействия. Скорость выполнения инструкций в DOS-сессии зависит от тактовой частоты процессора, и в какой-то момент стала настолько высокой, что многие старые программы перестали работать. Штурмовик в Wings Of Fury не успевает набрать скорость при взлёте и сваливается с палубы авианосца. Cryo Dune на Пентиуме виснет в момент приёма послания от Падишаха-Императора. Программы, написанные на Паскале, выводят «Run-time error 200 in XXXX:XXXX» из-за того, что цикл определения длительности одной миллисекунды выполняется быстрее 65535 раз за 55 миллисекунд.
Существующие замедлялки и тормозилки для DOS предназначены для работы на живом компьютере. В виртуальной среде они, как правило, оказываются либо бессильны, либо (если дело происходит под Win9x, а тормозилка играет с микросхемой таймера) вредны. Так же не существует эффективных утилит для управления скоростью внутри аппаратной DOS-сессии из внешней ОС. Ни MoSlo, ни CpuKiller не решают проблему со 100%-ной надёжностью. Радует хотя бы наличие патча для исправления пресловутого «Run-time error 200».
Если современные процессоры некорректно имитируют старые, то современные VDM во многих ОС не всегда корректно имитируют прочее оборудование. Например, общеизвестно, что NTVDM в Windows NT и 2000 не поддерживает звуковую карту и видеорежимы SuperVGA.
В Windows 95, 98 и ME используется VDM, основанная на MS-DOS 7.x, и использующая данные из DOS-части Windows, загружающейся до GUI. Это позволяет DOS-приложениям в VDM использовать почти любое оборудование как напрямую, так и через DOS-драйверы в CONFIG.SYS (которые Windows ME стала игнорировать ;-(( ). С одной стороны - гибкость, с другой - потенциальная нестабильность основной системы и опасность повреждений.
NTVDM в Windows NT и 2000 ограничивает доступ к аппаратуре. В первую очередь, у DOS-приложений нет доступа к звуковой карте и видеорежимам SuperVGA. Хотя для вывода звука имеется сторонняя программа VDMSound, распространяемая на условиях GNU GPL, качество воспроизведения у неё довольно низкое; кроме того, появляется ощутимая задержка. Обе проблемы обусловлены тем, что VDMSound не предоставляет DOS-сессии доступ к ресурсам настоящей сетевой карты, а эмулирует программным образом стандартный Sound Blaster, то есть занимается трудоёмким переводом данных из аппаратного представления для SB в аргументы звуковых функций Windows.
В Windows XP поддержка DOS-приложений существенно улучшена: в NTVDM появились и звук, и расширенные видеорежимы. Впрочем, судя по некоторым отзывам в Интернете, звук по сравнению с VDMSound лучше не стал.
DOS-ядро, загружаемое в VDM Windows, является частью ОС. Такой подход имеет ряд достоинств. DOS-приложения имеют прозрачный доступ к файловой системе, включая кэширование, длинные имена, совместное использование файлов и т.д.
Программа для запуска DOS-приложений в Линуксе называется DosEmu.
VMWare, легендарная система управления виртуальными компьютерами для Windows и Linux, помимо среды выполнения для запуска ОС Windows, Linux, NetWare и FreeBSD, способна создавать виртуальную среду для запуска DOS.
DOS, загружаемая в DosEmu и VMWare, является почти произвольной системой, никак не зависящей от типа внешней ОС. Внутри DosEmu может быть запущена и MS-DOS, и PC DOS, и Novell DOS, и распространяемая вместе с DosEmu FreeDOS, и даже Windows 3.1.
Впрочем, драйверы для работы с ОЗУ (HIMEM/EMS/XMS/DPMI), CD-приводом (MSCDEX), COM-портом (Fossil), сетью (pktdrv) и т.д. в DosEmu настоятельно рекомендуется использовать не те, которые входят в состав DOS, или написаны для запуска в настоящей DOS, а т.н. helpers - утилиты, которые распространяются с самим DosEmu. Как и в DOS-сессии Windows, вместо обращения к физическому уровню хелперы вызывают код DosEmu, используя прерывание E6h (через него из DOS-сессии можно даже запускать команды Юникса). Иначе говоря, для более надёжной и быстрой работы DosEmu стремится эмулировать не только аппаратный интерфейс устройств (за исключением дисков), но и находящийся выше программный интерфейс соответствующих драйверов. Только SoundBlaster приходится имитировать исключительно на аппаратном уровне, потому что в DOS для него не был разработан унифицированный программный интерфейс.
В то же время DosEmu использует отдельные части настоящего BIOS'а и VideoBIOS'а, читаемых из ПЗУ. Как их присутствие в VDM сочетается с хелперами DosEmu, и как настоящий BIOS функционирует в виртуальной среде, мне пока разобраться не удалось.
Виртуальная среда VMWare выглядит более завершённо: эмулируется физический уровень (причём типы оборудования на настоящем компьютере и внутри сессии VMWare отличаются), загружается собственный BIOS от VMWare и т.д. Находясь внутри VMWare, понять, что работа происходит в виртуальном окружении, можно только по идентификаторам PCI- и IDE-устройств.
Диском для DOS может быть как настоящий раздел на физическом диске, так и файл-образ диска или дискеты. Если работа с файлом-образом стандартной DOS-сессией Windows не поддерживается вовсе, то работа с настоящим разделом в Windows по сравнению с DosEmu намного удобнее. DosEmu либо захватывает его монопольно до конца работы, либо использует безнадёжно убогий интерфейс к функциям внешней ОС. В частности, поддержка длинных имён файлов в стиле Windows'95 (через функцию 71h прерывания 21h) появилась в DosEmu только в сентябре 2003 года, то есть через 8 лет. В версии 1.1.4.3, вышедшей в 2002 году, по-прежнему отсутствовала возможность перекодировки русских букв в именах файлов, к которым DosEmu обращается через файловую систему Линукса.
DOS-сессия Win9x предоставляет приложениям DPMI версии 0.9, но, в отличие от DOSEmu (где так же доступен DPMI 0.9), никогда не мешала им при необходимости использовать свой собственный DPMI-менеджер. Например, fMSX/DOS использует DOS-расширитель GO32, DPMI-менеджер которого поддерживает спецификацию DPMI 1.0. В итоге fMSX/DOS нормально запускается под Win95, но - до некоторых пор - отказывался запускаться в DosEmu. Впрочем, сейчас эта ошибка в DosEmu исправлена; кроме того, имеется свободно распространяемый fMSX/Unix.
Эмуляция означает покомандную программную интерпретацию всего подлежащего выполнению кода, то есть программное моделирование центрального процессора и всего остального оборудования. Как правило, эмуляция широко применяется при разработке нового аппаратного обеспечения, а также при разработке ПО для небольших устройств, которые не приспособлены для загрузки отладчика. В последнем случае отлаживаемая программа запускается внутри эмулятора устройства, который сам, в свою очередь, является ядром отладчика.
Скорость работы эмулятора при разработке, как правило, не критична, потому что интерактивная отладка в основном состоит из диалога с пользователем. Что же касается пакетного тестирования, то эмулятор простого устройства и сам будет простым, то есть быстрым, а разработчики сложных устройств в состоянии позволить себе адекватную технику.
С играми дело обстоит иначе, потому что игра в эмуляторе должна выполняться с той же скоростью, что и на оригинальном компьютере, а оригинальный компьютер всего 10 лет назад считался очень даже не простым, а самым что ни есть современным.
По этой причине до недавних пор распространение имели только игровые эмуляторы 8-битных компьютеров наподобие Spectrum. Тем не менее, существует и успешно развивается программный эмулятор архитектур 8086/.../PentiumPro, который называется Bochs (произносится как «Бокс»). Кроме DOS, в нём также способны запускаться Linux, Minix, Windows 95 и Windows NT 4.
Bochs работает невероятно медленно. Если верить авторам, самый оптимизированный вариант на PII-400 показывает 1.5MIPS, то есть полтора миллиона однотактовых операций в секунду. Это втрое медленнее IBM PC XT c процессором 8088, тактовая частота которого составляла 4.77MHz.
Несмотря на медлительность, у программных эмуляторов есть несколько достоинств:
Даже DosEmu попытался обзавестись поддержкой эмулирования в дополнение к V86, но последние следы подобных усилий датированы ноябрём 2001 года. Детали смотрите в README.cpuemu.
DOSBox основан на исходных текстах Bochs, но эмулирует не IBM PC вообще, а IBM PC, на котором запущена DOS. Это означает, что, во-первых, вместо загрузки операционной системы откуда-либо DOSBox сам помещает в ОЗУ эмулируемого компьютера все необходимые данные и исполняемый код, в завершение чего выводит приглашение C:\>.
Во-вторых, тело прерывания int 21h является пустым и состоит из одной-единственной команды - команды возврата. Попав на адрес этой команды, DOSBox выходит из цикла эмуляции и напрямую вызывает соответствующую функцию Юникса/Windows.
Например, если в регистр AH перед этим было записано число 40h, то DOSBox не станет пошагово выполнять находящийся внутри DOS-сессии код ядра DOS, отвечающий за работу с диском (в DOSBox'е этого кода нет вообще, потому что ядро DOS, как только что говорилось, в нём пустое), а сразу вызовет внешнюю функцию write - с аргументами, основанными на значениях регистров BX, CX и DS:DX. После этого эмуляция продолжается с запомненной позиции.
Точно так же происходит обработка остальных стандартных прерываний и подпрограмм: они являются пустыми и обработка обращений к ним производится не внутри эмулируемой DOS-машины, а во внешней среде. Полный список таких вызовов можно получить, поискав в исходных текстах DOSBox вызовы функции CALLBACK_Setup.
Таким образом, уменьшается количество эмулируемого кода, за счёт чего вырастает общая скорость работы. В дополнение к этому, увеличивается количество памяти, доступного DOS-приложению в VDM. Аналогичное решение, как уже говорилось, используется и в DOS-сессии Windows, но там программный код DOS-приложений выполняется не эмулятором, а центральным процессором в V86-режиме.
Вывод 1: прирост быстродействия по сравнению с Bochs является для DOSBox принципиальным, потому что становится возможным использовать его для запуска старых игр с нормальной скоростью на распространённых в данное время ПК.
Вывод 2: эмуляция выполняемого кода по сравнению с V86-based VDM является для DOSBox принципиальной, потому что делает возможным запуск программ, с которыми современные процессоры перестали быть совместимыми даже в V86-режиме.
В документации сказано про PII-400 для эмуляции AT286-12, что, в общем, соответствует действительности. PII-300 выполняет «Wings of Fury» и «Dune» с чувствуемой, но терпимой задержкой. Сравните это с эмулятором «Ямахи», который в варианте под DPMI32 требовал всего лишь 486DX-100 (или даже 486DX-66!).
Выполнение более современных программ упирается как в скорость необходимого для эмуляции процессора, так и в усложнение самой эмуляции, потому что на закате эры DOS большинство приложений создавались для работы через DPMI. Однако теоретически подобная возможность в DOSBox уже есть. Уже упомянутый fMSX-DOS внутри DOSBox запустился(!), но выполняется на Athlon 1.2ГГц со скоростью улитки. К счастью, по сравнению со старыми играми, среди DPMI-приложений очень мало таких, которые не оставили бы после себя Windows- или Линукс-потомства, пригодного для запуска безо всяких эмуляторов.
То, что с точки зрения запускаемой в DOSBox программы выглядит DOS'ом и BIOS'ом, на самом деле таковым не является. DOS имитируется неплохо, причём как базовая функциональность IO.SYS/MSDOS.SYS/COMMAND.COM, так и дополнительные расширения вроде драйвера мыши, HIMEM, XMS, EMS (драйверов ОЗУ) и MSCDEX (драйвера CD-ROM). В BIOS'е имитируются в первую очередь int 10h (управление видеокартой) и int 16h (клавиатура), но не int 13h (физические диски). Это означает, что Volcov Commander, MultiEdit и Turbo Pascal в DOS-сессии запустить можно, а ChkDsk или UnDelete - нет. Во всех случаях код-обработчик находится за пределами DOS-сессии, то есть выполняется не внутри созданной эмулятором среды, а как его собственная составная часть.
Из оборудования на физическом уровне, помимо базового набора (клавиатура, таймер, спикер, COM-порты, программируемый контроллер аппаратных прерываний и микросхема DMA), эмулируются видеокарта SuperVGA и звуковая карта Sound Blaster.
В версии 0.61 появилась эмуляция модема через TCP-сокет (чем-то подобным занимаются rlFossil в DOS, Vmodem в OS/2, COM/IP в Windows и Modemu в Линуксе). С одной стороны, трудно представить себе маньяка, запускающего в наши дни под DOS-эмулятором BBS Maximus или fido-мейлер T-Mail. С другой стороны, так можно связывать игры, имевшие коллективный режим и позволявшие двум игрокам соединяться по модему.
Состав предоставляемых эмулятором программных и аппаратных интерфейсов обуславливается следующим принципом: добиться поддержки как можно большего количества не имеющих замены DOS-приложений (в первую очередь - игр!) на единицу трудозатрат.
Таблица 1. Сравнение DOS-сессий в DOSBox и других средах
Среда загрузки DOS-сессии | DOS | Драйверы устройств для DOS | Доступные устройства | Внешняя ОС и процессор |
---|---|---|---|---|
Windows | встроенная | встроенные (в Windows'95 - возможна загрузка внешних, если устройство не используется самой Windows) | физические (в Windows XP - эмулируемые VESA и SB), эмулируемые в окне видеорежимы CGA/EGA (во всех версиях для 386) | Windows на IA32 (Intel 386,486,...) |
VMWare | загружаемая | загружаемые | эмулируемые (звук, видео, диски, сетевые карты, COM/LPT-порты) и/или физические (диски, USB и COM/LPT-порты) | Linux или Windows на IA32 |
DosEmu | загружаемая | встроенные (загрузка внешних возможна, но не рекомендуется, так как съедает память и скорость) | эмулируемые и/или физические (диски, видео) | Linux на IA32 |
DOSBox | встроенная | встроенные | эмулируемые | Windows или Unix/Posix на достаточно быстром процессоре любой архитектуры |
Каталоги внешней файловой системы отображаются внутрь DOS-сессии в виде логических дисков. Специальным диском является диск Z:, на котором находятся утилиты самого DOSBox'a. Для подключения внешних каталогов к логическим дискам в командной строке DOS-сессии используется команда mount, например:
mount d /usr/games/dos dir d:\*.exe
Если прямо при запуске DOSBox в аргументах его командной строки указан путь к исполняемому файлу (BAT, COM, EXE) или каталогу, то указанный каталог или каталог, в котором расположена программа, становится в DOS-сессии диском C: автоматически:
dosbox /mnt/dosdrive/command.com dosbox /usr/games/dos/dune/dune.bat
Shell, или командный интерпретатор запускается в DOS-сессии, если аргументы командной строки DOSBox не содержат имени запускаемой программы, а также после завершения программы, если аргументы не содержат ключа "-c exit". Shell имитирует стандартный COMMAND.COM с некоторыми дополнениями, список которых выводится в DOS-сессии командами help и intro.
В последних версиях DOSBox появилась возможность выполнения программ, использующих защищённый 32-разрядный режим адресации процессоров 386. Поскольку DOS, драйверы и резидентные утилиты (TSR) расчитаны на т.н. реальный 16/20-разрядный режим 8086, согласно спецификации Microsoft их совместную с 32-разрядным приложением работу обеспечивает программа или библиотека, называемая менеджером DPMI (DOS Protected Mode Interface).
Как правило, DPMI-менеджер объединяется с загрузчиком исполняемых файлов и дополнительной библиотекой функций. Такое объединение обозначается термином DOS-расширитель. Формат исполняемых файлов и библиотеку принято делать частично совместимыми с одной из 32-разрядных ОС: Windows или (до появления Windows'95) IBM OS/2. Это не только упрощает перенос исходных текстов, но и при соблюдении некоторых условий позволяет иметь один и тот же исполняемый модуль для нескольких платформ. Практически каждый популярный компилятор для DOS распространялся со своим DOS-расширителем: Watcom с DOS4GW, Borland с RTM16 и RTM32, DJGPP - с GO32/CWSDPMI. Были весьма популярны и DOS-расширители фирмы PharLap. Встроенный DPMI-менеджер входит в состав Windows.
Спецификация DPMI предусматривает, что при запуске одного DPMI-приложения из другого второе приложение не пытается запустить собственный DPMI-менеджер, а пользуется уже запущенным. Это делает возможным такие вещи, как, скажем, запуск WarCraft или Borland C++ из-под Windows'95.
Сначала разработчики DOSBox пошли путём создания собственного DPMI-менеджера на тех же принципах, что и встроенная DOS с драйверами HIMEM, MSCDEX и проч. Версия 0.60 содержала заглушку для int 31h (стандартное программное прерывание DPMI), которая немедленно переводила всю обработку вызова за пределы эмулируемой среды.
В версии 0.61 встроенный DPMI-менеджер отключён из-за проблем с реализацией, зато улучшилась поддержка загружаемых внутри среды. С одной стороны, такое решение снижает скорость (больше кода выполняется в эмуляторе). С другой стороны, оно даёт возможность запускать DPMI-приложения прямо сейчас. Можно предположить, что встроенный DPMI-менеджер всё-таки будет доведён со временем до пригодного к использованию вида.
Важно, что независимо от его наличия или отсутствия DOSBox теперь умеет имитировать системы адресации процессоров Intel 80286 и 80386, которые существенно превосходят систему адресации 8086 по сложности и принципиально отличаются от неё поддержкой защищённого режима и виртуальной памяти.
На моём сайте находится несколько RPM-пакетов, собранных для ALT Linux Master 2.2. Главный пакет имеет следующие отличия от «фирменной» версии DOSBox 0.61:
Дополнительно предоставляются следующие пакеты:
В общем, начинать вспоминать юность можно практически без предисловий. Существует лишь небольшая вероятность, что для начала потребуется подправить значение cycles в файле /etc/dosbox/dosbox.conf*.
Каталоги в /usr/games/dosgames, куда распаковываются архивы, открыты для записи для группы [dosgamer]. Занесите себя в неё, прежде чем запускать распакованную игру, которая что-либо пишет в файлы. Например, LodeRunner не запустится, если не сможет открыть на запись LR.RES.
Напоследок - пару слов об обнаруженных глюках: