Это небольшой патч для ядра 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:
English Version on sourceforge.net