V86-64

Это небольшой патч для ядра linux, который позволяет выполнять старые программы, написанные для процессора 8086 на современных 64-битных процессорах AMD и Intel. Настоящая версия ядра Linux не поддерживает режим V86, поскольку в родном режиме этих процессоров (т.н. "длинный режим") он не поддерживается. Однако, эти процессоры по-прежнему сохраняют эту возможность, работая в режиме эмуляции x86. Данный патч позволяет использовать эту возможность, временно переключаясь в режим эмуляции.

На данный момент поддерживается только системный вызов vm86() для 32-битных linux-программ, вызов vm86_old() не поддерживается, поскольку практически не используется. Также добавлен интерфейс псевдоустройства для режима V86, который может быть доступен и из 64-битных программ.

На данный момент работает DOSEMU 1.4.0 / 1.2.2 (проверено с FreeDOS и PC-DOS 2000, Microsoft Windows 3.1 (DOSEMU 1.4.0)). Также работают приложения DPMI (игры типа DOOM, WarCraft и т.д).

Многопроцессорность/гипертрединг поддерживается, однако есть небольшая проблема при использовании области адресов от 0x00110000 до 0x00113FFF (эти 4 страницы используются для переклюяения в режим V86 и поддержания работоспособности программы), что может привести к нарушению сегментации в других программных потоках в программе-мониторе. В качестве решения можно предложить не использовать в программах-мониторах данную область адресов.

Данный патч является экспериментальным. Используйте его на свой страх и риск. Он должен быть тщательно протестирован. Если вы обнаружили ошибку при работе патченых ядер, пожалуйста, отправьте письмо на vladimir32_SPAMMERS_MUST_DIE_gmail.com (следует "_SPAMMERS_MUST_DIE_" заменить на собачку :). Пожалуйста, приложите к письму вывод команды dmesg.

Последнюю версию патча можно взять здесь.

Чтобы установить поддержку V86, необходимо пропатчить ядро.
Например так: cd /usr/src; bunzip2 </path/to/v86-64-YYYYMMDD-X.X.XX.patch.bz2 | patch -p0
Исходные тексты ядра, предполагается, лежат в подкаталоге "linux" в текущем каталоге.
Затем запустите "make menuconfig", выберите "Executable file formats / Emulations ---> Virtual 8086 mode support" и пересоберите ядро.
Новое ядро будет иметь поддержку системного вызова vm86() для 32-битных программ, и DOSEMU сможет выполнять программы 8086 непосредственно, без эмуляции.
Также станет возможной поддержка прямого доступа к портам ввода/вывода и перенаправления аппаратных прерываний в DOSEMU. ВНИМАНИЕ: Вам требуется 32-битная i386 версия DOSEMU, а не x86-64!

Также возможно собрать 64-битную версию DOSEMU, использующую интерфейс устройства /dev/v86, для начала пропатчив его при помощи патча v86dev, который находится на странице v86-64. На данный момент он тщательно не протестирован, и не может работать совместно с встроенным эмулятором CPU DOSEMU из-за используемых в нем длинных целых вместо обычных. Пропатченный DOSEMU следует собирать с опцией --disable-cpuemu.

Текущая версия патча для ядра 2.6.21.3. Другие, не слишком старые ядра также могут быть пропатчены без особых проблем.

Изменения в версии 20070531:

  • исправлен баг с мусором в сегментных регистрах;
  • добавлена поддержка расширения VME (спасибо Барту Олдеману);
  • начата поддержка интерфейса псевдоустройства;
  • использующий его патч для DOSEMU.

    English Version on sourceforge.net

    Hosted by uCoz