Решение задержки запуска программы DOS при запуске под Win 7x32

Вопрос (машинный перевод):

Моя программа DOS  терпит 8 секундную задержку под Windows 7 - каждый раз.
Запустив идентичную программу тысячи раз под DOS и Win-XP, она запускается мгновенно, буквально за секунду.


Диски почти пусты, загрузка процессора составляет менее 5 процентов, тонны доступной памяти. Изолированный воздушным зазором компьютер, нет сети. Никакой вирус.

CMD.exe запускается мгновенно.
Я понимаю, что он работает под эмулятором (виртуальная машина), но 8 секунд ?!?
Это похоже на необоснованную принудительную задержку (чтобы вывести нас из программ DOS?).

есть идеи, что это вызывает ?

любые идеи о том, как диагностировать это ?

есть идеи, как обойти эту искусственную задержку ?

Ответы:

Это связано с вашей видео картой. Держу пари, вы используете процессор Intel core со встроенным процессором Intel HD Graphics 4400.

задержка не 8 секунд на каждой системе. На некоторых системах он длиннее. У меня есть система, которая всегда имеет 5-секундную задержку.

Не каждая видеокарта поддерживает все видеорежимы. Например, некоторые видеокарты не поддерживают полноэкранный режим DOS. То есть текст имеет ширину 80 столбцов и высоту 25 строк. Только некоторые видеокарты поддержка программ DOS в windows.

по моему опыту, встроенный процессор Intel HD Graphics 4400 всегда вызывает задержку запуска 16-битных программ.

может быть, вы можете купить недорогую видеокарту и положить ее в свой компьютер и прекратить использовать встроенный VGA или DVI на материнской плате.

может быть, Intel может исправить это в драйвере для интегрированного 4400 чип видео.

до тех пор, вы будете испытывать задержку каждый раз вы запускаете 16-битную программу. Даже если вы уже находитесь в "черном" окне командной строки. Можно подумать, что драйвер уже вошел в режим поддержки программы DOS. Но вы испытаете задержку, когда вы введете имя 16-битной программы и нажмете enter.

Другие ответы подобные, не привожу, так как это оказалось правдой.

Далее - решение. После двух дней поиска в интернете был найден патч драйвера. приводится описание (машинный перевод) и инструкция по установке (деинсталляции). Все просто и безопасно. Проверено на картах  более высоких версий, чем в описании - РАБОТАЕТ!

Полноэкранный режим NTVDM и проблема запуска с VGA BIOS видеокарт Intel
----------
Краткая версия:
Патч, исправляющий сбой в BIOS некоторых встроенных графических
адаптеров Intel VGA (например, 4010U, 4340 i3 и 4200U i5, 4600 ...), которые вызывают
задержку запуска NTVDM на 5-10 секунд, а также вызывают медленный вывод текста
и другие операции INT10h (1 символ в секунду) в полноэкранном режиме.

Расширенная версия:
недавно я купил новую материнскую
плату с адаптером встроенной графики Intel 4600 . При запуске NTVDM на этой машине я обнаружил
задержку в 5-10 секунд при запуске NTVDM. Но это еще не все, все стало еще хуже при попытке
для переключения в полноэкранный текстовый режим. Вывод символов составлял 1 символ в секунду,
что, очевидно, является неприемлемой скоростью.
Итак, я исследовал Интернет и нашел 2 темы на форумах по продуктам
Microsoft и Intel:

Microsoft не позаботьтесь о том, чтобы вообще ответить на проблему, и на форумах Intel
кто-то из Intel просто ответил, что их платы не тестировались на
совместимость с 16 битами, и поэтому их не волнует проблема (во что я
действительно не могу поверить, как если бы это было правдой, вывод текста в консоли BIOS или Linux
также не будет работать должным образом).
Некоторые люди на форуме Intel сообщили, что теперь им пришлось заказывать кучу
новых видеокарт только из-за этой ошибки!
Полное незнание этой проблемы обеими компаниями очень расстроило меня,
и поэтому настала моя очередь исследовать проблему и исправить ее, как и много раз
до этого. 
Сначала мне нужно было выяснить, кого винить в этом беспорядке. Intel или Microsoft?
Интересно, что они оба виноваты определенным образом, но проблема с
NTVDM на удивление даже полезна для решения ошибки Intel Video BIOS.
Звучит немного запутанно? Вы можете прочитать больше в технических деталях ниже.
Ошибка Microsoft состоит в том, что не реализовал IN / OUT на 32-битных портах в NTVDM. Но
даже если бы это было реализовано, BIOS Intel не работал бы должным образом, это
даже вызвало бы больше проблем. Intel, с другой стороны, ожидает, что порты MMIO
будут доступны, что не является причиной в среде V86, такой как NTVDM.
Поэтому он запускается с таймаутом в 1 секунду для каждой операции, даже если
кажется , что он работает нормально без использования этих портов MMIO. Таким образом, их вина заключается в
том, чтобы каждый раз пытаться получить доступ к MMIO в течение 1 секунды, а не просто пропускать его, если он
не работает по неизвестным причинам.
На самом деле проблему можно решить, перескочив через процедуру проверки, которая
составляет всего 1 байт для исправления в Video BIOS.
К счастью, отображение NTVDM адресного пространства BIOS можно исправить в
память через DLL расширения NTVDM, так что вам не нужно перепрограммировать свой VGA
BIOS.

Системные требования
-------------------
Должен работать на любом ПК с ОС Windows с затронутой встроенной графической платой Intel и
NTVDM.

Как установить
--------------
Перейдите в каталог bin, щелкните правой кнопкой мыши файл intelvidfix.inf и выберите команду установить.

Как удалить
----------------
Откройте командную оболочку от имени администратора (щелкните правой кнопкой мыши командную строку в
меню Пуск / Программы / Стандартные, Запуск от имени администратора).

Перейдите в каталог bin, а затем:
Код:
1 RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 intelvidfix.inf
Технические детали
-----------------
Как я узнал, что здесь происходит?
Очевидно, это была проблема с Video BIOS, поскольку настоящий Video BIOS
запускается только тогда, когда приложение DOS работает в полноэкранном режиме, в
противном случае это просто BOP для эмуляции VGA NTVDM для оконного
режима. Итак, мы знаем, что INT 10h отвечает за выполнение видео ввода-вывода.
Поэтому я проследил простой вызов INT10h для вывода
символа с помощью превосходной утилиты DEBUGX.COM из проекта FreeDOS,
которая, в отличие от классического DEBUG.EXE от Microsoft, также поддерживает 32-битный код, аналогичный используемому в
последнее время в Intel VGA BIOS и во многих новых BIOS. 
 
Итак, прежде всего, что это за порт Дюбуа в F000?
Согласно техническому описанию семейства процессоров Intel Core 2-го поколения для настольных ПК,
Vol. 2 - Раздел: Регистры ввода-вывода устройства 2:

F000 - это регистр адреса MMIO
F004 - регистр данных MMIO

Они специфичны для платы Intel и недоступны для нашей
эмуляции NTVDM и поэтому не доступны, всегда возвращая FF при чтении .
Теперь первое, что приходит в голову, когда мы просто наблюдаем цикл, повторяющийся
1000 раз, - это почему VGA BIOS предполагает наличие этих нестандартных
портов ввода-вывода и вызывает цикл на 1000 итераций при каждой
попытке чтения . Это выглядит не очень умно и является причиной огромной задержки.
Но затем мы можем видеть, что на самом деле выше проверено, есть ли эти порты,
а если нет (так что, если EAX равен FFFFFFFF), они не используются, и код должен
перескакивать. Теоретически это должно быть так, за исключением того, что вход IN в
регистр EAX просто заполняет нижний регистр AX и оставляет старшее слово
регистра нетронутым. Это заставляет нас думать, что это проблема NTVDM,
а не ошибка BIOS.
При копании в NTVDM можно увидеть, что они просто не реализовали
IN / OUT для 32-битных регистров, а только 8 и 16 бит. Я даже сделал патч для
NTVDM для поддержки 32-битного IN / OUT (да, для этого его можно пропатчить
, если вы заинтересованы в патче, просто свяжитесь со мной), но тогда я
понял, что от этого дела обстоят еще хуже. Почему?
Из-за назначения Jump, если проверка FFFFFFFF прошла успешно:

Код:
1 C000:28FE 0F848E00          JZ      2990
Это переходит в КОНЕЦ процедуры прерывания, поэтому в этом случае он вообще ничего не
делает!
После тестирования приложения в полноэкранном режиме я смог увидеть, что в
настоящее время оно выполняет свои операции очень медленно, но делает их хорошо. Таким образом,
правильный способ решить эту проблему - не научить NTVDM обрабатывать 32-
битный доступ к портам IN / OUT, а вместо этого просто JMP вне цикла с 1000
итерациями и tadaa - задержка запуска NTVDM исчезла, и полноэкранные
операции работают нормально!
Так что просто меняем:
Код:
1 C000:344B 750A              JNZ     3457
к
Код:
1 C000:344B EB0A              JMP     3457

 

Для этого создается небольшая библиотека DLL, которая загружается как
VDD (драйвер виртуального устройства) для NTVDM. Память для VGA BIOS отображается по
адресу C0000 в адресном пространстве процесса и отображается как R / W, поэтому DLL может получить доступ к
памяти там и просто изменить 75 на EB и готово.
Так что я не знаю, совпадает ли расположение адресов всех Intel VGA BIOS с
моим, я также имплементировал сканирование сопоставления с образцом, которое ищет в области
VGA BIOS код asm-кода в этом месте и пытается исправить
его, если образец найден. Я не знаю каждый Intel VGA BIOS, у меня был только тот, что был
с моей карты, но для этого он работал нормально.

Собственно, сам патч - intelvidfix.zip