Назначение DOSBoxИльяЕвсеевilya_evseev AT mail DOT ru2004IEЗачем нужен эмулятор DOS?В первую очередь, из-за игр.
Игроки среднего (12-25 лет) возраста его не заметят.
Но на одном возрастном фланге находятся старые небритые дядьки,
готовые рыдать слезами умиления, запуская ParaTroopers
или Accolade Grand Prix Rally, а на другом фланге расположились
визжащие от восторга дети, с азартом играющие в Tower или UGH!.
Благодаря DOSBox Линукс становится для этих двух категорий
такой же полноценной игровой платформой, как Windows.
Если вас не интересует пространное описание прочих способов
запуска DOS-приложений, пропустите его и переходите
к заключительной части,
посвящённой непосредственно DOSBox.Способов запускать на современных ПК программы, написанные
для процессоров Intel 8086 и операционной системы DOS, существует два:
аппаратный, основанный на V86, и программная эмуляция.Первый способ: V86V86 (Virtual 86) - это специальный режим работы процессора 80386+.
Одновременно может быть запущено несколько нормальных и V86-процессов.
Основным и почти единственным типом V86-процесса является т.н.
VDM, виртуальная DOS-машина:
Когда процессор переключается в контекст V86-процесса,
внутри его памяти он использует старую схему сегментированной
нелинейной адресации, ограниченную 1 мегабайтом.
При создании в память VDM помещается нечто, более-менее совместимое
с DOS и BIOS (базовая система ввода-вывода)
с точки зрения программного интерфейса,
и запускается интерпретатор команд COMMAND.COM.
Средствами, которые процессор предоставляет для V86,
VDM перехватывает обращения DOS-приложений
к портам ввода-вывода (к модему, к мыши, к звуковой карте,
к видеокарте и т.д.), а также к адресному пространству
(в первую очередь, к видеобуферу).
Эти обращения обрабатываются не аппаратно, как это происходило бы
на настоящем ПК под управлением DOS, а программно,
драйверами внешней операционной системы.
Часть стандартной функциональности DOS
в VDM блокируется и/или оптимизируется.
Например, в DOS-сессии Windows приложения
не могут обращаться к физическим дискам через прерывание BIOS 13h.
В то же время, прерывание DOS 21h не вызывает 13h,
а немедленно передаёт управление соответствующим функциям WinAPI.
Из-за этого не только повышается скорость работы,
но и увеличивается количество памяти для DOS-приложений,
так как код прерывания 21h становится компактнее.
ДостоинстваПоскольку бОльшая часть работы выполняется аппаратно,
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
не поддерживает звуковую карту.
Реализации VDMВ 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.Отличительные особенности DOSBoxDOSBox основан на исходных текстах 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 не содержат имени запускаемой программы,
а также после завершения программы, если аргументы не содержат ключа
"". Shell имитирует стандартный COMMAND.COM
с некоторыми дополнениями, список которых выводится в DOS-сессии командами
help и intro.
С чего начать?На моём сайте
находится собранный для ALTLinux Master 2.2 RPM-пакет с DOSBox'ом,
а также несколько игр.Обнаруженные глюки:
под KDE игнорируются служебные клавиши Ctrl+Fn;слишком старые игры, написанные на Ассемблере
и работающие с периферией напрямую,
эмулируются либо криво (SpaceCommanders),
либо никак (ParaTroopers).Для установки игр написан небольшой сценарий dosbox-install,
который скачивает архив, распаковывает его в каталог, находит исполняемый файл
(возможны проблемы, если их в каталоге несколько, поэтому может потребоваться
вторичный запуск сценария с явно указанным именем нужного исполняемого файла)
и создаёт иконку для запуска в Главном меню.Варианты запуска 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
В общем, начинать вспоминать юность можно практически без предисловий.
Существует лишь небольшая вероятность, что для начала потребуется
подправить значение
в файле /etc/dosbox/dosbox.conf*.
Каталоги в /usr/games/dosgames,
куда распаковываются архивы, открыты для записи для группы
dosgamer. Занесите себя в неё,
прежде чем запускать распакованную игру,
которая что-либо пишет в файлы. Например, LodeRunner не запустится,
если не сможет открыть на запись LR.RES.
На этом пока всё!