Содержание
В первую очередь, из-за игр. Игроки среднего (12-25 лет) возраста его не заметят. Но на одном возрастном фланге находятся старые небритые дядьки, готовые рыдать слезами умиления, запуская ParaTroopers или Accolade Grand Prix Rally, а на другом фланге расположились визжащие от восторга дети, с азартом играющие в Tower или UGH!. Благодаря DOSBox Линукс становится для этих двух категорий такой же полноценной игровой платформой, как Windows.
Если вас не интересует пространное описание прочих способов запуска 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-сессии из внешней ОС. Радует хотя бы наличие патча для исправления пресловутого «Run-time error 200».
Если современные процессоры некорректно имитируют старые, то современные VDM во многих ОС не всегда корректно имитируют прочее оборудование. Например, общеизвестно, что NTVDM в Windows NT и 2000 не поддерживает звуковую карту.
В Windows 95, 98 и ME используется VDM, основанная на MS-DOS 7.x, и использующая данные из DOS-части Windows, загружающейся до GUI. Это позволяет DOS-приложениям в VDM использовать почти любое оборудование как напрямую, так и через DOS-драйверы в CONFIG.SYS (которые Windows ME стала игнорировать ;-(( ). С одной стороны - гибкость, с другой - потенциальная нестабильность основной системы и опасность повреждений.
NTVDM в Windows NT и 2000 ограничивает доступ к аппаратуре, а из Windows XP изъят вовсе.
DOS-ядро, загружаемое в VDM Windows, является частью ОС. Такой подход имеет ряд достоинств. DOS-приложения имеют прозрачный доступ к файловой системе, включая кэширование, длинные имена, совместное использование файлов и т.д.
Программа для запуска DOS-приложений в Линуксе и FreeBSD называется DosEmu.
VMWare, легендарная система управления виртуальными компьютерами для Windows и Linux, помимо среды выполнения для запуска ОС Windows, Linux и 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, используя прерывание E6 (через него из DOS-сессии можно даже запускать команды Юникса). Иначе говоря, для простоты реализации DosEmu стремится эмулировать не аппаратный интерфейс устройств, а находящийся выше программный интерфейс соответствующих драйверов. Только SoundBlaster приходится имитировать на аппаратном уровне, потому что в DOS для него не был разработан унифицированный программный интерфейс.
В то же время DosEmu использует отдельные части настоящего BIOS'а и VideoBIOS'а, читаемых из ПЗУ. Как их присутствие в VDM сочетается с хелперами DosEmu, и как настоящий BIOS функционирует в виртуальной среде, мне пока разобраться не удалось.
Виртуальная среда VMWare выглядит более завершённо: эмулируется физический уровень (причём типы оборудования на настоящем компьютере и внутри сессии VMWare отличаются), загружается собственный BIOS от VMWare и т.д. Находясь внутри VMWare, понять, что работа происходит в виртуальном окружении, можно только по идентификаторам PCI-устройств.
Диском для DOS может быть как настоящий раздел на физическом диске, так и файл-образ диска или дискеты. Если работа с файлом-образом стандартной DOS-сессией Windows не поддерживается вовсе, то работа с настоящим разделом в Windows намного удобнее. DOSEmu либо захватывает его монопольно до конца работы, либо использует безнадёжно убогий интерфейс к функциям внешней ОС. В частности, в первом случае автономная DOS видит длинные имена файлов только со специальным драйвером, во втором - не видит никак.
DOS-сессия Win9x предоставляет приложениям DPMI версии 0.9, но, в отличие от DOSEmu (где так же доступен DPMI 0.9), не мешает им при необходимости использовать свой собственный DPMI-менеджер. Например, fMSX/DOS использует DOS-расширитель GO32, DPMI-менеджер которого поддерживает спецификацию DPMI 1.0. В итоге fMSX/DOS нормально запускается под Win95, но отказывается запускаться в DosEmu.
Эмуляция означает покомандную программную интерпретацию всего подлежащего выполнению кода, то есть программное моделирование центрального процессора и всего остального оборудования. Как правило, эмуляция широко применяется при разработке нового аппаратного обеспечения, а также при разработке ПО для небольших устройств, которые не приспособлены для загрузки отладчика. В последнем случае отлаживаемая программа запускается внутри эмулятора устройства, который сам, в свою очередь, является ядром отладчика.
Скорость работы эмулятора при разработке, как правило, не критична, потому что интерактивная отладка в основном состоит из диалога с пользователем. Что же касается пакетного тестирования, то эмулятор простого устройства и сам будет простым, то есть быстрым, а разработчики сложных устройств в состоянии позволить себе адекватную технику.
С играми дело обстоит иначе, потому что игра в эмуляторе должна выполняться с той же скоростью, что и на оригинальном компьютере, а оригинальный компьютер всего 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. Что это означает? Это означает, что наткнувшись в коде исполняемой программы на последовательность байтов с 16-ричными номерами CD 21, DOSBox не сохраняет в стеке значение регистра флагов и не передаёт управление на адрес, считанный из ячейки памяти с адресом 0000:0084, а немедленно вызывает соответствующую функцию Юникса. Например, если в регистр AH перед этим было записано число 40h, то DOSBox вызовет функцию write.
Таким образом, уменьшается количество эмулируемого кода, за счёт чего вырастает общая скорость работы. В дополнение к этому, увеличивается количество памяти, доступного DOS-приложению в VDM. Аналогичное решение, как уже говорилось, используется и в DOS-сессии Windows, но там программный код выполняется не эмулятором, а центральным процессором в V86-режиме.
Вывод 1: прирост быстродействия по сравнению с Bochs является для DOSBox принципиальным, потому что становится возможным использовать его для запуска старых игр с нормальной скоростью на распространённых в данное время ПК.
Вывод 2: эмуляция выполняемого кода по сравнению с V86-based VDM является для DOSBox принципиальной, потому что делает возможным запуск программ, с которыми современные процессоры перестали быть совместимыми даже в V86-режиме.
В документации сказано про PII-400 для эмуляции AT286-12, что, в общем, соответствует действительности. PII-300 выполняет «Wings of Fury» и «Dune» с чувствуемой, но терпимой задержкой. Сравните это с эмулятором «Ямахи» который требовал под DOS32 всего лишь 486DX-100 (или даже 486DX-66!).
Эмуляция более современных игр потребовала бы ещё более быстрого процессора, но сейчас вряд ли возможна в принципе, так как последние игры эпохи DOS в подавляющем большинстве использовали DPMI, а его поддержка в DOSBox пока только появляется.
То, что с точки зрения запускаемой в DOSBox программы является DOS'ом и BIOS'ом, на самом деле таковым не является. DOS имитируется неплохо, причём как базовая функциональность IO.SYS/MSDOS.SYS/COMMAND.COM, так и дополнительные расширения вроде драйвера мыши, MSCDEX, HIMEM, XMS и EMS. В BIOS'е имитируются в первую очередь int 10h (управление видеокартой) и int 16h (клавиатура), но не int 13h (физические диски). Это означает, что Volcov Commander, MultiEdit и Turbo Pascal в DOS-сессии запустить можно, а Norton Disk Editor - нет. Во всех случаях код-обработчик находится за пределами DOS-сессии, то есть выполняется не внутри созданной эмулятором среды, а как его собственная составная часть.
Из оборудования эмулируются видео SVGA и звук Sound Blaster. В версии 0.61 появилась эмуляция модема через TCP-сокет (чем-то подобным в DOS занимался TCPFossil), но представить себе маньяка, запускающего в DOS-эмуляторе BBS Maximus или T-Mail для доступа через Telnet, можно не без труда.
Состав предоставляемых эмулятором программных и аппаратных интерфейсов обуславливается следующим принципом: добиться поддержки как можно большего количества не имеющих замены DOS-приложений (в первую очередь, игр) на единицу трудозатрат.
Каталоги внешней файловой системы отображаются внутрь 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.
На моём сайте находится собранный для ALTLinux Master 2.2 RPM-пакет с DOSBox'ом, а также несколько игр.
Обнаруженные глюки:
Для установки игр написан небольшой сценарий dosbox-install, который скачивает архив, распаковывает его в каталог, находит исполняемый файл (возможны проблемы, если их в каталоге несколько, поэтому может потребоваться вторичный запуск сценария с явно указанным именем нужного исполняемого файла) и создаёт иконку для запуска в Главном меню.
Пример 1. Варианты запуска dosbox-install
# Скачать, распаковать, найти исполняемый файл, добавить в меню dosbox-install http://ilya-evseev.narod.ru/games/tower.zip # Распаковать, найти исполняемый файл, добавить в меню dosbox-install /tmp/ugh.zip # Найти исполняемый файл и добавить его запуск в Главное меню dosbox-install /mnt/windows/Games/DefenderOfTheCrown/ # Добавить исполняемый файл в Главное меню. # Для LodeRunner'a DOSBox на гигагерцевом Атлоне # требуется затормозить нажатиями Ctrl+F11 примерно в 10 раз. dosbox-install /mnt/windows/Games/lr/LR.COM # Явно указать исполняемый файл и добавить его запуск # из указанного каталога в Главное меню, который и будет диском C: # вместо каталога, в котором находится файл-аргумент ключа --executable. dosbox-install --executable SIMFILES/SIM.EXE /mnt/windows/Games/SimCity/ # То же самое dosbox-install --basedir /mnt/windows/Games/SimCity/ SIMFILES/SIM.EXE # То же самое, на диском C: будет каталог с SIM.EXE # Без ключа --project-title иконка в меню называлась бы "SIMFILES". dosbox-install --project SimCity /mnt/windows/Games/SimCity/SIMFILES/SIM.EXE # Удалить пункты из Главного меню и каталоги с диска (если создавались) dosbox-install --remove tower ugh para
В общем, начинать вспоминать юность можно практически без предисловий. Существует лишь небольшая вероятность, что для начала потребуется подправить значение cycles в файле /etc/dosbox/dosbox.conf*.
Каталоги в /usr/games/dosgames, куда распаковываются архивы, открыты для записи для группы [dosgamer]. Занесите себя в неё, прежде чем запускать игру, которая что-либо пишет в файлы. Например, LodeRunner не запустится, если не сможет открыть на запись LR.RES.
На этом пока всё!