Конфигурирование DosEMU

Для проверки программ, написанных на до сих пор популярных средах программирования Borland C/C++ 3.1 или Borland Pascal 7.0 можно использовать эмулятор (точнее, виртуальную машину) MS-DOS. Необходимые для этого шаги описаны ниже.

Скачивание

Текущая версия эмулятора 1.0.2 доступна по адресу ftp://ftp.dosemu.org/pub/dosemu/dosemu-1.0.2.tgz (локальная копия находится здесь).

Установка

Компиляция и установка - процесс достаточно сложный, здесь по шагам дано подробное описание.
  1. Разархивируйте DosEMU куда-нибудь в рабочий каталог командой
    tar xfz dosemu-1.0.2.tgz
    
    Далее каталог, в котором компилируется DosEMU будет называться ${SRCDIR}. Если архив разворачивался в каталоге /tmp, то значение ${SRCDIR} равно /tmp/dosemu-1.0.2.
  2. Выберите каталог, в который будет установлен эмулятор. В этом документе далее каталог будет называться ${PREFIX}. Например, целевым каталогом можно выбрать /usr/local/pkg/dosemu-1.0.2.
  3. Перейдите в тот каталог, куда Вы разархивировали DosEMU:
    cd ${SRCDIR}
    
  4. Сконфигурируйте DosEMU следующей командой:
    ./base-configure --prefix=${PREFIX} --enable-force-slang --enable-nosbemu --enable-nonet
    
  5. Скомпилируйте DosEMU командой make.
  6. Скомпилируйте вспомогательные программы DOS-режима с помощью команды make dosbin.
  7. Все последующие действия должны выполняться пользователем root. Создайте каталоги ${PREFIX}/bin, ${PREFIX}/etc, ${PREFIX}/lib, например, следующими командами:
    mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/lib
    
  8. Создайте в каталоге ${PREFIX}/etc файл dosemu.users. Установите обычным пользователям минимальные права. Образец конфигурационного файла можно посмотреть здесь.
  9. Создайте в каталоге ${PREFIX}/etc файл dosemu.conf. В этом файле отключите поддержку EMS- и XMS-памяти, видеорасширения и звук. Образец конфигурационного файла доступен здесь.
  10. Скопируйте исполняемые файлы в каталог исполняемых файлов следующей командой:
    cp -pd bin/* ${PREFIX}/bin
    
  11. Скопируйте файл global.conf из каталога etc каталога компиляции dosemu в каталог ${PREFIX}/lib.
  12. Создайте каталоги dosboot и mnt в каталоге ${PREFIX}/lib.
  13. Скопируйте файлы command.com, io.sys, msdos.sys из любой "живой" системы MS-DOS (например, Windows 98) в каталог ${PREFIX}/lib/dosboot.
  14. Скопируйте файл exitemu.com из каталога ${SRCDIR}/commands в каталог ${PREFIX}/lib/dosboot.
  15. Теперь Вы можете запустить эмулятор с помощью команды:
    ${PREFIX}/bin/dos -I 'video { none }'
    
    Система должна загрузиться и появится приглашение ко вводу. Вы можете попробовать набрать встроенные команды MS-DOS, такие как dir и пр. Для выхода из эмулятора используйте команду exitemu.
  16. Скопируйте программу dosexec.exe в каталог ${PREFIX}/lib/dosboot. dosexec.exe - это маленькая программа, которая перенаправляет стандартный поток ввода из файла ./input., стандартный поток вывода в файл ./output, стандартный поток ошибок в файл ./error. Затем она запускает программу ./program.exe, после этого код её завершения записывается в файл ./e. Исходный код этой программы доступен здесь, скомпилированный вариант (с помощью Borland C 3.1) доступен здесь.
  17. В каталоге ${PREFIX}/lib/dosboot создайте файл autoexec.bat примерно следующего содержания:
    d:
    c:\dosexec.exe
    c:\exitemu
    
    Такой файл можно скачать здесь.
  18. Убедитесь, что все файлы в каталоге dosboot и сам каталог имеют владельца root группу root и недоступны для модификации другими пользователями. При необходимости выполните команды
    chown -R root:root ${PREFIX}/lib/dosboot
    chmod -R o-w ${PREFIX}/lib/dosboot
    
  19. Теперь нужно создать виртуальный диск DOS, с которым сможет работать тестируемая программа. Чтобы не допустить неконтролируемого заполнения диска можно создать небольшую файловую систему, и затем примонтировать её с помощью loopback-интерфейса. Предположим, что размер виртуального диска равен 10МБ. Создать диск можно командами:
    dd if=/dev/zero of=${PREFIX}/lib/dosrun.img bs=1M count=10
    mke2fs -F ${PREFIX}/lib/dosrun.img
    
    Примонтировать созданный диск можно командой
    mount ${PREFIX}/lib/dosrun.img ${PREFIX}/lib/mnt -o loop
    
    Если такую конфигурацию предполагается использовать постоянно, можно добавить соответствующую строку в /etc/fstab.
  20. На примонтированном диске создайте каталог dosrun и сделайте на него символическую ссылку из lib. Поставьте владельцем каталога dosrun пользователя, под которым будет работать проверяющая система. Для этого используются следующие команды:
    mkdir ${PREFIX}/lib/mnt/dosrun
    ln -s mnt/dosrun ${PREFIX}/lib
    chown dosrun:dosrun ${PREFIX}/mnt/dosrun
    
    Здесь предполагается, что пользователь, под которым происходит проверка программ, называется dosrun.

Настройка ejudge

Чтобы настроить систему ejudge на проверку программ, скомпилированных для DOS, с использованием DosEMU, конфигурационный файл должен содержать примерно такие строки:

[tester]
abstract             ; может наследоваться другими тестерами
name = DOS_tester    ; название для наследования
no_redirect          ; не перенаправлять стандартные потоки
errorcode_file = e   ; файл, в который запишется код возврата
; программа для запуска эмулятора
start_cmd = ../extra/dosrun2
; переменная окружения, которая задаёт путь к dosemu
start_env = "DOSPATH=${PREFIX}/bin/dos"
; каталог, в котором будет находиться тестируемая программа
work_dir = ${PREFIX}/lib/dosrun

Тестер для задачи X может быть определён тогда следующим образом:

[tester]
super = DOS_tester
problem_name = X
check_cmd = check_x

Alexander Chernov